@edugouvfr/ngx-dsfr-ext
Version:
NgxDsfrExt est une extension au package @edugouvfr/ngx-dsfr (portage Angular des éléments DSFR)
82 lines • 16.8 kB
JavaScript
import { CommonModule } from '@angular/common';
import { Component, EventEmitter, inject, Input, Output, ViewEncapsulation, } from '@angular/core';
import { DsfrButtonModule, DsfrI18nPipe, DsfrI18nService, DsfrSeverityConst, Language, newUniqueId, } from '@edugouvfr/ngx-dsfr';
import { MESSAGES_EN } from '../i18n/messages.en';
import { MESSAGES_FR } from '../i18n/messages.fr';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export const DEFAULT_DURATION = 5000;
export class ToastItemComponent {
constructor() {
/**
* Notifie la fermeture d'une notification (que la fermeture soit automatique ou manuelle).
*/
this.itemClose = new EventEmitter();
this.severityConst = DsfrSeverityConst;
this.i18n = inject(DsfrI18nService);
this.i18n.extendsLabelsBundle(Language.EN, MESSAGES_EN);
this.i18n.extendsLabelsBundle(Language.FR, MESSAGES_FR);
}
ngOnInit() {
this.toastId ??= newUniqueId();
this.duration ??= DEFAULT_DURATION;
this.severity ??= DsfrSeverityConst.INFO;
}
ngAfterViewInit() {
this.startTimeout();
}
ngOnDestroy() {
this.stopTimeout();
}
/**
* Fermeture du toast (suppression)
* Informe les observateurs de la fermeture du toast.
*/
onClose() {
this.itemClose.emit(this.toastId);
}
onMouseOut() {
this.startTimeout();
}
onMouseOver() {
this.stopTimeout();
}
onTouchEnd() {
this.startTimeout();
}
onTouchStart() {
this.stopTimeout();
}
isError() {
return this.severity === 'error';
}
startTimeout() {
this.stopTimeout();
this.timeoutId = setTimeout(() => this.onClose(), this.duration);
}
stopTimeout() {
if (this.timeoutId) {
clearTimeout(this.timeoutId);
this.timeoutId = undefined;
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ToastItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ToastItemComponent, isStandalone: true, selector: "edu-toast-item", inputs: { toastId: "toastId", heading: "heading", content: "content", severity: "severity", duration: "duration" }, outputs: { itemClose: "itemClose" }, ngImport: i0, template: "<div\n [id]=\"toastId\"\n [attr.data-delay]=\"duration\"\n [ngClass]=\"{\n 'dsfrx-toast': true,\n 'fr-alert--info': severity === severityConst.INFO,\n 'fr-alert--success': severity === severityConst.SUCCESS || severity === severityConst.VALID,\n 'fr-alert--warning': severity === severityConst.WARNING,\n 'fr-alert--error': severity === severityConst.ERROR\n }\"\n (mouseover)=\"onMouseOver()\"\n (mouseout)=\"onMouseOut()\"\n (touchstart)=\"onTouchStart()\"\n (touchend)=\"onTouchEnd()\">\n @if (heading) {\n <div class=\"toast--header\" [innerHTML]=\"heading\"></div>\n }\n @if (content) {\n <div class=\"toast--content\" [innerHTML]=\"content\"></div>\n }\n <button\n type=\"button\"\n class=\"fr-btn fr-btn--close\"\n [title]=\"'toast.close' | dsfrI18n\"\n [attr.aria-label]=\"'toast.close' | dsfrI18n\"\n [attr.aria-controls]=\"toastId\"\n (click)=\"onClose()\">\n <span aria-hidden=\"true\" class=\"fr-sr-only\">{{ 'toast.close' | dsfrI18n }}</span>\n </button>\n</div>\n", styles: [".dsfrx-toast{background-color:var(--background-default-grey);position:relative;padding:1rem 1rem 1rem 3rem;margin-bottom:.5rem}.dsfrx-toast .toast--header{font-weight:700;margin-bottom:.5rem}.dsfrx-toast .toast--content{line-height:1.5}.dsfrx-toast.fr-alert--info,.dsfrx-toast.fr-alert--error,.dsfrx-toast.fr-alert--success,.dsfrx-toast.fr-alert--warning{background-image:none}.dsfrx-toast.fr-alert--info{box-shadow:inset 0 0 0 1px var(--border-plain-info),inset 2.5rem 0 0 0 var(--background-flat-info)}.dsfrx-toast.fr-alert--success{box-shadow:inset 0 0 0 1px var(--border-plain-success),inset 2.5rem 0 0 0 var(--background-flat-success)}.dsfrx-toast.fr-alert--error{box-shadow:inset 0 0 0 1px var(--border-plain-error),inset 2.5rem 0 0 0 var(--background-flat-error)}.dsfrx-toast.fr-alert--warning{box-shadow:inset 0 0 0 1px var(--border-plain-warning),inset 2.5rem 0 0 0 var(--background-flat-warning)}.dsfrx-toast:before{--icon-size: 1.5rem;flex:0 0 auto;display:inline-block;vertical-align:calc((.75em - var(--icon-size)) * .5);background-color:currentColor;width:var(--icon-size);height:var(--icon-size);-webkit-mask-size:100% 100%;mask-size:100% 100%;position:absolute;top:0;left:.5rem;margin:1rem 0rem;color:var(--text-inverted-grey)}.dsfrx-toast .fr-btn--close{position:absolute;top:.25rem;right:1.25rem;padding-left:0rem;padding-right:.5rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: DsfrButtonModule }, { kind: "pipe", type: DsfrI18nPipe, name: "dsfrI18n" }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ToastItemComponent, decorators: [{
type: Component,
args: [{ selector: 'edu-toast-item', encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule, DsfrButtonModule, DsfrI18nPipe], template: "<div\n [id]=\"toastId\"\n [attr.data-delay]=\"duration\"\n [ngClass]=\"{\n 'dsfrx-toast': true,\n 'fr-alert--info': severity === severityConst.INFO,\n 'fr-alert--success': severity === severityConst.SUCCESS || severity === severityConst.VALID,\n 'fr-alert--warning': severity === severityConst.WARNING,\n 'fr-alert--error': severity === severityConst.ERROR\n }\"\n (mouseover)=\"onMouseOver()\"\n (mouseout)=\"onMouseOut()\"\n (touchstart)=\"onTouchStart()\"\n (touchend)=\"onTouchEnd()\">\n @if (heading) {\n <div class=\"toast--header\" [innerHTML]=\"heading\"></div>\n }\n @if (content) {\n <div class=\"toast--content\" [innerHTML]=\"content\"></div>\n }\n <button\n type=\"button\"\n class=\"fr-btn fr-btn--close\"\n [title]=\"'toast.close' | dsfrI18n\"\n [attr.aria-label]=\"'toast.close' | dsfrI18n\"\n [attr.aria-controls]=\"toastId\"\n (click)=\"onClose()\">\n <span aria-hidden=\"true\" class=\"fr-sr-only\">{{ 'toast.close' | dsfrI18n }}</span>\n </button>\n</div>\n", styles: [".dsfrx-toast{background-color:var(--background-default-grey);position:relative;padding:1rem 1rem 1rem 3rem;margin-bottom:.5rem}.dsfrx-toast .toast--header{font-weight:700;margin-bottom:.5rem}.dsfrx-toast .toast--content{line-height:1.5}.dsfrx-toast.fr-alert--info,.dsfrx-toast.fr-alert--error,.dsfrx-toast.fr-alert--success,.dsfrx-toast.fr-alert--warning{background-image:none}.dsfrx-toast.fr-alert--info{box-shadow:inset 0 0 0 1px var(--border-plain-info),inset 2.5rem 0 0 0 var(--background-flat-info)}.dsfrx-toast.fr-alert--success{box-shadow:inset 0 0 0 1px var(--border-plain-success),inset 2.5rem 0 0 0 var(--background-flat-success)}.dsfrx-toast.fr-alert--error{box-shadow:inset 0 0 0 1px var(--border-plain-error),inset 2.5rem 0 0 0 var(--background-flat-error)}.dsfrx-toast.fr-alert--warning{box-shadow:inset 0 0 0 1px var(--border-plain-warning),inset 2.5rem 0 0 0 var(--background-flat-warning)}.dsfrx-toast:before{--icon-size: 1.5rem;flex:0 0 auto;display:inline-block;vertical-align:calc((.75em - var(--icon-size)) * .5);background-color:currentColor;width:var(--icon-size);height:var(--icon-size);-webkit-mask-size:100% 100%;mask-size:100% 100%;position:absolute;top:0;left:.5rem;margin:1rem 0rem;color:var(--text-inverted-grey)}.dsfrx-toast .fr-btn--close{position:absolute;top:.25rem;right:1.25rem;padding-left:0rem;padding-right:.5rem}\n"] }]
}], ctorParameters: () => [], propDecorators: { toastId: [{
type: Input
}], heading: [{
type: Input
}], content: [{
type: Input
}], severity: [{
type: Input
}], duration: [{
type: Input
}], itemClose: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QtaXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHNmci1leHQvc3JjL2xpYi90b2FzdC9pdGVtL3RvYXN0LWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItZXh0L3NyYy9saWIvdG9hc3QvaXRlbS90b2FzdC1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFDTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osZUFBZSxFQUVmLGlCQUFpQixFQUNqQixRQUFRLEVBQ1IsV0FBVyxHQUNaLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBR2xELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFXLElBQUksQ0FBQztBQVU3QyxNQUFNLE9BQU8sa0JBQWtCO0lBOEI3QjtRQWRBOztXQUVHO1FBQ08sY0FBUyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFJOUIsa0JBQWEsR0FBRyxpQkFBaUIsQ0FBQztRQUU3QyxTQUFJLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBTXJDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsT0FBTyxLQUFLLFdBQVcsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsS0FBSyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7SUFDM0MsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7T0FHRztJQUNPLE9BQU87UUFDZixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVTLFVBQVU7UUFDbEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFUyxXQUFXO1FBQ25CLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRVMsVUFBVTtRQUNsQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVTLFlBQVk7UUFDcEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFUyxPQUFPO1FBQ2YsT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLE9BQU8sQ0FBQztJQUNuQyxDQUFDO0lBRU8sWUFBWTtRQUNsQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRU8sV0FBVztRQUNqQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDOytHQXZGVSxrQkFBa0I7bUdBQWxCLGtCQUFrQixtT0NwQy9CLDJnQ0E4QkEsbTRDRElZLFlBQVksNEhBQUUsZ0JBQWdCLDBCQUFFLFlBQVk7OzRGQUUzQyxrQkFBa0I7a0JBUjlCLFNBQVM7K0JBQ0UsZ0JBQWdCLGlCQUdYLGlCQUFpQixDQUFDLElBQUksY0FDekIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGdCQUFnQixFQUFFLFlBQVksQ0FBQzt3REFJOUMsT0FBTztzQkFBZixLQUFLO2dCQUdHLE9BQU87c0JBQWYsS0FBSztnQkFHRyxPQUFPO3NCQUFmLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtJLFNBQVM7c0JBQWxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhbmltYXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBEc2ZyQnV0dG9uTW9kdWxlLFxuICBEc2ZySTE4blBpcGUsXG4gIERzZnJJMThuU2VydmljZSxcbiAgRHNmclNldmVyaXR5LFxuICBEc2ZyU2V2ZXJpdHlDb25zdCxcbiAgTGFuZ3VhZ2UsXG4gIG5ld1VuaXF1ZUlkLFxufSBmcm9tICdAZWR1Z291dmZyL25neC1kc2ZyJztcbmltcG9ydCB7IE1FU1NBR0VTX0VOIH0gZnJvbSAnLi4vaTE4bi9tZXNzYWdlcy5lbic7XG5pbXBvcnQgeyBNRVNTQUdFU19GUiB9IGZyb20gJy4uL2kxOG4vbWVzc2FnZXMuZnInO1xuaW1wb3J0IHsgRHNmclRvYXN0IH0gZnJvbSAnLi4vdG9hc3QubW9kZWwnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9EVVJBVElPTjogbnVtYmVyID0gNTAwMDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZWR1LXRvYXN0LWl0ZW0nLFxuICB0ZW1wbGF0ZVVybDogJy4vdG9hc3QtaXRlbS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RvYXN0LWl0ZW0uY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRHNmckJ1dHRvbk1vZHVsZSwgRHNmckkxOG5QaXBlXSxcbn0pXG5leHBvcnQgY2xhc3MgVG9hc3RJdGVtQ29tcG9uZW50IGltcGxlbWVudHMgRHNmclRvYXN0LCBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBJZGVudGlmaWFudCBkZSBsYSBub3RpZmljYXRpb24uICovXG4gIEBJbnB1dCgpIHRvYXN0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogVGl0cmUgZGUgbGEgbm90aWZpY2F0aW9uLiAqL1xuICBASW5wdXQoKSBoZWFkaW5nOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIENvbnRlbnUgZGUgbGEgbm90aWZpY2F0aW9uLiAqL1xuICBASW5wdXQoKSBjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFPDqXbDqXJpdMOpIGRlIGxhIG5vdGlmaWNhdGlvbiAoaW5mbyBwYXIgZMOpZmF1dCkuICovXG4gIEBJbnB1dCgpIHNldmVyaXR5OiBEc2ZyU2V2ZXJpdHk7XG5cbiAgLyoqIExhIGR1csOpZSBlbiBtcyBhdmFudCBxdSd1bmUgbm90aWZpY2F0aW9uIHNvaXQgZmVybcOpZS4gKi9cbiAgQElucHV0KCkgZHVyYXRpb246IG51bWJlcjtcblxuICAvKipcbiAgICogTm90aWZpZSBsYSBmZXJtZXR1cmUgZCd1bmUgbm90aWZpY2F0aW9uIChxdWUgbGEgZmVybWV0dXJlIHNvaXQgYXV0b21hdGlxdWUgb3UgbWFudWVsbGUpLlxuICAgKi9cbiAgQE91dHB1dCgpIGl0ZW1DbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIHByb3RlY3RlZCBoZWFkaW5nVGVtcGxhdGU6IHN0cmluZztcbiAgcHJvdGVjdGVkIGNvbnRlbnRUZW1wbGF0ZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2V2ZXJpdHlDb25zdCA9IERzZnJTZXZlcml0eUNvbnN0O1xuXG4gIHByaXZhdGUgaTE4biA9IGluamVjdChEc2ZySTE4blNlcnZpY2UpO1xuXG4gIC8qKiBJZCBkdSB0aW1lciAqL1xuICBwcml2YXRlIHRpbWVvdXRJZDogYW55O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaTE4bi5leHRlbmRzTGFiZWxzQnVuZGxlKExhbmd1YWdlLkVOLCBNRVNTQUdFU19FTik7XG4gICAgdGhpcy5pMThuLmV4dGVuZHNMYWJlbHNCdW5kbGUoTGFuZ3VhZ2UuRlIsIE1FU1NBR0VTX0ZSKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudG9hc3RJZCA/Pz0gbmV3VW5pcXVlSWQoKTtcbiAgICB0aGlzLmR1cmF0aW9uID8/PSBERUZBVUxUX0RVUkFUSU9OO1xuICAgIHRoaXMuc2V2ZXJpdHkgPz89IERzZnJTZXZlcml0eUNvbnN0LklORk87XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5zdGFydFRpbWVvdXQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3RvcFRpbWVvdXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXJtZXR1cmUgZHUgdG9hc3QgKHN1cHByZXNzaW9uKVxuICAgKiBJbmZvcm1lIGxlcyBvYnNlcnZhdGV1cnMgZGUgbGEgZmVybWV0dXJlIGR1IHRvYXN0LlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5pdGVtQ2xvc2UuZW1pdCh0aGlzLnRvYXN0SWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uTW91c2VPdXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdGFydFRpbWVvdXQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbk1vdXNlT3ZlcigpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BUaW1lb3V0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Ub3VjaEVuZCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0VGltZW91dCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uVG91Y2hTdGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BUaW1lb3V0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNFcnJvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZXZlcml0eSA9PT0gJ2Vycm9yJztcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRUaW1lb3V0KCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFRpbWVvdXQoKTtcbiAgICB0aGlzLnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vbkNsb3NlKCksIHRoaXMuZHVyYXRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wVGltZW91dCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aW1lb3V0SWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZCk7XG4gICAgICB0aGlzLnRpbWVvdXRJZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgW2lkXT1cInRvYXN0SWRcIlxuICBbYXR0ci5kYXRhLWRlbGF5XT1cImR1cmF0aW9uXCJcbiAgW25nQ2xhc3NdPVwie1xuICAgICdkc2ZyeC10b2FzdCc6IHRydWUsXG4gICAgJ2ZyLWFsZXJ0LS1pbmZvJzogc2V2ZXJpdHkgPT09IHNldmVyaXR5Q29uc3QuSU5GTyxcbiAgICAnZnItYWxlcnQtLXN1Y2Nlc3MnOiBzZXZlcml0eSA9PT0gc2V2ZXJpdHlDb25zdC5TVUNDRVNTIHx8IHNldmVyaXR5ID09PSBzZXZlcml0eUNvbnN0LlZBTElELFxuICAgICdmci1hbGVydC0td2FybmluZyc6IHNldmVyaXR5ID09PSBzZXZlcml0eUNvbnN0LldBUk5JTkcsXG4gICAgJ2ZyLWFsZXJ0LS1lcnJvcic6IHNldmVyaXR5ID09PSBzZXZlcml0eUNvbnN0LkVSUk9SXG4gIH1cIlxuICAobW91c2VvdmVyKT1cIm9uTW91c2VPdmVyKClcIlxuICAobW91c2VvdXQpPVwib25Nb3VzZU91dCgpXCJcbiAgKHRvdWNoc3RhcnQpPVwib25Ub3VjaFN0YXJ0KClcIlxuICAodG91Y2hlbmQpPVwib25Ub3VjaEVuZCgpXCI+XG4gIEBpZiAoaGVhZGluZykge1xuICAgIDxkaXYgY2xhc3M9XCJ0b2FzdC0taGVhZGVyXCIgW2lubmVySFRNTF09XCJoZWFkaW5nXCI+PC9kaXY+XG4gIH1cbiAgQGlmIChjb250ZW50KSB7XG4gICAgPGRpdiBjbGFzcz1cInRvYXN0LS1jb250ZW50XCIgW2lubmVySFRNTF09XCJjb250ZW50XCI+PC9kaXY+XG4gIH1cbiAgPGJ1dHRvblxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIGNsYXNzPVwiZnItYnRuIGZyLWJ0bi0tY2xvc2VcIlxuICAgIFt0aXRsZV09XCIndG9hc3QuY2xvc2UnIHwgZHNmckkxOG5cIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3RvYXN0LmNsb3NlJyB8IGRzZnJJMThuXCJcbiAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cInRvYXN0SWRcIlxuICAgIChjbGljayk9XCJvbkNsb3NlKClcIj5cbiAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cImZyLXNyLW9ubHlcIj57eyAndG9hc3QuY2xvc2UnIHwgZHNmckkxOG4gfX08L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG4iXX0=