@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
JavaScript
/*
* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3RzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2ZlYXR1cmVzL3RvYXN0cy93aWRnZXQvdG9hc3RzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2ZlYXR1cmVzL3RvYXN0cy93aWRnZXQvdG9hc3RzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFJbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWhELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7O0lDUXZDLDRCQUdDLGFBQUE7SUFDVyw2QkFBYTtJQUFBLGlCQUFTO0lBQUMsWUFDbkM7SUFBQSxpQkFBSTs7O0lBRCtCLGVBQ25DO0lBRG1DLDRGQUNuQzs7O0lBQ0EsNEJBR0MsYUFBQTtJQUNXLGdDQUFnQjtJQUFBLGlCQUFTO0lBQUMsWUFDdEM7SUFBQSxpQkFBSTs7O0lBRGtDLGVBQ3RDO0lBRHNDLCtGQUN0Qzs7O0lBQ0EsNEJBR0M7SUFDRywrREFDSjtJQUFBLGlCQUFJOzs7O0lBOUJSLG9DQVNDO0lBSEcsaU9BQWEsd0JBQWMsSUFBQywrT0FDTixpQ0FBc0IsSUFEaEIsMk9BRUosc0NBQTJCLElBRnZCO0lBSTVCLDhCQUF5QjtJQUFBLFlBQWU7SUFBQSxpQkFBTTtJQUU5Qyw0QkFBNkI7SUFBQSxZQUFxQjtJQUFBLGlCQUFJO0lBQ3RELHdFQUtJO0lBQ0osd0VBS0k7SUFDSix3RUFLSTtJQUNSLGlCQUFZOzs7OztJQTdCUixvQ0FBbUIsK0NBQUEsaUVBQUEsZ0VBQUE7SUFRTSxlQUFlO0lBQWYsb0NBQWU7SUFFWCxlQUFxQjtJQUFyQiwwQ0FBcUI7SUFFN0MsZUFBcUQ7SUFBckQsb0hBQXFEO0lBTXJELGVBQXdEO0lBQXhELHVIQUF3RDtJQU14RCxlQUE0QztJQUE1QywyRUFBNEM7O0FESnpELE1BQU0sT0FBTyxlQUFnQixTQUFRLFlBQVk7SUFLN0MsWUFDcUIsWUFBMEIsRUFDMUIsZ0JBQWtDO1FBRW5ELEtBQUssRUFBRSxDQUFDO1FBSFMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUduRCxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsS0FBb0I7UUFDakQsT0FBTyxLQUFLLENBQUMsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWUsQ0FBQyxLQUFhO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDdkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsNkJBQTZCLENBQUMsS0FBb0IsRUFBRSxLQUFhO1FBQzdELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxjQUFjLEtBQUssR0FBRyxDQUFDO0lBQ25HLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVcsQ0FBQyxLQUFhO1FBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCx3QkFBd0IsQ0FBQyxLQUFhO1FBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDL0QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZSxDQUFDLElBQW1CO1FBQy9CLElBQUk7WUFDQSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUNwRDtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVqQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztTQUNqQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVUsQ0FBQyxLQUFvQjtRQUMzQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNILHlCQUF5QixDQUFDLEtBQW9CO1FBQzFDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0IsQ0FBQyxLQUFvQixFQUFFLEtBQWE7UUFDaEQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzFCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7U0FDeEQ7UUFFRCxPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVE7UUFDSixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQVksRUFBRSxFQUFFO1lBQzVELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNiLEdBQUcsS0FBSztnQkFDUixFQUFFLEVBQUUsZUFBZSxDQUFDLFVBQVUsRUFBRTtnQkFDaEMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxjQUFjLEVBQUU7YUFDekMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLEVBQ0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNyRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7YUFDakM7UUFDTCxDQUFDLENBQUMsQ0FDTCxDQUFDO0lBQ04sQ0FBQztJQUVPLFlBQVksQ0FBQyxLQUFZO1FBQzdCLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ2hFLENBQUM7SUFFTyxzQkFBc0I7UUFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDYixJQUFJLEVBQUUsWUFBWSxDQUFDLE9BQU87WUFDMUIsS0FBSyxFQUFFLG1CQUFtQjtZQUMxQixXQUFXLEVBQUUscURBQXFEO1lBQ2xFLEVBQUUsRUFBRSxlQUFlLENBQUMsVUFBVSxFQUFFO1lBQ2hDLElBQUksRUFBRSxlQUFlLENBQUMsY0FBYyxFQUFFO1NBQ3pDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCx1REFBdUQ7SUFDL0MsTUFBTSxDQUFDLFVBQVU7UUFDckIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRU8sTUFBTSxDQUFDLGNBQWM7UUFDekIsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3RCLENBQUM7O0FBOUhjLG1DQUFtQixHQUFHLENBQUUsQ0FBQTs4RUFEOUIsZUFBZTtrRUFBZixlQUFlO1FDdkI1Qiw4Q0FBNkM7UUFDekMsNEVBK0JZO1FBQ2hCLGlCQUFzQjs7UUEvQkksZUFBVztRQUFYLG9DQUFXLHNDQUFBOzt1RkRxQnhCLGVBQWU7Y0FMM0IsU0FBUzsyQkFDSSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDIzLTIwMjUgQnJvYWRjb21cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ2xpcGJvYXJkU2VydmljZSB9IGZyb20gJ25neC1jbGlwYm9hcmQnO1xuXG5pbXBvcnQgeyBWbXdUb2FzdFR5cGUgfSBmcm9tICcuLi8uLi8uLi9jb21tb25zJztcblxuaW1wb3J0IHsgVGF1cnVzT2JqZWN0IH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uJztcblxuaW1wb3J0IHsgVG9hc3QgfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlJztcblxuaW50ZXJmYWNlIFRvYXN0SW50ZXJuYWwgZXh0ZW5kcyBUb2FzdCB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICB0aW1lOiBEYXRlO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZXJyb3I/OiBhbnk7XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnc2hhcmVkLXRvYXN0cycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RvYXN0cy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vdG9hc3RzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgVG9hc3RzQ29tcG9uZW50IGV4dGVuZHMgVGF1cnVzT2JqZWN0IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBwcml2YXRlIHN0YXRpYyB0b2FzdE1lc3NhZ2VDb3VudGVyID0gMDtcblxuICAgIHRvYXN0czogVG9hc3RJbnRlcm5hbFtdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpcGJvYXJkU2VydmljZTogQ2xpcGJvYXJkU2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRvYXN0cyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIE9wdGltaXplIFRvYXN0IHJlbmRlcmluZyB1c2luZyB0cmFja2luZyB3aXRoIGF1dG8gaW5jcmVtZW50ZWQgSUQgcGVyIFRvYXN0LlxuICAgICAqL1xuICAgIHRyYWNrQnlSZW5kZXJpbmcoX2luZGV4OiBudW1iZXIsIHRvYXN0OiBUb2FzdEludGVybmFsKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRvYXN0LmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFJldHVybnMgaWYgVG9hc3Qgd2l0aCBnaXZlbiBpbmRleCBpcyBleHBhbmRlZC5cbiAgICAgKi9cbiAgICBpc1RvYXN0RXhwYW5kZWQoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2FzdHNbaW5kZXhdLmV4cGFuZGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIEV2YWx1YXRlIGlmIHJlY29tbWVuZGF0aW9uIHRleHQgZm9yIENvcHkgYW5kIFJlcG9ydCBpcyB2aXNpYmxlLlxuICAgICAqL1xuICAgIGlzUmVwb3J0UmVjb21tZW5kYXRpb25WaXNpYmxlKHRvYXN0OiBUb2FzdEludGVybmFsLCBpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVG9hc3RFeHBhbmRlZChpbmRleCkgJiYgdGhpcy5faXNUeXBlRXJyb3IodG9hc3QpICYmIHRvYXN0LnJlc3BvbnNlU3RhdHVzICE9PSA1MDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogUmVtb3ZlIFRvYXN0IG1lc3NhZ2UuXG4gICAgICovXG4gICAgcmVtb3ZlVG9hc3QoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnRvYXN0cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFRvZ2dsZSBUb2FzdCBleHBhbmQgZGV0YWlscyAoZXhwYW5kL2NvbGxhcHNlKS5cbiAgICAgKi9cbiAgICB0b2dnbGVUb2FzdEV4cGFuZERldGFpbHMoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnRvYXN0c1tpbmRleF0uZXhwYW5kZWQgPSAhdGhpcy50b2FzdHNbaW5kZXhdLmV4cGFuZGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIENvcHkgdG8gY2xpcGJvYXJkIHByb3ZpZGVkIG9iamVjdC5cbiAgICAgKi9cbiAgICBjb3B5VG9DbGlwYm9hcmQoY29weTogVG9hc3RJbnRlcm5hbCk6IHZvaWQge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jbGlwYm9hcmRTZXJ2aWNlLmNvcHkoSlNPTi5zdHJpbmdpZnkoY29weSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuXG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVDb3B5QWN0aW9uRXJyb3IoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFJldHVybnMgVG9hc3QgdGltZW91dCBpbiB1bml0IHNlY29uZHMuXG4gICAgICovXG4gICAgZ2V0VGltZW91dCh0b2FzdDogVG9hc3RJbnRlcm5hbCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1R5cGVFcnJvcih0b2FzdCkgPyAzMCA6IDU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKiogUmV0dXJucyB0ZXh0IGZvciBCdG4gQ29weVRvQ2xpcGJvYXJkLlxuICAgICAqL1xuICAgIGdldENvcHlUb0NsaXBib2FyZEJ0blRleHQodG9hc3Q6IFRvYXN0SW50ZXJuYWwpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNUeXBlRXJyb3IodG9hc3QpID8gJ0NvcHkgdG8gY2xpcGJvYXJkJyA6ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICoqIFJldHVybnMgdGV4dCBmb3IgQnRuIEV4cGFuZC9Db2xsYXBzZS5cbiAgICAgKi9cbiAgICBnZXRFeHBhbmRCdG5UZXh0KHRvYXN0OiBUb2FzdEludGVybmFsLCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzVHlwZUVycm9yKHRvYXN0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNUb2FzdEV4cGFuZGVkKGluZGV4KSA/ICdsZXNzJyA6ICdtb3JlJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldE5vdGlmaWNhdGlvbnMoKS5zdWJzY3JpYmUoKHRvYXN0OiBUb2FzdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAuLi50b2FzdCxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IFRvYXN0c0NvbXBvbmVudC5nZW5lcmF0ZUlEKCksXG4gICAgICAgICAgICAgICAgICAgIHRpbWU6IFRvYXN0c0NvbXBvbmVudC5nZXREYXRlVGltZU5vdygpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRoaXMuY2xpcGJvYXJkU2VydmljZS5jb3B5UmVzcG9uc2UkLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQuaXNTdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUNvcHlBY3Rpb25FcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaXNUeXBlRXJyb3IodG9hc3Q6IFRvYXN0KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0b2FzdC50eXBlID09PSBWbXdUb2FzdFR5cGUuRkFJTFVSRSAmJiAhIXRvYXN0LmVycm9yO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhbmRsZUNvcHlBY3Rpb25FcnJvcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50b2FzdHMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBWbXdUb2FzdFR5cGUuRkFJTFVSRSxcbiAgICAgICAgICAgIHRpdGxlOiBgQ29weSB0byBjbGlwYm9hcmRgLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBUaGUgdmlldyBkZWZpbml0aW9uIGZhaWxlZCB0byBjb3B5IHRvIHRoZSBjbGlwYm9hcmRgLFxuICAgICAgICAgICAgaWQ6IFRvYXN0c0NvbXBvbmVudC5nZW5lcmF0ZUlEKCksXG4gICAgICAgICAgICB0aW1lOiBUb2FzdHNDb21wb25lbnQuZ2V0RGF0ZVRpbWVOb3coKVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbWVtYmVyLW9yZGVyaW5nICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVJRCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy50b2FzdE1lc3NhZ2VDb3VudGVyKys7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0RGF0ZVRpbWVOb3coKTogRGF0ZSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSgpO1xuICAgIH1cbn1cbiIsIjwhLS1cbiAgIH4gQ29weXJpZ2h0IDIwMjMtMjAyNSBCcm9hZGNvbVxuICAgfiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICAtLT5cblxuPHZkay10b2FzdC1jb250YWluZXIgY2xhc3M9XCJ0b2FzdC1jb250YWluZXJcIj5cbiAgICA8dmRrLXRvYXN0XG4gICAgICAgICpuZ0Zvcj1cImxldCB0b2FzdCBvZiB0b2FzdHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlSZW5kZXJpbmdcIlxuICAgICAgICBbdHlwZV09XCJ0b2FzdC50eXBlXCJcbiAgICAgICAgW3RpbWVvdXRTZWNvbmRzXT1cImdldFRpbWVvdXQodG9hc3QpXCJcbiAgICAgICAgW3ByaW1hcnlCdXR0b25UZXh0XT1cImdldENvcHlUb0NsaXBib2FyZEJ0blRleHQodG9hc3QpXCJcbiAgICAgICAgW3NlY29uZGFyeUJ1dHRvblRleHRdPVwiZ2V0RXhwYW5kQnRuVGV4dCh0b2FzdCwgaSlcIlxuICAgICAgICAoZGlzbWlzc2VkKT1cInJlbW92ZVRvYXN0KGkpXCJcbiAgICAgICAgKHByaW1hcnlCdXR0b25DbGljayk9XCJjb3B5VG9DbGlwYm9hcmQodG9hc3QpXCJcbiAgICAgICAgKHNlY29uZGFyeUJ1dHRvbkNsaWNrKT1cInRvZ2dsZVRvYXN0RXhwYW5kRGV0YWlscyhpKVwiXG4gICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidG9hc3QtdGl0bGVcIj57e3RvYXN0LnRpdGxlfX08L2Rpdj5cblxuICAgICAgICA8cCBjbGFzcz1cInRvYXN0LWRlc2NyaXB0aW9uXCI+e3t0b2FzdC5kZXNjcmlwdGlvbn19PC9wPlxuICAgICAgICA8cFxuICAgICAgICAgICAgKm5nSWY9XCJpc1RvYXN0RXhwYW5kZWQoaSkgJiYgdG9hc3QuZXJyb3I/LmNvbnNlcXVlbmNlc1wiXG4gICAgICAgICAgICBjbGFzcz1cInRvYXN0LWRlc2NyaXB0aW9uXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPHN0cm9uZz5jb25zZXF1ZW5jZXM6PC9zdHJvbmc+IHt7dG9hc3QuZXJyb3I/LmNvbnNlcXVlbmNlc319XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHBcbiAgICAgICAgICAgICpuZ0lmPVwiaXNUb2FzdEV4cGFuZGVkKGkpICYmIHRvYXN0LmVycm9yPy5jb3VudGVybWVhc3VyZXNcIlxuICAgICAgICAgICAgY2xhc3M9XCJ0b2FzdC1kZXNjcmlwdGlvblwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxzdHJvbmc+Y291bnRlcm1lYXN1cmVzOjwvc3Ryb25nPiB7e3RvYXN0LmVycm9yPy5jb3VudGVybWVhc3VyZXN9fVxuICAgICAgICA8L3A+XG4gICAgICAgIDxwXG4gICAgICAgICAgICAqbmdJZj1cImlzUmVwb3J0UmVjb21tZW5kYXRpb25WaXNpYmxlKHRvYXN0LGkpXCJcbiAgICAgICAgICAgIGNsYXNzPVwidG9hc3QtZGVzY3JpcHRpb25cIlxuICAgICAgICA+XG4gICAgICAgICAgICBQbGVhc2UgY29weSB0aGUgZGV0YWlscyBhbmQgcmVwb3J0IHRoZSBlcnJvci5cbiAgICAgICAgPC9wPlxuICAgIDwvdmRrLXRvYXN0PlxuPC92ZGstdG9hc3QtY29udGFpbmVyPlxuIl19