UNPKG

@agnos-ui/angular

Version:

Bootstrap-based widget library for Angular.

302 lines 34 kB
import { __decorate } from "tslib"; import { BaseWidgetDirective, CachedProperty, ComponentTemplate, SlotDefaultDirective, SlotDirective, UseDirective, auBooleanAttribute, auNumberAttribute, callWidgetFactory, createToast, mergeDirectives, } from '@agnos-ui/angular-headless'; import { writable } from '@amadeus-it-group/tansu'; import { ChangeDetectionStrategy, Component, ContentChild, Directive, EventEmitter, Input, Output, TemplateRef, ViewChild, inject, } from '@angular/core'; import * as i0 from "@angular/core"; const _c0 = ["structure"]; function ToastDefaultSlotsComponent_ng_template_0_Conditional_0_ng_template_1_Template(rf, ctx) { } function ToastDefaultSlotsComponent_ng_template_0_Conditional_0_Conditional_2_Template(rf, ctx) { if (rf & 1) { const _r11 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "button", 8); i0.ɵɵlistener("click", function ToastDefaultSlotsComponent_ng_template_0_Conditional_0_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r11); const widget_r3 = i0.ɵɵnextContext(2).widget; return i0.ɵɵresetView(widget_r3.api.close()); }); i0.ɵɵelementEnd(); } if (rf & 2) { const state_r2 = i0.ɵɵnextContext(2).state; i0.ɵɵattribute("aria-label", state_r2.ariaCloseButtonLabel); } } const _c1 = (a0, a1) => ({ state: a0, widget: a1 }); function ToastDefaultSlotsComponent_ng_template_0_Conditional_0_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 6); i0.ɵɵtemplate(1, ToastDefaultSlotsComponent_ng_template_0_Conditional_0_ng_template_1_Template, 0, 0, "ng-template", 4)(2, ToastDefaultSlotsComponent_ng_template_0_Conditional_0_Conditional_2_Template, 1, 1, "button", 7); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r13 = i0.ɵɵnextContext(); const state_r2 = ctx_r13.state; const widget_r3 = ctx_r13.widget; i0.ɵɵadvance(); i0.ɵɵproperty("auSlot", state_r2.slotHeader)("auSlotProps", i0.ɵɵpureFunction2(3, _c1, state_r2, widget_r3)); i0.ɵɵadvance(); i0.ɵɵconditional(2, state_r2.dismissible ? 2 : -1); } } function ToastDefaultSlotsComponent_ng_template_0_ng_template_2_Template(rf, ctx) { } function ToastDefaultSlotsComponent_ng_template_0_Conditional_3_Template(rf, ctx) { if (rf & 1) { const _r16 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "button", 9); i0.ɵɵlistener("click", function ToastDefaultSlotsComponent_ng_template_0_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r16); const widget_r3 = i0.ɵɵnextContext().widget; return i0.ɵɵresetView(widget_r3.api.close()); }); i0.ɵɵelementEnd(); } if (rf & 2) { const state_r2 = i0.ɵɵnextContext().state; i0.ɵɵattribute("aria-label", state_r2.ariaCloseButtonLabel); } } function ToastDefaultSlotsComponent_ng_template_0_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtemplate(0, ToastDefaultSlotsComponent_ng_template_0_Conditional_0_Template, 3, 6, "div", 2); i0.ɵɵelementStart(1, "div", 3); i0.ɵɵtemplate(2, ToastDefaultSlotsComponent_ng_template_0_ng_template_2_Template, 0, 0, "ng-template", 4); i0.ɵɵelementEnd(); i0.ɵɵtemplate(3, ToastDefaultSlotsComponent_ng_template_0_Conditional_3_Template, 1, 1, "button", 5); } if (rf & 2) { const state_r2 = ctx.state; const widget_r3 = ctx.widget; i0.ɵɵconditional(0, state_r2.slotHeader ? 0 : -1); i0.ɵɵadvance(2); i0.ɵɵproperty("auSlot", state_r2.slotDefault)("auSlotProps", i0.ɵɵpureFunction2(4, _c1, state_r2, widget_r3)); i0.ɵɵadvance(); i0.ɵɵconditional(3, state_r2.dismissible && !state_r2.slotHeader ? 3 : -1); } } const _c2 = ["auToast", ""]; function ToastComponent_ng_template_0_Template(rf, ctx) { if (rf & 1) { i0.ɵɵprojection(0); } } function ToastComponent_Conditional_1_ng_template_1_Template(rf, ctx) { } function ToastComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 2); i0.ɵɵtemplate(1, ToastComponent_Conditional_1_ng_template_1_Template, 0, 0, "ng-template", 3); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵclassMapInterpolate1("au-toast toast ", ctx_r1.state().className, ""); i0.ɵɵclassProp("d-flex", !ctx_r1.state().slotHeader)("toast-dismissible", ctx_r1.state().dismissible); i0.ɵɵproperty("auUse", ctx_r1.toastDirective); i0.ɵɵadvance(); i0.ɵɵproperty("auSlot", ctx_r1.state().slotStructure)("auSlotProps", i0.ɵɵpureFunction2(10, _c1, ctx_r1.state(), ctx_r1.widget)); } } const _c3 = ["*"]; export class ToastBodyDirective { constructor() { this.templateRef = inject((TemplateRef)); } static ngTemplateContextGuard(dir, context) { return true; } static { this.ɵfac = function ToastBodyDirective_Factory(t) { return new (t || ToastBodyDirective)(); }; } static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: ToastBodyDirective, selectors: [["ng-template", "auToastBody", ""]], standalone: true }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ToastBodyDirective, [{ type: Directive, args: [{ selector: 'ng-template[auToastBody]', standalone: true }] }], null, null); })(); export class ToastStructureDirective { constructor() { this.templateRef = inject((TemplateRef)); } static ngTemplateContextGuard(dir, context) { return true; } static { this.ɵfac = function ToastStructureDirective_Factory(t) { return new (t || ToastStructureDirective)(); }; } static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: ToastStructureDirective, selectors: [["ng-template", "auToastStructure", ""]], standalone: true }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ToastStructureDirective, [{ type: Directive, args: [{ selector: 'ng-template[auToastStructure]', standalone: true }] }], null, null); })(); export class ToastHeaderDirective { constructor() { this.templateRef = inject((TemplateRef)); } static ngTemplateContextGuard(dir, context) { return true; } static { this.ɵfac = function ToastHeaderDirective_Factory(t) { return new (t || ToastHeaderDirective)(); }; } static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: ToastHeaderDirective, selectors: [["ng-template", "auToastHeader", ""]], standalone: true }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ToastHeaderDirective, [{ type: Directive, args: [{ selector: 'ng-template[auToastHeader]', standalone: true }] }], null, null); })(); export class ToastDefaultSlotsComponent { static { this.ɵfac = function ToastDefaultSlotsComponent_Factory(t) { return new (t || ToastDefaultSlotsComponent)(); }; } static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ToastDefaultSlotsComponent, selectors: [["ng-component"]], viewQuery: function ToastDefaultSlotsComponent_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(_c0, 7); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.structure = _t.first); } }, standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 2, vars: 0, consts: [["auToastStructure", ""], ["structure", ""], ["class", "toast-header"], [1, "toast-body"], [3, "auSlot", "auSlotProps"], ["type", "button", "class", "btn-close btn-close-white me-2 m-auto"], [1, "toast-header"], ["type", "button", "class", "btn-close me-0 ms-auto"], ["type", "button", 1, "btn-close", "me-0", "ms-auto", 3, "click"], ["type", "button", 1, "btn-close", "btn-close-white", "me-2", "m-auto", 3, "click"]], template: function ToastDefaultSlotsComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtemplate(0, ToastDefaultSlotsComponent_ng_template_0_Template, 4, 7, "ng-template", 0, 1, i0.ɵɵtemplateRefExtractor); } }, dependencies: [SlotDirective, ToastStructureDirective], encapsulation: 2, changeDetection: 0 }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ToastDefaultSlotsComponent, [{ type: Component, args: [{ standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [SlotDirective, ToastStructureDirective], template: ` <ng-template auToastStructure #structure let-state="state" let-widget="widget"> @if (state.slotHeader) { <div class="toast-header"> <ng-template [auSlot]="state.slotHeader" [auSlotProps]="{state, widget}"></ng-template> @if (state.dismissible) { <button type="button" class="btn-close me-0 ms-auto" (click)="widget.api.close()" [attr.aria-label]="state.ariaCloseButtonLabel"></button> } </div> } <div class="toast-body"> <ng-template [auSlot]="state.slotDefault" [auSlotProps]="{state, widget}"></ng-template> </div> @if (state.dismissible && !state.slotHeader) { <button type="button" class="btn-close btn-close-white me-2 m-auto" (click)="widget.api.close()" [attr.aria-label]="state.ariaCloseButtonLabel" ></button> } </ng-template>`, }] }], null, { structure: [{ type: ViewChild, args: ['structure', { static: true }] }] }); })(); (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ToastDefaultSlotsComponent, { className: "ToastDefaultSlotsComponent", filePath: "components/toast/toast.component.ts", lineNumber: 80 }); })(); export const toastDefaultSlotStructure = new ComponentTemplate(ToastDefaultSlotsComponent, 'structure'); const defaultConfig = { slotStructure: toastDefaultSlotStructure, }; export class ToastComponent extends BaseWidgetDirective { constructor() { super(...arguments); /** * Callback called when the alert visibility changed. */ this.visibleChange = new EventEmitter(); /** * Callback called when the alert is hidden. */ this.hidden = new EventEmitter(); /** * Callback called when the alert is shown. */ this.shown = new EventEmitter(); this.defaultSlots = writable(defaultConfig); this._widget = callWidgetFactory({ factory: createToast, widgetName: 'toast', defaultConfig: this.defaultSlots, events: { onVisibleChange: (event) => this.visibleChange.emit(event), onShown: () => this.shown.emit(), onHidden: () => this.hidden.emit(), }, }); } get toastDirective() { return mergeDirectives(this._widget.directives.autohideDirective, this._widget.directives.transitionDirective); } ngAfterContentChecked() { this._widget.patchSlots({ slotDefault: this.slotDefaultFromContent?.templateRef, slotStructure: this.slotStructureFromContent?.templateRef, slotHeader: this.slotHeaderFromContent?.templateRef, }); } static { this.ɵfac = /*@__PURE__*/ (() => { let ɵToastComponent_BaseFactory; return function ToastComponent_Factory(t) { returnToastComponent_BaseFactory || (ɵToastComponent_BaseFactory = i0.ɵɵgetInheritedFactory(ToastComponent)))(t || ToastComponent); }; })(); } static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ToastComponent, selectors: [["", "auToast", ""]], contentQueries: function ToastComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) { i0.ɵɵcontentQuery(dirIndex, ToastBodyDirective, 5); i0.ɵɵcontentQuery(dirIndex, ToastStructureDirective, 5); i0.ɵɵcontentQuery(dirIndex, ToastHeaderDirective, 5); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.slotDefaultFromContent = _t.first); i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.slotStructureFromContent = _t.first); i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.slotHeaderFromContent = _t.first); } }, inputs: { dismissible: [i0.ɵɵInputFlags.HasDecoratorInputTransform, "auDismissible", "dismissible", auBooleanAttribute], transition: [i0.ɵɵInputFlags.None, "auTransition", "transition"], visible: [i0.ɵɵInputFlags.HasDecoratorInputTransform, "auVisible", "visible", auBooleanAttribute], animationOnInit: [i0.ɵɵInputFlags.HasDecoratorInputTransform, "auAnimationOnInit", "animationOnInit", auBooleanAttribute], animation: [i0.ɵɵInputFlags.HasDecoratorInputTransform, "auAnimation", "animation", auBooleanAttribute], autohide: [i0.ɵɵInputFlags.HasDecoratorInputTransform, "auAutohide", "autohide", auBooleanAttribute], delay: [i0.ɵɵInputFlags.HasDecoratorInputTransform, "auDelay", "delay", auNumberAttribute], ariaCloseButtonLabel: [i0.ɵɵInputFlags.None, "auAriaCloseButtonLabel", "ariaCloseButtonLabel"], slotDefault: [i0.ɵɵInputFlags.None, "auSlotDefault", "slotDefault"], slotStructure: [i0.ɵɵInputFlags.None, "auSlotStructure", "slotStructure"], slotHeader: [i0.ɵɵInputFlags.None, "auSlotHeader", "slotHeader"], className: [i0.ɵɵInputFlags.None, "auClassName", "className"] }, outputs: { visibleChange: "auVisibleChange", hidden: "auHidden", shown: "auShown" }, standalone: true, features: [i0.ɵɵInputTransformsFeature, i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], attrs: _c2, ngContentSelectors: _c3, decls: 2, vars: 2, consts: [[3, "auSlotDefault"], ["role", "alert", "aria-atomic", "true", 3, "auUse", "class", "d-flex", "toast-dismissible"], ["role", "alert", "aria-atomic", "true", 3, "auUse"], [3, "auSlot", "auSlotProps"]], template: function ToastComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵprojectionDef(); i0.ɵɵtemplate(0, ToastComponent_ng_template_0_Template, 1, 0, "ng-template", 0)(1, ToastComponent_Conditional_1_Template, 2, 13, "div", 1); } if (rf & 2) { i0.ɵɵproperty("auSlotDefault", ctx.defaultSlots); i0.ɵɵadvance(); i0.ɵɵconditional(1, !ctx.state().hidden ? 1 : -1); } }, dependencies: [SlotDirective, UseDirective, SlotDefaultDirective], encapsulation: 2, changeDetection: 0 }); } } __decorate([ CachedProperty ], ToastComponent.prototype, "toastDirective", null); (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ToastComponent, [{ type: Component, args: [{ selector: '[auToast]', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [SlotDirective, UseDirective, SlotDefaultDirective], template: ` <ng-template [auSlotDefault]="defaultSlots"> <ng-content></ng-content> </ng-template> @if (!state().hidden) { <div [auUse]="toastDirective" class="au-toast toast {{ state().className }}" [class.d-flex]="!state().slotHeader" [class.toast-dismissible]="state().dismissible" role="alert" aria-atomic="true" > <ng-template [auSlot]="state().slotStructure" [auSlotProps]="{state: state(), widget}"></ng-template> </div> }`, }] }], null, { dismissible: [{ type: Input, args: [{ alias: 'auDismissible', transform: auBooleanAttribute }] }], transition: [{ type: Input, args: ['auTransition'] }], visible: [{ type: Input, args: [{ alias: 'auVisible', transform: auBooleanAttribute }] }], animationOnInit: [{ type: Input, args: [{ alias: 'auAnimationOnInit', transform: auBooleanAttribute }] }], animation: [{ type: Input, args: [{ alias: 'auAnimation', transform: auBooleanAttribute }] }], autohide: [{ type: Input, args: [{ alias: 'auAutohide', transform: auBooleanAttribute }] }], delay: [{ type: Input, args: [{ alias: 'auDelay', transform: auNumberAttribute }] }], ariaCloseButtonLabel: [{ type: Input, args: ['auAriaCloseButtonLabel'] }], slotDefault: [{ type: Input, args: ['auSlotDefault'] }], slotDefaultFromContent: [{ type: ContentChild, args: [ToastBodyDirective, { static: false }] }], slotStructure: [{ type: Input, args: ['auSlotStructure'] }], slotStructureFromContent: [{ type: ContentChild, args: [ToastStructureDirective, { static: false }] }], slotHeader: [{ type: Input, args: ['auSlotHeader'] }], slotHeaderFromContent: [{ type: ContentChild, args: [ToastHeaderDirective, { static: false }] }], visibleChange: [{ type: Output, args: ['auVisibleChange'] }], hidden: [{ type: Output, args: ['auHidden'] }], shown: [{ type: Output, args: ['auShown'] }], className: [{ type: Input, args: ['auClassName'] }], toastDirective: [] }); })(); (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ToastComponent, { className: "ToastComponent", filePath: "components/toast/toast.component.ts", lineNumber: 111 }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdG9hc3QvdG9hc3QuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQ04sbUJBQW1CLEVBQ25CLGNBQWMsRUFDZCxpQkFBaUIsRUFDakIsb0JBQW9CLEVBQ3BCLGFBQWEsRUFDYixZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsV0FBVyxFQUNYLGVBQWUsR0FDZixNQUFNLDRCQUE0QixDQUFDO0FBRXBDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUVqRCxPQUFPLEVBQ04sdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEVBQ1QsTUFBTSxHQUNOLE1BQU0sZUFBZSxDQUFDOzs7Ozs7SUFrQ2xCLGlDQUFpSTtJQUE1RSx1TkFBUyxlQUFBLHFCQUFrQixDQUFBLElBQUM7SUFBZ0QsaUJBQVM7OztJQUF4RCwyREFBOEM7Ozs7SUFIbEksOEJBQTBCO0lBQ3pCLHVIQUF1RixxR0FBQTtJQUl4RixpQkFBTTs7Ozs7SUFKUSxjQUEyQjtJQUEzQiw0Q0FBMkIsZ0VBQUE7SUFDeEMsY0FFQztJQUZELGtEQUVDOzs7OztJQU9GLGlDQUtDO0lBRkEsd01BQVMsZUFBQSxxQkFBa0IsQ0FBQSxJQUFDO0lBRTVCLGlCQUFTOzs7SUFEVCwyREFBOEM7OztJQWhCaEQsaUdBT0M7SUFDRCw4QkFBd0I7SUFDdkIseUdBQXdGO0lBQ3pGLGlCQUFNO0lBQ04sb0dBT0M7Ozs7SUFsQkQsaURBT0M7SUFFYSxlQUE0QjtJQUE1Qiw2Q0FBNEIsZ0VBQUE7SUFFMUMsY0FPQztJQVBELDBFQU9DOzs7O0lBbUJBLGtCQUF5Qjs7OztJQUd6Qiw4QkFP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QUFNLEVBQUUsS0FBSyxFQUFDO1lBS3hCLGFBQWE7a0JBQXZDLE1BQU07bUJBQUMsaUJBQWlCO1lBS0wsTUFBTTtrQkFBekIsTUFBTTttQkFBQyxVQUFVO1lBS0MsS0FBSztrQkFBdkIsTUFBTTttQkFBQyxTQUFTO1lBTUssU0FBUztrQkFBOUIsS0FBSzttQkFBQyxhQUFhO1lBY2hCLGNBQWM7a0ZBcEdOLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7U2xvdENvbnRlbnQsIFRvYXN0Q29udGV4dCwgVG9hc3RQcm9wcywgVG9hc3RXaWRnZXQsIFRyYW5zaXRpb25Gbn0gZnJvbSAnQGFnbm9zLXVpL2FuZ3VsYXItaGVhZGxlc3MnO1xuaW1wb3J0IHtcblx0QmFzZVdpZGdldERpcmVjdGl2ZSxcblx0Q2FjaGVkUHJvcGVydHksXG5cdENvbXBvbmVudFRlbXBsYXRlLFxuXHRTbG90RGVmYXVsdERpcmVjdGl2ZSxcblx0U2xvdERpcmVjdGl2ZSxcblx0VXNlRGlyZWN0aXZlLFxuXHRhdUJvb2xlYW5BdHRyaWJ1dGUsXG5cdGF1TnVtYmVyQXR0cmlidXRlLFxuXHRjYWxsV2lkZ2V0RmFjdG9yeSxcblx0Y3JlYXRlVG9hc3QsXG5cdG1lcmdlRGlyZWN0aXZlcyxcbn0gZnJvbSAnQGFnbm9zLXVpL2FuZ3VsYXItaGVhZGxlc3MnO1xuaW1wb3J0IHR5cGUge1dyaXRhYmxlU2lnbmFsfSBmcm9tICdAYW1hZGV1cy1pdC1ncm91cC90YW5zdSc7XG5pbXBvcnQge3dyaXRhYmxlfSBmcm9tICdAYW1hZGV1cy1pdC1ncm91cC90YW5zdSc7XG5pbXBvcnQgdHlwZSB7QWZ0ZXJDb250ZW50Q2hlY2tlZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuXHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcblx0Q29tcG9uZW50LFxuXHRDb250ZW50Q2hpbGQsXG5cdERpcmVjdGl2ZSxcblx0RXZlbnRFbWl0dGVyLFxuXHRJbnB1dCxcblx0T3V0cHV0LFxuXHRUZW1wbGF0ZVJlZixcblx0Vmlld0NoaWxkLFxuXHRpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtzZWxlY3RvcjogJ25nLXRlbXBsYXRlW2F1VG9hc3RCb2R5XScsIHN0YW5kYWxvbmU6IHRydWV9KVxuZXhwb3J0IGNsYXNzIFRvYXN0Qm9keURpcmVjdGl2ZSB7XG5cdHB1YmxpYyB0ZW1wbGF0ZVJlZiA9IGluamVjdChUZW1wbGF0ZVJlZjxUb2FzdENvbnRleHQ+KTtcblx0c3RhdGljIG5nVGVtcGxhdGVDb250ZXh0R3VhcmQoZGlyOiBUb2FzdEJvZHlEaXJlY3RpdmUsIGNvbnRleHQ6IHVua25vd24pOiBjb250ZXh0IGlzIFRvYXN0Q29udGV4dCB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cbn1cblxuQERpcmVjdGl2ZSh7c2VsZWN0b3I6ICduZy10ZW1wbGF0ZVthdVRvYXN0U3RydWN0dXJlXScsIHN0YW5kYWxvbmU6IHRydWV9KVxuZXhwb3J0IGNsYXNzIFRvYXN0U3RydWN0dXJlRGlyZWN0aXZlIHtcblx0cHVibGljIHRlbXBsYXRlUmVmID0gaW5qZWN0KFRlbXBsYXRlUmVmPFRvYXN0Q29udGV4dD4pO1xuXHRzdGF0aWMgbmdUZW1wbGF0ZUNvbnRleHRHdWFyZChkaXI6IFRvYXN0U3RydWN0dXJlRGlyZWN0aXZlLCBjb250ZXh0OiB1bmtub3duKTogY29udGV4dCBpcyBUb2FzdENvbnRleHQge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG59XG5cbkBEaXJlY3RpdmUoe3NlbGVjdG9yOiAnbmctdGVtcGxhdGVbYXVUb2FzdEhlYWRlcl0nLCBzdGFuZGFsb25lOiB0cnVlfSlcbmV4cG9ydCBjbGFzcyBUb2FzdEhlYWRlckRpcmVjdGl2ZSB7XG5cdHB1YmxpYyB0ZW1wbGF0ZVJlZiA9IGluamVjdChUZW1wbGF0ZVJlZjxUb2FzdENvbnRleHQ+KTtcblx0c3RhdGljIG5nVGVtcGxhdGVDb250ZXh0R3VhcmQoZGlyOiBUb2FzdEhlYWRlckRpcmVjdGl2ZSwgY29udGV4dDogdW5rbm93bik6IGNvbnRleHQgaXMgVG9hc3RDb250ZXh0IHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxufVxuQENvbXBvbmVudCh7XG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuXHRpbXBvcnRzOiBbU2xvdERpcmVjdGl2ZSwgVG9hc3RTdHJ1Y3R1cmVEaXJlY3RpdmVdLFxuXHR0ZW1wbGF0ZTogYCA8bmctdGVtcGxhdGUgYXVUb2FzdFN0cnVjdHVyZSAjc3RydWN0dXJlIGxldC1zdGF0ZT1cInN0YXRlXCIgbGV0LXdpZGdldD1cIndpZGdldFwiPlxuXHRcdEBpZiAoc3RhdGUuc2xvdEhlYWRlcikge1xuXHRcdFx0PGRpdiBjbGFzcz1cInRvYXN0LWhlYWRlclwiPlxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgW2F1U2xvdF09XCJzdGF0ZS5zbG90SGVhZGVyXCIgW2F1U2xvdFByb3BzXT1cIntzdGF0ZSwgd2lkZ2V0fVwiPjwvbmctdGVtcGxhdGU+XG5cdFx0XHRcdEBpZiAoc3RhdGUuZGlzbWlzc2libGUpIHtcblx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZSBtZS0wIG1zLWF1dG9cIiAoY2xpY2spPVwid2lkZ2V0LmFwaS5jbG9zZSgpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJzdGF0ZS5hcmlhQ2xvc2VCdXR0b25MYWJlbFwiPjwvYnV0dG9uPlxuXHRcdFx0XHR9XG5cdFx0XHQ8L2Rpdj5cblx0XHR9XG5cdFx0PGRpdiBjbGFzcz1cInRvYXN0LWJvZHlcIj5cblx0XHRcdDxuZy10ZW1wbGF0ZSBbYXVTbG90XT1cInN0YXRlLnNsb3REZWZhdWx0XCIgW2F1U2xvdFByb3BzXT1cIntzdGF0ZSwgd2lkZ2V0fVwiPjwvbmctdGVtcGxhdGU+XG5cdFx0PC9kaXY+XG5cdFx0QGlmIChzdGF0ZS5kaXNtaXNzaWJsZSAmJiAhc3RhdGUuc2xvdEhlYWRlcikge1xuXHRcdFx0PGJ1dHRvblxuXHRcdFx0XHR0eXBlPVwiYnV0dG9uXCJcblx0XHRcdFx0Y2xhc3M9XCJidG4tY2xvc2UgYnRuLWNsb3NlLXdoaXRlIG1lLTIgbS1hdXRvXCJcblx0XHRcdFx0KGNsaWNrKT1cIndpZGdldC5hcGkuY2xvc2UoKVwiXG5cdFx0XHRcdFthdHRyLmFyaWEtbGFiZWxdPVwic3RhdGUuYXJpYUNsb3NlQnV0dG9uTGFiZWxcIlxuXHRcdFx0PjwvYnV0dG9uPlxuXHRcdH1cblx0PC9uZy10ZW1wbGF0ZT5gLFxufSlcbmV4cG9ydCBjbGFzcyBUb2FzdERlZmF1bHRTbG90c0NvbXBvbmVudCB7XG5cdEBWaWV3Q2hpbGQoJ3N0cnVjdHVyZScsIHtzdGF0aWM6IHRydWV9KSBzdHJ1Y3R1cmU6IFRlbXBsYXRlUmVmPFRvYXN0Q29udGV4dD47XG59XG5cbmV4cG9ydCBjb25zdCB0b2FzdERlZmF1bHRTbG90U3RydWN0dXJlID0gbmV3IENvbXBvbmVudFRlbXBsYXRlKFRvYXN0RGVmYXVsdFNsb3RzQ29tcG9uZW50LCAnc3RydWN0dXJlJyk7XG5cbmNvbnN0IGRlZmF1bHRDb25maWc6IFBhcnRpYWw8VG9hc3RQcm9wcz4gPSB7XG5cdHNsb3RTdHJ1Y3R1cmU6IHRvYXN0RGVmYXVsdFNsb3RTdHJ1Y3R1cmUsXG59O1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICdbYXVUb2FzdF0nLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcblx0aW1wb3J0czogW1Nsb3REaXJlY3RpdmUsIFVzZURpcmVjdGl2ZSwgU2xvdERlZmF1bHREaXJlY3RpdmVdLFxuXHR0ZW1wbGF0ZTogYCA8bmctdGVtcGxhdGUgW2F1U2xvdERlZmF1bHRdPVwiZGVmYXVsdFNsb3RzXCI+XG5cdFx0XHQ8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG5cdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRAaWYgKCFzdGF0ZSgpLmhpZGRlbikge1xuXHRcdFx0PGRpdlxuXHRcdFx0XHRbYXVVc2VdPVwidG9hc3REaXJlY3RpdmVcIlxuXHRcdFx0XHRjbGFzcz1cImF1LXRvYXN0IHRvYXN0IHt7IHN0YXRlKCkuY2xhc3NOYW1lIH19XCJcblx0XHRcdFx0W2NsYXNzLmQtZmxleF09XCIhc3RhdGUoKS5zbG90SGVhZGVyXCJcblx0XHRcdFx0W2NsYXNzLnRvYXN0LWRpc21pc3NpYmxlXT1cInN0YXRlKCkuZGlzbWlzc2libGVcIlxuXHRcdFx0XHRyb2xlPVwiYWxlcnRcIlxuXHRcdFx0XHRhcmlhLWF0b21pYz1cInRydWVcIlxuXHRcdFx0PlxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgW2F1U2xvdF09XCJzdGF0ZSgpLnNsb3RTdHJ1Y3R1cmVcIiBbYXVTbG90UHJvcHNdPVwie3N0YXRlOiBzdGF0ZSgpLCB3aWRnZXR9XCI+PC9uZy10ZW1wbGF0ZT5cblx0XHRcdDwvZGl2PlxuXHRcdH1gLFxufSlcbmV4cG9ydCBjbGFzcyBUb2FzdENvbXBvbmVudCBleHRlbmRzIEJhc2VXaWRnZXREaXJlY3RpdmU8VG9hc3RXaWRnZXQ+IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50Q2hlY2tlZCB7XG5cdC8qKlxuXHQgKiBJZiBgdHJ1ZWAsIGFsZXJ0IGNhbiBiZSBkaXNtaXNzZWQgYnkgdGhlIHVzZXIuXG5cdCAqIFRoZSBjbG9zZSBidXR0b24gKMOXKSB3aWxsIGJlIGRpc3BsYXllZCBhbmQgeW91IGNhbiBiZSBub3RpZmllZCBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgKGNsb3NlKSBvdXRwdXQuXG5cdCAqL1xuXHRASW5wdXQoe2FsaWFzOiAnYXVEaXNtaXNzaWJsZScsIHRyYW5zZm9ybTogYXVCb29sZWFuQXR0cmlidXRlfSlcblx0ZGlzbWlzc2libGU6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cblx0LyoqXG5cdCAqIFRoZSB0cmFuc2l0aW9uIGZ1bmN0aW9uIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgYWxlcnQgaXMgZGlzcGxheWVkIG9yIGhpZGRlbi5cblx0ICpcblx0ICogRGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBDb21tb25BbGVydFByb3BzLmFuaW1hdGlvbk9uSW5pdCwgdGhlIGFuaW1hdGlvbiBjYW4gYmUgb3B0aW9uYWxseSBza2lwcGVkIGR1cmluZyB0aGUgc2hvd2luZyBwcm9jZXNzLlxuXHQgKi9cblx0QElucHV0KCdhdVRyYW5zaXRpb24nKVxuXHR0cmFuc2l0aW9uOiBUcmFuc2l0aW9uRm4gfCB1bmRlZmluZWQ7XG5cblx0LyoqXG5cdCAqIElmIGB0cnVlYCB0aGUgYWxlcnQgaXMgdmlzaWJsZSB0byB0aGUgdXNlclxuXHQgKi9cblx0QElucHV0KHthbGlhczogJ2F1VmlzaWJsZScsIHRyYW5zZm9ybTogYXVCb29sZWFuQXR0cmlidXRlfSlcblx0dmlzaWJsZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogSWYgYHRydWVgLCBhbGVydCBvcGVuaW5nIHdpbGwgYmUgYW5pbWF0ZWQuXG5cdCAqXG5cdCAqIEFuaW1hdGlvbiBpcyB0cmlnZ2VyZWQgIHdoZW4gdGhlIGAub3BlbigpYCBmdW5jdGlvbiBpcyBjYWxsZWRcblx0ICogb3IgdGhlIHZpc2libGUgcHJvcCBpcyBjaGFuZ2VkXG5cdCAqL1xuXHRASW5wdXQoe2FsaWFzOiAnYXVBbmltYXRpb25PbkluaXQnLCB0cmFuc2Zvcm06IGF1Qm9vbGVhbkF0dHJpYnV0ZX0pXG5cdGFuaW1hdGlvbk9uSW5pdDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogSWYgYHRydWVgLCBhbGVydCBjbG9zaW5nIHdpbGwgYmUgYW5pbWF0ZWQuXG5cdCAqXG5cdCAqIEFuaW1hdGlvbiBpcyB0cmlnZ2VyZWQgIHdoZW4gY2xpY2tlZCBvbiB0aGUgY2xvc2UgYnV0dG9uICjDlyksXG5cdCAqIHZpYSB0aGUgYC5jbG9zZSgpYCBmdW5jdGlvbiBvciB0aGUgdmlzaWJsZSBwcm9wIGlzIGNoYW5nZWRcblx0ICovXG5cdEBJbnB1dCh7YWxpYXM6ICdhdUFuaW1hdGlvbicsIHRyYW5zZm9ybTogYXVCb29sZWFuQXR0cmlidXRlfSlcblx0YW5pbWF0aW9uOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG5cdC8qKlxuXHQgKiBJZiBgdHJ1ZWAgYXV0b21hdGljYWxseSBoaWRlcyB0aGUgdG9hc3QgYWZ0ZXIgdGhlIGRlbGF5LlxuXHQgKi9cblx0QElucHV0KHthbGlhczogJ2F1QXV0b2hpZGUnLCB0cmFuc2Zvcm06IGF1Qm9vbGVhbkF0dHJpYnV0ZX0pXG5cdGF1dG9oaWRlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG5cdC8qKlxuXHQgKiBEZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGhpZGluZyB0aGUgdG9hc3QuXG5cdCAqL1xuXHRASW5wdXQoe2FsaWFzOiAnYXVEZWxheScsIHRyYW5zZm9ybTogYXVOdW1iZXJBdHRyaWJ1dGV9KVxuXHRkZWxheTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG5cdC8qKlxuXHQgKiBBY2Nlc3NpYmlsaXR5IGNsb3NlIGJ1dHRvbiBsYWJlbFxuXHQgKi9cblx0QElucHV0KCdhdUFyaWFDbG9zZUJ1dHRvbkxhYmVsJykgYXJpYUNsb3NlQnV0dG9uTGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuXHRASW5wdXQoJ2F1U2xvdERlZmF1bHQnKSBzbG90RGVmYXVsdDogU2xvdENvbnRlbnQ8VG9hc3RDb250ZXh0Pjtcblx0QENvbnRlbnRDaGlsZChUb2FzdEJvZHlEaXJlY3RpdmUsIHtzdGF0aWM6IGZhbHNlfSlcblx0c2xvdERlZmF1bHRGcm9tQ29udGVudDogVG9hc3RCb2R5RGlyZWN0aXZlIHwgbnVsbDtcblxuXHRASW5wdXQoJ2F1U2xvdFN0cnVjdHVyZScpIHNsb3RTdHJ1Y3R1cmU6IFNsb3RDb250ZW50PFRvYXN0Q29udGV4dD47XG5cdEBDb250ZW50Q2hpbGQoVG9hc3RTdHJ1Y3R1cmVEaXJlY3RpdmUsIHtzdGF0aWM6IGZhbHNlfSkgc2xvdFN0cnVjdHVyZUZyb21Db250ZW50OiBUb2FzdFN0cnVjdHVyZURpcmVjdGl2ZSB8IHVuZGVmaW5lZDtcblxuXHRASW5wdXQoJ2F1U2xvdEhlYWRlcicpIHNsb3RIZWFkZXI6IFNsb3RDb250ZW50PFRvYXN0Q29udGV4dD47XG5cdEBDb250ZW50Q2hpbGQoVG9hc3RIZWFkZXJEaXJlY3RpdmUsIHtzdGF0aWM6IGZhbHNlfSkgc2xvdEhlYWRlckZyb21Db250ZW50OiBUb2FzdEhlYWRlckRpcmVjdGl2ZSB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogQ2FsbGJhY2sgY2FsbGVkIHdoZW4gdGhlIGFsZXJ0IHZpc2liaWxpdHkgY2hhbmdlZC5cblx0ICovXG5cdEBPdXRwdXQoJ2F1VmlzaWJsZUNoYW5nZScpIHZpc2libGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cblx0LyoqXG5cdCAqIENhbGxiYWNrIGNhbGxlZCB3aGVuIHRoZSBhbGVydCBpcyBoaWRkZW4uXG5cdCAqL1xuXHRAT3V0cHV0KCdhdUhpZGRlbicpIGhpZGRlbiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuXHQvKipcblx0ICogQ2FsbGJhY2sgY2FsbGVkIHdoZW4gdGhlIGFsZXJ0IGlzIHNob3duLlxuXHQgKi9cblx0QE91dHB1dCgnYXVTaG93bicpIHNob3duID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG5cdHJlYWRvbmx5IGRlZmF1bHRTbG90czogV3JpdGFibGVTaWduYWw8UGFydGlhbDxUb2FzdFByb3BzPj4gPSB3cml0YWJsZShkZWZhdWx0Q29uZmlnKTtcblx0LyoqXG5cdCAqIENTUyBjbGFzc2VzIHRvIGJlIGFwcGxpZWQgb24gdGhlIHdpZGdldCBtYWluIGNvbnRhaW5lclxuXHQgKi9cblx0QElucHV0KCdhdUNsYXNzTmFtZScpIGNsYXNzTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5cdHJlYWRvbmx5IF93aWRnZXQgPSBjYWxsV2lkZ2V0RmFjdG9yeSh7XG5cdFx0ZmFjdG9yeTogY3JlYXRlVG9hc3QsXG5cdFx0d2lkZ2V0TmFtZTogJ3RvYXN0Jyxcblx0XHRkZWZhdWx0Q29uZmlnOiB0aGlzLmRlZmF1bHRTbG90cyxcblx0XHRldmVudHM6IHtcblx0XHRcdG9uVmlzaWJsZUNoYW5nZTogKGV2ZW50KSA9PiB0aGlzLnZpc2libGVDaGFuZ2UuZW1pdChldmVudCksXG5cdFx0XHRvblNob3duOiAoKSA9PiB0aGlzLnNob3duLmVtaXQoKSxcblx0XHRcdG9uSGlkZGVuOiAoKSA9PiB0aGlzLmhpZGRlbi5lbWl0KCksXG5cdFx0fSxcblx0fSk7XG5cblx0QENhY2hlZFByb3BlcnR5XG5cdGdldCB0b2FzdERpcmVjdGl2ZSgpIHtcblx0XHRyZXR1cm4gbWVyZ2VEaXJlY3RpdmVzKHRoaXMuX3dpZGdldC5kaXJlY3RpdmVzLmF1dG9oaWRlRGlyZWN0aXZlLCB0aGlzLl93aWRnZXQuZGlyZWN0aXZlcy50cmFuc2l0aW9uRGlyZWN0aXZlKTtcblx0fVxuXG5cdG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpOiB2b2lkIHtcblx0XHR0aGlzLl93aWRnZXQucGF0Y2hTbG90cyh7XG5cdFx0XHRzbG90RGVmYXVsdDogdGhpcy5zbG90RGVmYXVsdEZyb21Db250ZW50Py50ZW1wbGF0ZVJlZixcblx0XHRcdHNsb3RTdHJ1Y3R1cmU6IHRoaXMuc2xvdFN0cnVjdHVyZUZyb21Db250ZW50Py50ZW1wbGF0ZVJlZixcblx0XHRcdHNsb3RIZWFkZXI6IHRoaXMuc2xvdEhlYWRlckZyb21Db250ZW50Py50ZW1wbGF0ZVJlZixcblx0XHR9KTtcblx0fVxufVxuIl19