UNPKG

@versatiledatakit/shared

Version:

Versatile Data Kit Shared library enables reusability of shared features like: NgRx Redux, Error Handlers, Utils, Generic Components, etc.

192 lines 23.2 kB
/* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ import { Component } from '@angular/core'; import { VmwToastType } from '../../../commons'; import { TaurusObject } from '../../../common'; import * as i0 from "@angular/core"; import * as i1 from "../service"; import * as i2 from "ngx-clipboard"; import * as i3 from "../../../commons/ngx-components/toast/toast-container.component"; import * as i4 from "@angular/common"; import * as i5 from "@clr/angular"; import * as i6 from "../../../commons/ngx-components/toast/toast.component"; function ToastsComponent_vdk_toast_1_p_5_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "p", 4)(1, "strong"); i0.ɵɵtext(2, "consequences:"); i0.ɵɵelementEnd(); i0.ɵɵtext(3); i0.ɵɵelementEnd(); } if (rf & 2) { const toast_r1 = i0.ɵɵnextContext().$implicit; i0.ɵɵadvance(3); i0.ɵɵtextInterpolate1(" ", toast_r1.error == null ? null : toast_r1.error.consequences, " "); } } function ToastsComponent_vdk_toast_1_p_6_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "p", 4)(1, "strong"); i0.ɵɵtext(2, "countermeasures:"); i0.ɵɵelementEnd(); i0.ɵɵtext(3); i0.ɵɵelementEnd(); } if (rf & 2) { const toast_r1 = i0.ɵɵnextContext().$implicit; i0.ɵɵadvance(3); i0.ɵɵtextInterpolate1(" ", toast_r1.error == null ? null : toast_r1.error.countermeasures, " "); } } function ToastsComponent_vdk_toast_1_p_7_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "p", 4); i0.ɵɵtext(1, " Please copy the details and report the error. "); i0.ɵɵelementEnd(); } } function ToastsComponent_vdk_toast_1_Template(rf, ctx) { if (rf & 1) { const _r9 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "vdk-toast", 2); i0.ɵɵlistener("dismissed", function ToastsComponent_vdk_toast_1_Template_vdk_toast_dismissed_0_listener() { const restoredCtx = i0.ɵɵrestoreView(_r9); const i_r2 = restoredCtx.index; const ctx_r8 = i0.ɵɵnextContext(); return ctx_r8.removeToast(i_r2); })("primaryButtonClick", function ToastsComponent_vdk_toast_1_Template_vdk_toast_primaryButtonClick_0_listener() { const restoredCtx = i0.ɵɵrestoreView(_r9); const toast_r1 = restoredCtx.$implicit; const ctx_r10 = i0.ɵɵnextContext(); return ctx_r10.copyToClipboard(toast_r1); })("secondaryButtonClick", function ToastsComponent_vdk_toast_1_Template_vdk_toast_secondaryButtonClick_0_listener() { const restoredCtx = i0.ɵɵrestoreView(_r9); const i_r2 = restoredCtx.index; const ctx_r11 = i0.ɵɵnextContext(); return ctx_r11.toggleToastExpandDetails(i_r2); }); i0.ɵɵelementStart(1, "div", 3); i0.ɵɵtext(2); i0.ɵɵelementEnd(); i0.ɵɵelementStart(3, "p", 4); i0.ɵɵtext(4); i0.ɵɵelementEnd(); i0.ɵɵtemplate(5, ToastsComponent_vdk_toast_1_p_5_Template, 4, 1, "p", 5); i0.ɵɵtemplate(6, ToastsComponent_vdk_toast_1_p_6_Template, 4, 1, "p", 5); i0.ɵɵtemplate(7, ToastsComponent_vdk_toast_1_p_7_Template, 2, 0, "p", 5); i0.ɵɵelementEnd(); } if (rf & 2) { const toast_r1 = ctx.$implicit; const i_r2 = ctx.index; const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵproperty("type", toast_r1.type)("timeoutSeconds", ctx_r0.getTimeout(toast_r1))("primaryButtonText", ctx_r0.getCopyToClipboardBtnText(toast_r1))("secondaryButtonText", ctx_r0.getExpandBtnText(toast_r1, i_r2)); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate(toast_r1.title); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate(toast_r1.description); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx_r0.isToastExpanded(i_r2) && (toast_r1.error == null ? null : toast_r1.error.consequences)); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx_r0.isToastExpanded(i_r2) && (toast_r1.error == null ? null : toast_r1.error.countermeasures)); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx_r0.isReportRecommendationVisible(toast_r1, i_r2)); } } export class ToastsComponent extends TaurusObject { constructor(toastService, clipboardService) { super(); this.toastService = toastService; this.clipboardService = clipboardService; this.toasts = []; } /** * ** Optimize Toast rendering using tracking with auto incremented ID per Toast. */ trackByRendering(_index, toast) { return toast.id; } /** * ** Returns if Toast with given index is expanded. */ isToastExpanded(index) { return this.toasts[index].expanded; } /** * ** Evaluate if recommendation text for Copy and Report is visible. */ isReportRecommendationVisible(toast, index) { return this.isToastExpanded(index) && this._isTypeError(toast) && toast.responseStatus !== 500; } /** * ** Remove Toast message. */ removeToast(index) { this.toasts.splice(index, 1); } /** * ** Toggle Toast expand details (expand/collapse). */ toggleToastExpandDetails(index) { this.toasts[index].expanded = !this.toasts[index].expanded; } /** * ** Copy to clipboard provided object. */ copyToClipboard(copy) { try { this.clipboardService.copy(JSON.stringify(copy)); } catch (e) { console.error(e); this._handleCopyActionError(); } } /** * ** Returns Toast timeout in unit seconds. */ getTimeout(toast) { return this._isTypeError(toast) ? 30 : 5; } /** * ** Returns text for Btn CopyToClipboard. */ getCopyToClipboardBtnText(toast) { return this._isTypeError(toast) ? 'Copy to clipboard' : ''; } /** * ** Returns text for Btn Expand/Collapse. */ getExpandBtnText(toast, index) { if (this._isTypeError(toast)) { return this.isToastExpanded(index) ? 'less' : 'more'; } return ''; } /** * @inheritDoc */ ngOnInit() { this.subscriptions.push(this.toastService.getNotifications().subscribe((toast) => { this.toasts.push({ ...toast, id: ToastsComponent.generateID(), time: ToastsComponent.getDateTimeNow() }); }), this.clipboardService.copyResponse$.subscribe((result) => { if (!result.isSuccess) { this._handleCopyActionError(); } })); } _isTypeError(toast) { return toast.type === VmwToastType.FAILURE && !!toast.error; } _handleCopyActionError() { this.toasts.push({ type: VmwToastType.FAILURE, title: `Copy to clipboard`, description: `The view definition failed to copy to the clipboard`, id: ToastsComponent.generateID(), time: ToastsComponent.getDateTimeNow() }); } /* eslint-disable @typescript-eslint/member-ordering */ static generateID() { return this.toastMessageCounter++; } static getDateTimeNow() { return new Date(); } } ToastsComponent.toastMessageCounter = 0; ToastsComponent.ɵfac = function ToastsComponent_Factory(t) { return new (t || ToastsComponent)(i0.ɵɵdirectiveInject(i1.ToastService), i0.ɵɵdirectiveInject(i2.ClipboardService)); }; ToastsComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ToastsComponent, selectors: [["shared-toasts"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 2, consts: [[1, "toast-container"], [3, "type", "timeoutSeconds", "primaryButtonText", "secondaryButtonText", "dismissed", "primaryButtonClick", "secondaryButtonClick", 4, "ngFor", "ngForOf", "ngForTrackBy"], [3, "type", "timeoutSeconds", "primaryButtonText", "secondaryButtonText", "dismissed", "primaryButtonClick", "secondaryButtonClick"], [1, "toast-title"], [1, "toast-description"], ["class", "toast-description", 4, "ngIf"]], template: function ToastsComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "vdk-toast-container", 0); i0.ɵɵtemplate(1, ToastsComponent_vdk_toast_1_Template, 8, 9, "vdk-toast", 1); i0.ɵɵelementEnd(); } if (rf & 2) { i0.ɵɵadvance(1); i0.ɵɵproperty("ngForOf", ctx.toasts)("ngForTrackBy", ctx.trackByRendering); } }, directives: [i3.VdkToastContainerComponent, i4.NgForOf, i5.ClrDatagridItemsTrackBy, i6.VdkToastComponent, i4.NgIf], styles: [".toast-container[_ngcontent-%COMP%]{z-index:1051}.toast-container[_ngcontent-%COMP%] .toast-title[_ngcontent-%COMP%]{max-width:300px}.toast-container[_ngcontent-%COMP%] .toast-description[_ngcontent-%COMP%]{margin-top:5px;max-width:330px}"] }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ToastsComponent, [{ type: Component, args: [{ selector: 'shared-toasts', template: "<!--\n ~ Copyright 2023-2025 Broadcom\n ~ SPDX-License-Identifier: Apache-2.0\n -->\n\n<vdk-toast-container class=\"toast-container\">\n <vdk-toast\n *ngFor=\"let toast of toasts; let i = index; trackBy: trackByRendering\"\n [type]=\"toast.type\"\n [timeoutSeconds]=\"getTimeout(toast)\"\n [primaryButtonText]=\"getCopyToClipboardBtnText(toast)\"\n [secondaryButtonText]=\"getExpandBtnText(toast, i)\"\n (dismissed)=\"removeToast(i)\"\n (primaryButtonClick)=\"copyToClipboard(toast)\"\n (secondaryButtonClick)=\"toggleToastExpandDetails(i)\"\n >\n <div class=\"toast-title\">{{toast.title}}</div>\n\n <p class=\"toast-description\">{{toast.description}}</p>\n <p\n *ngIf=\"isToastExpanded(i) && toast.error?.consequences\"\n class=\"toast-description\"\n >\n <strong>consequences:</strong> {{toast.error?.consequences}}\n </p>\n <p\n *ngIf=\"isToastExpanded(i) && toast.error?.countermeasures\"\n class=\"toast-description\"\n >\n <strong>countermeasures:</strong> {{toast.error?.countermeasures}}\n </p>\n <p\n *ngIf=\"isReportRecommendationVisible(toast,i)\"\n class=\"toast-description\"\n >\n Please copy the details and report the error.\n </p>\n </vdk-toast>\n</vdk-toast-container>\n", styles: ["/*!\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */.toast-container{z-index:1051}.toast-container .toast-title{max-width:300px}.toast-container .toast-description{margin-top:5px;max-width:330px}\n"] }] }], function () { return [{ type: i1.ToastService }, { type: i2.ClipboardService }]; }, null); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3RzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2ZlYXR1cmVzL3RvYXN0cy93aWRnZXQvdG9hc3RzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2ZlYXR1cmVzL3RvYXN0cy93aWRnZXQvdG9hc3RzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFJbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWhELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7O0lDUXZDLDRCQUdDLGFBQUE7SUFDVyw2QkFBYTtJQUFBLGlCQUFTO0lBQUMsWUFDbkM7SUFBQSxpQkFBSTs7O0lBRCtCLGVBQ25DO0lBRG1DLDRGQUNuQzs7O0lBQ0EsNEJBR0MsYUFBQTtJQUNXLGdDQUFnQjtJQUFBLGlCQUFTO0lBQUMsWUFDdEM7SUFBQSxpQkFBSTs7O0lBRGtDLGVBQ3RDO0lBRHNDLCtGQUN0Qzs7O0lBQ0EsNEJBR0M7SUFDRywrREFDSjtJQUFBLGlCQUFJOzs7O0lBOUJSLG9DQVNDO0lBSEcsaU9BQWEsd0JBQWMsSUFBQywrT0FDTixpQ0FBc0IsSUFEaEIsMk9BRUosc0NBQTJCLElBRnZCO0lBSTVCLDhCQUF5QjtJQUFBLFlBQWU7SUFBQSxpQkFBTTtJQUU5Qyw0QkFBNkI7SUFBQSxZQUFxQjtJQUFBLGlCQUFJO0lBQ3RELHdFQUtJO0lBQ0osd0VBS0k7SUFDSix3RUFLSTtJQUNSLGlCQUFZOzs7OztJQTdCUixvQ0FBbUIsK0NBQUEsaUVBQUEsZ0VBQUE7SUFRTSxlQUFlO0lBQWYsb0NBQWU7SUFFWCxlQUFxQjtJQUFyQiwwQ0FB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aWdodCAyMDIzLTIwMjUgQnJvYWRjb21cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ2xpcGJvYXJkU2VydmljZSB9IGZyb20gJ25neC1jbGlwYm9hcmQnO1xuXG5pbXBvcnQgeyBWbXdUb2FzdFR5cGUgfSBmcm9tICcuLi8uLi8uLi9jb21tb25zJztcblxuaW1wb3J0IHsgVGF1cnVzT2JqZWN0IH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uJztcblxuaW1wb3J0IHsgVG9hc3QgfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlJztcblxuaW50ZXJmYWNlIFRvYXN0SW50ZXJuYWwgZXh0ZW5kcyBUb2FzdCB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICB0aW1lOiBEYXRlO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZXJyb3I/OiBhbnk7XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnc2hhcmVkLXRvYXN0cycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RvYXN0cy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vdG9hc3RzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgVG9hc3RzQ29tcG9uZW50IGV4dGVuZHMgVGF1cnVzT2JqZWN0IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBwcml2YXRlIHN0YXRpYyB0b2FzdE1lc3NhZ2VDb3VudGVyID0gMDtcblxuICAgIHRvYXN0czogVG9hc3RJbnRlcm5hbFtdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpcGJvYXJkU2VydmljZTogQ2xpcGJvYXJkU2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRvYXN0cyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIE9wdGltaXplIFRvYXN0IHJlbmRlcmluZyB1c2luZyB0cmFja2luZyB3aXRoIGF1dG8gaW5jcmVtZW50ZWQgSUQgcGVyIFRvYXN0LlxuICAgICAqL1xuICAgIHRyYWNrQnlSZW5kZXJpbmcoX2luZGV4OiBudW1iZXIsIHRvYXN0OiBUb2FzdEludGVybmFsKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRvYXN0LmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFJldHVybnMgaWYgVG9hc3Qgd2l0aCBnaXZlbiBpbmRleCBpcyBleHBhbmRlZC5cbiAgICAgKi9cbiAgICBpc1RvYXN0RXhwYW5kZWQoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2FzdHNbaW5kZXhdLmV4cGFuZGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIEV2YWx1YXRlIGlmIHJlY29tbWVuZGF0aW9uIHRleHQgZm9yIENvcHkgYW5kIFJlcG9ydCBpcyB2aXNpYmxlLlxuICAgICAqL1xuICAgIGlzUmVwb3J0UmVjb21tZW5kYXRpb25WaXNpYmxlKHRvYXN0OiBUb2FzdEludGVybmFsLCBpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVG9hc3RFeHBhbmRlZChpbmRleCkgJiYgdGhpcy5faXNUeXBlRXJyb3IodG9hc3QpICYmIHRvYXN0LnJlc3BvbnNlU3RhdHVzICE9PSA1MDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogUmVtb3ZlIFRvYXN0IG1lc3NhZ2UuXG4gICAgICovXG4gICAgcmVtb3ZlVG9hc3QoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnRvYXN0cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFRvZ2dsZSBUb2FzdCBleHBhbmQgZGV0YWlscyAoZXhwYW5kL2NvbGxhcHNlKS5cbiAgICAgKi9cbiAgICB0b2dnbGVUb2FzdEV4cGFuZERldGFpbHMoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnRvYXN0c1tpbmRleF0uZXhwYW5kZWQgPSAhdGhpcy50b2FzdHNbaW5kZXhdLmV4cGFuZGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIENvcHkgdG8gY2xpcGJvYXJkIHByb3ZpZGVkIG9iamVjdC5cbiAgICAgKi9cbiAgICBjb3B5VG9DbGlwYm9hcmQoY29weTogVG9hc3RJbnRlcm5hbCk6IHZvaWQge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jbGlwYm9hcmRTZXJ2aWNlLmNvcHkoSlNPTi5zdHJpbmdpZnkoY29weSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuXG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVDb3B5QWN0aW9uRXJyb3IoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFJldHVybnMgVG9hc3QgdGltZW91dCBpbiB1bml0IHNlY29uZHMuXG4gICAgICovXG4gICAgZ2V0VGltZW91dCh0b2FzdDogVG9hc3RJbnRlcm5hbCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1R5cGVFcnJvcih0b2FzdCkgPyAzMCA6IDU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogUmV0dXJucyB0ZXh0IGZvciBCdG4gQ29weVRvQ2xpcGJvYXJkLlxuICAgICAqL1xuICAgIGdldENvcHlUb0NsaXBib2FyZEJ0blRleHQodG9hc3Q6IFRvYXN0SW50ZXJuYWwpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNUeXBlRXJyb3IodG9hc3QpID8gJ0NvcHkgdG8gY2xpcGJvYXJkJyA6ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFJldHVybnMgdGV4dCBmb3IgQnRuIEV4cGFuZC9Db2xsYXBzZS5cbiAgICAgKi9cbiAgICBnZXRFeHBhbmRCdG5UZXh0KHRvYXN0OiBUb2FzdEludGVybmFsLCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzVHlwZUVycm9yKHRvYXN0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNUb2FzdEV4cGFuZGVkKGluZGV4KSA/ICdsZXNzJyA6ICdtb3JlJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldE5vdGlmaWNhdGlvbnMoKS5zdWJzY3JpYmUoKHRvYXN0OiBUb2FzdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAuLi50b2FzdCxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IFRvYXN0c0NvbXBvbmVudC5nZW5lcmF0ZUlEKCksXG4gICAgICAgICAgICAgICAgICAgIHRpbWU6IFRvYXN0c0NvbXBvbmVudC5nZXREYXRlVGltZU5vdygpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRoaXMuY2xpcGJvYXJkU2VydmljZS5jb3B5UmVzcG9uc2UkLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQuaXNTdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUNvcHlBY3Rpb25FcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaXNUeXBlRXJyb3IodG9hc3Q6IFRvYXN0KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0b2FzdC50eXBlID09PSBWbXdUb2FzdFR5cGUuRkFJTFVSRSAmJiAhIXRvYXN0LmVycm9yO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhbmRsZUNvcHlBY3Rpb25FcnJvcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50b2FzdHMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBWbXdUb2FzdFR5cGUuRkFJTFVSRSxcbiAgICAgICAgICAgIHRpdGxlOiBgQ29weSB0byBjbGlwYm9hcmRgLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBUaGUgdmlldyBkZWZpbml0aW9uIGZhaWxlZCB0byBjb3B5IHRvIHRoZSBjbGlwYm9hcmRgLFxuICAgICAgICAgICAgaWQ6IFRvYXN0c0NvbXBvbmVudC5nZW5lcmF0ZUlEKCksXG4gICAgICAgICAgICB0aW1lOiBUb2FzdHNDb21wb25lbnQuZ2V0RGF0ZVRpbWVOb3coKVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbWVtYmVyLW9yZGVyaW5nICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVJRCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy50b2FzdE1lc3NhZ2VDb3VudGVyKys7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0RGF0ZVRpbWVOb3coKTogRGF0ZSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSgpO1xuICAgIH1cbn1cbiIsIjwhLS1cbiAgIH4gQ29weXJpZ2h0IDIwMjMtMjAyNSBCcm9hZGNvbVxuICAgfiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICAtLT5cblxuPHZkay10b2FzdC1jb250YWluZXIgY2xhc3M9XCJ0b2FzdC1jb250YWluZXJcIj5cbiAgICA8dmRrLXRvYXN0XG4gICAgICAgICpuZ0Zvcj1cImxldCB0b2FzdCBvZiB0b2FzdHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlSZW5kZXJpbmdcIlxuICAgICAgICBbdHlwZV09XCJ0b2FzdC50eXBlXCJcbiAgICAgICAgW3RpbWVvdXRTZWNvbmRzXT1cImdldFRpbWVvdXQodG9hc3QpXCJcbiAgICAgICAgW3ByaW1hcnlCdXR0b25UZXh0XT1cImdldENvcHlUb0NsaXBib2FyZEJ0blRleHQodG9hc3QpXCJcbiAgICAgICAgW3NlY29uZGFyeUJ1dHRvblRleHRdPVwiZ2V0RXhwYW5kQnRuVGV4dCh0b2FzdCwgaSlcIlxuICAgICAgICAoZGlzbWlzc2VkKT1cInJlbW92ZVRvYXN0KGkpXCJcbiAgICAgICAgKHByaW1hcnlCdXR0b25DbGljayk9XCJjb3B5VG9DbGlwYm9hcmQodG9hc3QpXCJcbiAgICAgICAgKHNlY29uZGFyeUJ1dHRvbkNsaWNrKT1cInRvZ2dsZVRvYXN0RXhwYW5kRGV0YWlscyhpKVwiXG4gICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidG9hc3QtdGl0bGVcIj57e3RvYXN0LnRpdGxlfX08L2Rpdj5cblxuICAgICAgICA8cCBjbGFzcz1cInRvYXN0LWRlc2NyaXB0aW9uXCI+e3t0b2FzdC5kZXNjcmlwdGlvbn19PC9wPlxuICAgICAgICA8cFxuICAgICAgICAgICAgKm5nSWY9XCJpc1RvYXN0RXhwYW5kZWQoaSkgJiYgdG9hc3QuZXJyb3I/LmNvbnNlcXVlbmNlc1wiXG4gICAgICAgICAgICBjbGFzcz1cInRvYXN0LWRlc2NyaXB0aW9uXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPHN0cm9uZz5jb25zZXF1ZW5jZXM6PC9zdHJvbmc+IHt7dG9hc3QuZXJyb3I/LmNvbnNlcXVlbmNlc319XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHBcbiAgICAgICAgICAgICpuZ0lmPVwiaXNUb2FzdEV4cGFuZGVkKGkpICYmIHRvYXN0LmVycm9yPy5jb3VudGVybWVhc3VyZXNcIlxuICAgICAgICAgICAgY2xhc3M9XCJ0b2FzdC1kZXNjcmlwdGlvblwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxzdHJvbmc+Y291bnRlcm1lYXN1cmVzOjwvc3Ryb25nPiB7e3RvYXN0LmVycm9yPy5jb3VudGVybWVhc3VyZXN9fVxuICAgICAgICA8L3A+XG4gICAgICAgIDxwXG4gICAgICAgICAgICAqbmdJZj1cImlzUmVwb3J0UmVjb21tZW5kYXRpb25WaXNpYmxlKHRvYXN0LGkpXCJcbiAgICAgICAgICAgIGNsYXNzPVwidG9hc3QtZGVzY3JpcHRpb25cIlxuICAgICAgICA+XG4gICAgICAgICAgICBQbGVhc2UgY29weSB0aGUgZGV0YWlscyBhbmQgcmVwb3J0IHRoZSBlcnJvci5cbiAgICAgICAgPC9wPlxuICAgIDwvdmRrLXRvYXN0PlxuPC92ZGstdG9hc3QtY29udGFpbmVyPlxuIl19