menu-item.component.mjs 19 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { ChangeDetectionStrategy, Component, ContentChildren, Input } from '@angular/core';
  2. import { RouterLink } from '@angular/router';
  3. import { IconComponent } from '../icon/icon.component';
  4. import { ButtonComponent } from '../button/button.component';
  5. import { OverlayDirective } from '../../../directives/overlay.directive';
  6. import { MenuComponent } from '../../molecules/menu/menu.component';
  7. import { BehaviorSubject } from 'rxjs';
  8. import { AsyncPipe, NgClass } from '@angular/common';
  9. import * as i0 from "@angular/core";
  10. export class MenuItemComponent {
  11. constructor() {
  12. this.text = '';
  13. this.link = '';
  14. this.type = 'internal';
  15. this.size = 'base';
  16. this.icon = '';
  17. this.iconSize = 'base';
  18. this.iconAlone = false;
  19. this.iconDirection = 'horizontal';
  20. this.hasSubmenu = false;
  21. this.submenuPosition = 'horizontal';
  22. this.isActive = false;
  23. this.isOpen = new BehaviorSubject(false);
  24. }
  25. static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: MenuItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
  26. static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", type: MenuItemComponent, isStandalone: true, selector: "ct-menu-item", inputs: { text: "text", link: "link", type: "type", size: "size", icon: "icon", iconSize: "iconSize", iconAlone: "iconAlone", iconDirection: "iconDirection", hasSubmenu: "hasSubmenu", submenuPosition: "submenuPosition", isActive: "isActive" }, queries: [{ propertyName: "menus", predicate: MenuComponent }], ngImport: i0, template: "@if (menus.length > 0) {\n <a\n [ctOverlay]=\"dropDown\"\n [ctOverlayPosition]=\"submenuPosition\"\n (closed)=\"isOpen.next(false)\"\n (opened)=\"isOpen.next(true)\"\n [ngClass]=\"{\n 'bg-surface-variant dark:bg-surface-variant-dark': isOpen | async\n }\"\n class=\"block cursor-pointer rounded-md px-4 py-2 font-medium text-on-surface hover:bg-primary-variant dark:text-on-surface-dark hover:dark:bg-primary-dark\">\n <span\n class=\"flex items-center gap-3\"\n [class.flex-row]=\"iconDirection === 'horizontal'\"\n [class.flex-col]=\"iconDirection === 'vertical'\">\n @if (icon) {\n <ct-icon [icon]=\"icon\" [size]=\"iconSize\" />\n }\n @if (text && !iconAlone) {\n <span\n [class.text-sm]=\"size === 'xs' || size === 'sm'\"\n [class.text-base]=\"size === 'base' || size === 'lg'\"\n [class.text-xl]=\"size === 'xl'\"\n >{{ text }}</span\n >\n }\n @if (!iconAlone) {\n @if (isOpen | async) {\n <ct-icon [icon]=\"submenuPosition === 'vertical' ? 'chevron-up' : 'chevron-left'\" variant=\"blank\" />\n } @else {\n <ct-icon [icon]=\"submenuPosition === 'vertical' ? 'chevron-down' : 'chevron-right'\" variant=\"blank\" />\n }\n }\n </span>\n </a>\n <ng-template #dropDown><ng-content></ng-content></ng-template>\n} @else {\n @if (link) {\n <a\n class=\"block cursor-pointer rounded-md px-4 py-2 font-medium text-on-surface hover:bg-surface-variant dark:text-on-surface-dark dark:hover:bg-surface-variant-dark\"\n [routerLink]=\"link\"\n [ngClass]=\"{\n 'bg-surface-variant dark:bg-surface-variant-dark': isActive\n }\">\n <ng-content select=\"[hint]\" />\n <span\n class=\"flex items-center gap-3\"\n [class.flex-row]=\"iconDirection === 'horizontal'\"\n [class.flex-col]=\"iconDirection === 'vertical'\">\n @if (icon) {\n <ct-icon [icon]=\"icon\" variant=\"solid\" [size]=\"iconSize\" />\n }\n @if (text && !iconAlone) {\n <span\n [class.text-sm]=\"size === 'xs' || size === 'sm'\"\n [class.text-base]=\"size === 'base' || size === 'lg'\"\n [class.text-xl]=\"size === 'xl'\"\n >{{ text }}</span\n >\n }\n </span>\n </a>\n } @else {\n <span\n class=\"block cursor-pointer rounded-md px-4 py-2 font-medium text-on-surface hover:bg-surface-variant dark:text-on-surface-dark dark:hover:bg-surface-variant-dark\"\n [ngClass]=\"{\n 'bg-surface-variant dark:bg-surface-variant-dark': isActive\n }\">\n <ng-content select=\"[hint]\" />\n <span\n class=\"flex items-center gap-3\"\n [class.flex-row]=\"iconDirection === 'horizontal'\"\n [class.flex-col]=\"iconDirection === 'vertical'\">\n @if (icon) {\n <ct-icon [icon]=\"icon\" variant=\"solid\" [size]=\"iconSize\" />\n }\n @if (text && !iconAlone) {\n <span\n [class.text-sm]=\"size === 'xs' || size === 'sm'\"\n [class.text-base]=\"size === 'base' || size === 'lg'\"\n [class.text-xl]=\"size === 'xl'\"\n >{{ text }}</span\n >\n }\n </span>\n </span>\n }\n}\n", dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: IconComponent, selector: "ct-icon", inputs: ["icon", "fill", "strokeWidth", "strokeColor", "size", "variant"] }, { kind: "directive", type: OverlayDirective, selector: "[ctOverlay]", inputs: ["ctOverlay", "ctOverlayPosition", "ctOverlayCloseOnClick"], outputs: ["opened", "closed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
  27. }
  28. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: MenuItemComponent, decorators: [{
  29. type: Component,
  30. args: [{ selector: 'ct-menu-item', standalone: true, imports: [RouterLink, NgClass, AsyncPipe, IconComponent, ButtonComponent, OverlayDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (menus.length > 0) {\n <a\n [ctOverlay]=\"dropDown\"\n [ctOverlayPosition]=\"submenuPosition\"\n (closed)=\"isOpen.next(false)\"\n (opened)=\"isOpen.next(true)\"\n [ngClass]=\"{\n 'bg-surface-variant dark:bg-surface-variant-dark': isOpen | async\n }\"\n class=\"block cursor-pointer rounded-md px-4 py-2 font-medium text-on-surface hover:bg-primary-variant dark:text-on-surface-dark hover:dark:bg-primary-dark\">\n <span\n class=\"flex items-center gap-3\"\n [class.flex-row]=\"iconDirection === 'horizontal'\"\n [class.flex-col]=\"iconDirection === 'vertical'\">\n @if (icon) {\n <ct-icon [icon]=\"icon\" [size]=\"iconSize\" />\n }\n @if (text && !iconAlone) {\n <span\n [class.text-sm]=\"size === 'xs' || size === 'sm'\"\n [class.text-base]=\"size === 'base' || size === 'lg'\"\n [class.text-xl]=\"size === 'xl'\"\n >{{ text }}</span\n >\n }\n @if (!iconAlone) {\n @if (isOpen | async) {\n <ct-icon [icon]=\"submenuPosition === 'vertical' ? 'chevron-up' : 'chevron-left'\" variant=\"blank\" />\n } @else {\n <ct-icon [icon]=\"submenuPosition === 'vertical' ? 'chevron-down' : 'chevron-right'\" variant=\"blank\" />\n }\n }\n </span>\n </a>\n <ng-template #dropDown><ng-content></ng-content></ng-template>\n} @else {\n @if (link) {\n <a\n class=\"block cursor-pointer rounded-md px-4 py-2 font-medium text-on-surface hover:bg-surface-variant dark:text-on-surface-dark dark:hover:bg-surface-variant-dark\"\n [routerLink]=\"link\"\n [ngClass]=\"{\n 'bg-surface-variant dark:bg-surface-variant-dark': isActive\n }\">\n <ng-content select=\"[hint]\" />\n <span\n class=\"flex items-center gap-3\"\n [class.flex-row]=\"iconDirection === 'horizontal'\"\n [class.flex-col]=\"iconDirection === 'vertical'\">\n @if (icon) {\n <ct-icon [icon]=\"icon\" variant=\"solid\" [size]=\"iconSize\" />\n }\n @if (text && !iconAlone) {\n <span\n [class.text-sm]=\"size === 'xs' || size === 'sm'\"\n [class.text-base]=\"size === 'base' || size === 'lg'\"\n [class.text-xl]=\"size === 'xl'\"\n >{{ text }}</span\n >\n }\n </span>\n </a>\n } @else {\n <span\n class=\"block cursor-pointer rounded-md px-4 py-2 font-medium text-on-surface hover:bg-surface-variant dark:text-on-surface-dark dark:hover:bg-surface-variant-dark\"\n [ngClass]=\"{\n 'bg-surface-variant dark:bg-surface-variant-dark': isActive\n }\">\n <ng-content select=\"[hint]\" />\n <span\n class=\"flex items-center gap-3\"\n [class.flex-row]=\"iconDirection === 'horizontal'\"\n [class.flex-col]=\"iconDirection === 'vertical'\">\n @if (icon) {\n <ct-icon [icon]=\"icon\" variant=\"solid\" [size]=\"iconSize\" />\n }\n @if (text && !iconAlone) {\n <span\n [class.text-sm]=\"size === 'xs' || size === 'sm'\"\n [class.text-base]=\"size === 'base' || size === 'lg'\"\n [class.text-xl]=\"size === 'xl'\"\n >{{ text }}</span\n >\n }\n </span>\n </span>\n }\n}\n" }]
  31. }], propDecorators: { text: [{
  32. type: Input
  33. }], link: [{
  34. type: Input
  35. }], type: [{
  36. type: Input,
  37. args: [{ required: true }]
  38. }], size: [{
  39. type: Input
  40. }], icon: [{
  41. type: Input
  42. }], iconSize: [{
  43. type: Input
  44. }], iconAlone: [{
  45. type: Input
  46. }], iconDirection: [{
  47. type: Input
  48. }], hasSubmenu: [{
  49. type: Input
  50. }], submenuPosition: [{
  51. type: Input
  52. }], isActive: [{
  53. type: Input
  54. }], menus: [{
  55. type: ContentChildren,
  56. args: [MenuComponent]
  57. }] } });
  58. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NpcmNsZXRvbmUvc3JjL2xpYi9jb21wb25lbnRzL2F0b21zL21lbnUtaXRlbS9tZW51LWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2lyY2xldG9uZS9zcmMvbGliL2NvbXBvbmVudHMvYXRvbXMvbWVudS1pdGVtL21lbnUtaXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDdEcsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFekUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFTckQsTUFBTSxPQUFPLGlCQUFpQjtJQVA5QjtRQVFXLFNBQUksR0FBRyxFQUFFLENBQUM7UUFDVixTQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1EsU0FBSSxHQUFxQyxVQUFVLENBQUM7UUFDdEUsU0FBSSxHQUFrQixNQUFNLENBQUM7UUFDN0IsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUNWLGFBQVEsR0FBa0IsTUFBTSxDQUFDO1FBQ2pDLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsa0JBQWEsR0FBeUIsWUFBWSxDQUFDO1FBQ25ELGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsb0JBQWUsR0FBeUIsWUFBWSxDQUFDO1FBQ3JELGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDMUIsV0FBTSxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0tBRzlDOzhHQWZZLGlCQUFpQjtrR0FBakIsaUJBQWlCLGtWQWNYLGFBQWEsNkJDaENoQyxxdkdBdUZBLDRDRHpFWSxVQUFVLG9PQUFFLE9BQU8sK0VBQUUsU0FBUyw4Q0FBRSxhQUFhLCtIQUFtQixnQkFBZ0I7OzJGQUkvRSxpQkFBaUI7a0JBUDdCLFNBQVM7K0JBQ0UsY0FBYyxjQUNaLElBQUksV0FDUCxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLENBQUMsbUJBRTFFLHVCQUF1QixDQUFDLE1BQU07OEJBR3RDLElBQUk7c0JBQVosS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ3FCLElBQUk7c0JBQTlCLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUNoQixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUcwQixLQUFLO3NCQUFwQyxlQUFlO3VCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGRyZW4sIElucHV0LCBRdWVyeUxpc3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlckxpbmsgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQ29tcG9uZW50U2l6ZSB9IGZyb20gJy4uLy4uLy4uL21vZGVsL2NvbXBvbmVudHMvY29tcG9uZW50LXNpemUudHlwZSc7XG5pbXBvcnQgeyBJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vaWNvbi9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlcy9vdmVybGF5LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDb21wb25lbnREaXNwb3NpdGlvbiB9IGZyb20gJy4uLy4uLy4uL21vZGVsL2NvbXBvbmVudHMvY29tcG9uZW50LWRpc3Bvc2l0aW9uLmVudW0nO1xuaW1wb3J0IHsgTWVudUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9tZW51L21lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3QtbWVudS1pdGVtJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1JvdXRlckxpbmssIE5nQ2xhc3MsIEFzeW5jUGlwZSwgSWNvbkNvbXBvbmVudCwgQnV0dG9uQ29tcG9uZW50LCBPdmVybGF5RGlyZWN0aXZlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL21lbnUtaXRlbS5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBNZW51SXRlbUNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIHRleHQgPSAnJztcbiAgQElucHV0KCkgbGluayA9ICcnO1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSB0eXBlOiBzdHJpbmcgfCAnaW50ZXJuYWwnIHwgJ2V4dGVybmFsJyA9ICdpbnRlcm5hbCc7XG4gIEBJbnB1dCgpIHNpemU6IENvbXBvbmVudFNpemUgPSAnYmFzZSc7XG4gIEBJbnB1dCgpIGljb24gPSAnJztcbiAgQElucHV0KCkgaWNvblNpemU6IENvbXBvbmVudFNpemUgPSAnYmFzZSc7XG4gIEBJbnB1dCgpIGljb25BbG9uZSA9IGZhbHNlO1xuICBASW5wdXQoKSBpY29uRGlyZWN0aW9uOiBDb21wb25lbnREaXNwb3NpdGlvbiA9ICdob3Jpem9udGFsJztcbiAgQElucHV0KCkgaGFzU3VibWVudSA9IGZhbHNlO1xuICBASW5wdXQoKSBzdWJtZW51UG9zaXRpb246IENvbXBvbmVudERpc3Bvc2l0aW9uID0gJ2hvcml6b250YWwnO1xuICBASW5wdXQoKSBpc0FjdGl2ZSA9IGZhbHNlO1xuICBpc09wZW4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBAQ29udGVudENoaWxkcmVuKE1lbnVDb21wb25lbnQpIG1lbnVzITogUXVlcnlMaXN0PE1lbnVDb21wb25lbnQ+O1xufVxuIiwiQGlmIChtZW51cy5sZW5ndGggPiAwKSB7XG4gIDxhXG4gICAgW2N0T3ZlcmxheV09XCJkcm9wRG93blwiXG4gICAgW2N0T3ZlcmxheVBvc2l0aW9uXT1cInN1Ym1lbnVQb3NpdGlvblwiXG4gICAgKGNsb3NlZCk9XCJpc09wZW4ubmV4dChmYWxzZSlcIlxuICAgIChvcGVuZWQpPVwiaXNPcGVuLm5leHQodHJ1ZSlcIlxuICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICdiZy1zdXJmYWNlLXZhcmlhbnQgZGFyazpiZy1zdXJmYWNlLXZhcmlhbnQtZGFyayc6IGlzT3BlbiB8IGFzeW5jXG4gICAgfVwiXG4gICAgY2xhc3M9XCJibG9jayBjdXJzb3ItcG9pbnRlciByb3VuZGVkLW1kIHB4LTQgcHktMiBmb250LW1lZGl1bSB0ZXh0LW9uLXN1cmZhY2UgaG92ZXI6YmctcHJpbWFyeS12YXJpYW50IGRhcms6dGV4dC1vbi1zdXJmYWNlLWRhcmsgaG92ZXI6ZGFyazpiZy1wcmltYXJ5LWRhcmtcIj5cbiAgICA8c3BhblxuICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtM1wiXG4gICAgICBbY2xhc3MuZmxleC1yb3ddPVwiaWNvbkRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnXCJcbiAgICAgIFtjbGFzcy5mbGV4LWNvbF09XCJpY29uRGlyZWN0aW9uID09PSAndmVydGljYWwnXCI+XG4gICAgICBAaWYgKGljb24pIHtcbiAgICAgICAgPGN0LWljb24gW2ljb25dPVwiaWNvblwiIFtzaXplXT1cImljb25TaXplXCIgLz5cbiAgICAgIH1cbiAgICAgIEBpZiAodGV4dCAmJiAhaWNvbkFsb25lKSB7XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgW2NsYXNzLnRleHQtc21dPVwic2l6ZSA9PT0gJ3hzJyB8fCBzaXplID09PSAnc20nXCJcbiAgICAgICAgICBbY2xhc3MudGV4dC1iYXNlXT1cInNpemUgPT09ICdiYXNlJyB8fCBzaXplID09PSAnbGcnXCJcbiAgICAgICAgICBbY2xhc3MudGV4dC14bF09XCJzaXplID09PSAneGwnXCJcbiAgICAgICAgICA+e3sgdGV4dCB9fTwvc3BhblxuICAgICAgICA+XG4gICAgICB9XG4gICAgICBAaWYgKCFpY29uQWxvbmUpIHtcbiAgICAgICAgQGlmIChpc09wZW4gfCBhc3luYykge1xuICAgICAgICAgIDxjdC1pY29uIFtpY29uXT1cInN1Ym1lbnVQb3NpdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/ICdjaGV2cm9uLXVwJyA6ICdjaGV2cm9uLWxlZnQnXCIgdmFyaWFudD1cImJsYW5rXCIgLz5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGN0LWljb24gW2ljb25dPVwic3VibWVudVBvc2l0aW9uID09PSAndmVydGljYWwnID8gJ2NoZXZyb24tZG93bicgOiAnY2hldnJvbi1yaWdodCdcIiB2YXJpYW50PVwiYmxhbmtcIiAvPlxuICAgICAgICB9XG4gICAgICB9XG4gICAgPC9zcGFuPlxuICA8L2E+XG4gIDxuZy10ZW1wbGF0ZSAjZHJvcERvd24+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PjwvbmctdGVtcGxhdGU+XG59IEBlbHNlIHtcbiAgQGlmIChsaW5rKSB7XG4gICAgPGFcbiAgICAgIGNsYXNzPVwiYmxvY2sgY3Vyc29yLXBvaW50ZXIgcm91bmRlZC1tZCBweC00IHB5LTIgZm9udC1tZWRpdW0gdGV4dC1vbi1zdXJmYWNlIGhvdmVyOmJnLXN1cmZhY2UtdmFyaWFudCBkYXJrOnRleHQtb24tc3VyZmFjZS1kYXJrIGRhcms6aG92ZXI6Ymctc3VyZmFjZS12YXJpYW50LWRhcmtcIlxuICAgICAgW3JvdXRlckxpbmtdPVwibGlua1wiXG4gICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICdiZy1zdXJmYWNlLXZhcmlhbnQgZGFyazpiZy1zdXJmYWNlLXZhcmlhbnQtZGFyayc6IGlzQWN0aXZlXG4gICAgICB9XCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbaGludF1cIiAvPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtM1wiXG4gICAgICAgIFtjbGFzcy5mbGV4LXJvd109XCJpY29uRGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCdcIlxuICAgICAgICBbY2xhc3MuZmxleC1jb2xdPVwiaWNvbkRpcmVjdGlvbiA9PT0gJ3ZlcnRpY2FsJ1wiPlxuICAgICAgICBAaWYgKGljb24pIHtcbiAgICAgICAgICA8Y3QtaWNvbiBbaWNvbl09XCJpY29uXCIgdmFyaWFudD1cInNvbGlkXCIgW3NpemVdPVwiaWNvblNpemVcIiAvPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAodGV4dCAmJiAhaWNvbkFsb25lKSB7XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIFtjbGFzcy50ZXh0LXNtXT1cInNpemUgPT09ICd4cycgfHwgc2l6ZSA9PT0gJ3NtJ1wiXG4gICAgICAgICAgICBbY2xhc3MudGV4dC1iYXNlXT1cInNpemUgPT09ICdiYXNlJyB8fCBzaXplID09PSAnbGcnXCJcbiAgICAgICAgICAgIFtjbGFzcy50ZXh0LXhsXT1cInNpemUgPT09ICd4bCdcIlxuICAgICAgICAgICAgPnt7IHRleHQgfX08L3NwYW5cbiAgICAgICAgICA+XG4gICAgICAgIH1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2E+XG4gIH0gQGVsc2Uge1xuICAgIDxzcGFuXG4gICAgICBjbGFzcz1cImJsb2NrIGN1cnNvci1wb2ludGVyIHJvdW5kZWQtbWQgcHgtNCBweS0yIGZvbnQtbWVkaXVtIHRleHQtb24tc3VyZmFjZSBob3ZlcjpiZy1zdXJmYWNlLXZhcmlhbnQgZGFyazp0ZXh0LW9uLXN1cmZhY2UtZGFyayBkYXJrOmhvdmVyOmJnLXN1cmZhY2UtdmFyaWFudC1kYXJrXCJcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgJ2JnLXN1cmZhY2UtdmFyaWFudCBkYXJrOmJnLXN1cmZhY2UtdmFyaWFudC1kYXJrJzogaXNBY3RpdmVcbiAgICAgIH1cIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltoaW50XVwiIC8+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0zXCJcbiAgICAgICAgW2NsYXNzLmZsZXgtcm93XT1cImljb25EaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJ1wiXG4gICAgICAgIFtjbGFzcy5mbGV4LWNvbF09XCJpY29uRGlyZWN0aW9uID09PSAndmVydGljYWwnXCI+XG4gICAgICAgIEBpZiAoaWNvbikge1xuICAgICAgICAgIDxjdC1pY29uIFtpY29uXT1cImljb25cIiB2YXJpYW50PVwic29saWRcIiBbc2l6ZV09XCJpY29uU2l6ZVwiIC8+XG4gICAgICAgIH1cbiAgICAgICAgQGlmICh0ZXh0ICYmICFpY29uQWxvbmUpIHtcbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgW2NsYXNzLnRleHQtc21dPVwic2l6ZSA9PT0gJ3hzJyB8fCBzaXplID09PSAnc20nXCJcbiAgICAgICAgICAgIFtjbGFzcy50ZXh0LWJhc2VdPVwic2l6ZSA9PT0gJ2Jhc2UnIHx8IHNpemUgPT09ICdsZydcIlxuICAgICAgICAgICAgW2NsYXNzLnRleHQteGxdPVwic2l6ZSA9PT0gJ3hsJ1wiXG4gICAgICAgICAgICA+e3sgdGV4dCB9fTwvc3BhblxuICAgICAgICAgID5cbiAgICAgICAgfVxuICAgICAgPC9zcGFuPlxuICAgIDwvc3Bhbj5cbiAgfVxufVxuIl19