@versatiledatakit/shared
Version:
Versatile Data Kit Shared library enables reusability of shared features like: NgRx Redux, Error Handlers, Utils, Generic Components, etc.
141 lines • 19.3 kB
JavaScript
/*
* Copyright 2023-2025 Broadcom
* SPDX-License-Identifier: Apache-2.0
*/
/* eslint-disable @typescript-eslint/unified-signatures */
import { Injectable } from '@angular/core';
import { HttpErrorResponse } from '@angular/common/http';
import { throwError } from 'rxjs';
import { VmwToastType } from '../../../commons';
import { CollectionsUtil } from '../../../utils';
import * as i0 from "@angular/core";
import * as i1 from "../../toasts/service";
/**
* ** Error handler service.
*/
export class ErrorHandlerService {
/**
* ** Constructor.
*/
constructor(toastService) {
this.toastService = toastService;
/**
* ** Handle Error in rxjs stream.
*
* - Show Toast message
* - Log it to console
* - Re-throw new Error('Something unexpected happened')
*/
this.handleError = (error) => {
this.processError(error);
const newError = new Error('Something unexpected happened');
return throwError(() => newError);
};
}
processError(error, overriddenConfig) {
if (error instanceof HttpErrorResponse) {
if (error.error instanceof ErrorEvent) {
// A client-side or network error occurred.
const toast = ErrorHandlerService._createToastConfigForError(error, overriddenConfig);
console.error(`An error occurred: ${error.error.message}`);
this.toastService.show(toast);
}
else {
// Server side error occurred.
const toast = ErrorHandlerService._createToastConfigForHttpErrorResponse(error, overriddenConfig);
console.error(error.error ?? error);
this.toastService.show(toast);
}
}
else {
// Runtime error occurred, potential bug.
const toast = ErrorHandlerService._createToastConfigForError(error, overriddenConfig);
console.error(error);
this.toastService.show(toast);
}
}
/* eslint-disable @typescript-eslint/member-ordering */
static _createToastConfigForHttpErrorResponse(error, overriddenConfig) {
let title;
let description;
let rootError = error.error;
const responseStatus = error.status;
if (error.status === 403) {
title = 'ACCESS DENIED';
description =
'You are not authorized for this content! ' +
'If you think it is a mistake please contact the data owners and request them to grant you access.';
}
else if (error.status === 500) {
title = error.error?.what ? error.error.what : 'Internal Server Error';
description = error.error?.why
? error.error.why
: 'We are sorry for the inconvenience.' +
'Please try again or come back later, and if the issue persists – please copy the details and report the error.';
}
else if (CollectionsUtil.isNil(error.error)) {
title = ErrorHandlerService._getErrorTitle(error.status);
description = 'Operation failed';
rootError = error;
}
else if (error.error && error.error.what && error.error.why) {
title = error.error.what;
description = error.error.why;
}
else if (typeof error.error === 'string') {
title = error.error;
description = error.message;
}
else {
title = ErrorHandlerService._getErrorTitle(error.status);
description = error.message;
}
return ErrorHandlerService._createToastConfig(title, description, rootError, responseStatus, overriddenConfig);
}
static _createToastConfigForError(error, overriddenConfig) {
return ErrorHandlerService._createToastConfig(`An error occurred: ${error?.message}`, 'We are sorry for the inconvenience.' +
'Please try again or come back later, and if the issue persists – please copy the details and report the error.', error, undefined, overriddenConfig);
}
static _getErrorTitle(status) {
switch (status) {
case 400:
return 'Invalid param';
case 401:
return 'Unauthorized';
case 404:
return 'Not Found';
case 405:
return 'Not Allowed';
case 422:
return 'Invalid operation';
default:
return 'Unknown Error';
}
}
static _createToastConfig(title, description, error, responseStatus = null, overriddenConfig = null) {
let toastConfig = {
title,
description,
type: VmwToastType.FAILURE,
error,
responseStatus
};
if (CollectionsUtil.isDefined(overriddenConfig)) {
toastConfig = {
...toastConfig,
...overriddenConfig,
extendedData: {
title,
description
}
};
}
return toastConfig;
}
}
ErrorHandlerService.ɵfac = function ErrorHandlerService_Factory(t) { return new (t || ErrorHandlerService)(i0.ɵɵinject(i1.ToastService)); };
ErrorHandlerService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: ErrorHandlerService, factory: ErrorHandlerService.ɵfac });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ErrorHandlerService, [{
type: Injectable
}], function () { return [{ type: i1.ToastService }]; }, null); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItaGFuZGxlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2hhcmVkL3NyYy9saWIvZmVhdHVyZXMvZXJyb3ItaGFuZGxlci9zZXJ2aWNlcy9lcnJvci1oYW5kbGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsMERBQTBEO0FBRTFELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFekQsT0FBTyxFQUFjLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUF5QmpEOztHQUVHO0FBRUgsTUFBTSxPQUFPLG1CQUFtQjtJQUM1Qjs7T0FFRztJQUNILFlBQTZCLFlBQTBCO1FBQTFCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBRXZEOzs7Ozs7V0FNRztRQUNILGdCQUFXLEdBQUcsQ0FBQyxLQUFZLEVBQXFCLEVBQUU7WUFDOUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUV6QixNQUFNLFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1lBRTVELE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQztJQWZ3RCxDQUFDO0lBeUIzRCxZQUFZLENBQUMsS0FBWSxFQUFFLGdCQUFxQztRQUM1RCxJQUFJLEtBQUssWUFBWSxpQkFBaUIsRUFBRTtZQUNwQyxJQUFJLEtBQUssQ0FBQyxLQUFLLFlBQVksVUFBVSxFQUFFO2dCQUNuQywyQ0FBMkM7Z0JBQzNDLE1BQU0sS0FBSyxHQUFH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Q0w7UUFFRCxPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDOztzRkFwSlEsbUJBQW1CO3lFQUFuQixtQkFBbUIsV0FBbkIsbUJBQW1CO3VGQUFuQixtQkFBbUI7Y0FEL0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAyMy0yMDI1IEJyb2FkY29tXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC91bmlmaWVkLXNpZ25hdHVyZXMgKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgVm13VG9hc3RUeXBlIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9ucyc7XG5cbmltcG9ydCB7IENvbGxlY3Rpb25zVXRpbCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcblxuaW1wb3J0IHsgRm9ybWF0dGVkRXJyb3IsIFRvYXN0IH0gZnJvbSAnLi4vLi4vdG9hc3RzL21vZGVsJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uL3RvYXN0cy9zZXJ2aWNlJztcblxuLyoqXG4gKiAqKiBDb25maWcgZm9yIFRvYXN0IG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JIYW5kbGVyQ29uZmlnIHtcbiAgICAvKipcbiAgICAgKiAqKiBUb2FzdCB0aXRsZS5cbiAgICAgKi9cbiAgICB0aXRsZT86IFRvYXN0Wyd0aXRsZSddO1xuXG4gICAgLyoqXG4gICAgICogKiogVG9hc3QgZGVzY3JpcHRpb24uXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBUb2FzdFsnZGVzY3JpcHRpb24nXTtcblxuICAgIC8qKlxuICAgICAqICoqIFRvYXN0IHR5cGUuXG4gICAgICovXG4gICAgdHlwZT86IFRvYXN0Wyd0eXBlJ107XG59XG5cbi8qKlxuICogKiogRXJyb3IgaGFuZGxlciBzZXJ2aWNlLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRXJyb3JIYW5kbGVyU2VydmljZSB7XG4gICAgLyoqXG4gICAgICogKiogQ29uc3RydWN0b3IuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSkge31cblxuICAgIC8qKlxuICAgICAqICoqIEhhbmRsZSBFcnJvciBpbiByeGpzIHN0cmVhbS5cbiAgICAgKlxuICAgICAqICAgLSBTaG93IFRvYXN0IG1lc3NhZ2VcbiAgICAgKiAgIC0gTG9nIGl0IHRvIGNvbnNvbGVcbiAgICAgKiAgIC0gUmUtdGhyb3cgbmV3IEVycm9yKCdTb21ldGhpbmcgdW5leHBlY3RlZCBoYXBwZW5lZCcpXG4gICAgICovXG4gICAgaGFuZGxlRXJyb3IgPSAoZXJyb3I6IEVycm9yKTogT2JzZXJ2YWJsZTxuZXZlcj4gPT4ge1xuICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcihlcnJvcik7XG5cbiAgICAgICAgY29uc3QgbmV3RXJyb3IgPSBuZXcgRXJyb3IoJ1NvbWV0aGluZyB1bmV4cGVjdGVkIGhhcHBlbmVkJyk7XG5cbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3RXJyb3IpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiAqKiBQcm9jZXNzIEVycm9yLlxuICAgICAqXG4gICAgICogICAtIFNob3cgVG9hc3QgbWVzc2FnZVxuICAgICAqICAgLSBMb2cgaXQgdG8gY29uc29sZVxuICAgICAqL1xuICAgIHByb2Nlc3NFcnJvcihlcnJvcjogRXJyb3IpOiB2b2lkO1xuICAgIHByb2Nlc3NFcnJvcihlcnJvcjogRXJyb3IsIG92ZXJyaWRkZW5Db25maWc6IEVycm9ySGFuZGxlckNvbmZpZyk6IHZvaWQ7XG4gICAgcHJvY2Vzc0Vycm9yKGVycm9yOiBFcnJvciwgb3ZlcnJpZGRlbkNvbmZpZz86IEVycm9ySGFuZGxlckNvbmZpZyk6IHZvaWQge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgaWYgKGVycm9yLmVycm9yIGluc3RhbmNlb2YgRXJyb3JFdmVudCkge1xuICAgICAgICAgICAgICAgIC8vIEEgY2xpZW50LXNpZGUgb3IgbmV0d29yayBlcnJvciBvY2N1cnJlZC5cbiAgICAgICAgICAgICAgICBjb25zdCB0b2FzdCA9IEVycm9ySGFuZGxlclNlcnZpY2UuX2NyZWF0ZVRvYXN0Q29uZmlnRm9yRXJyb3IoZXJyb3IsIG92ZXJyaWRkZW5Db25maWcpO1xuXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQW4gZXJyb3Igb2NjdXJyZWQ6ICR7ZXJyb3IuZXJyb3IubWVzc2FnZX1gKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3codG9hc3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBTZXJ2ZXIgc2lkZSBlcnJvciBvY2N1cnJlZC5cbiAgICAgICAgICAgICAgICBjb25zdCB0b2FzdCA9IEVycm9ySGFuZGxlclNlcnZpY2UuX2NyZWF0ZVRvYXN0Q29uZmlnRm9ySHR0cEVycm9yUmVzcG9uc2UoZXJyb3IsIG92ZXJyaWRkZW5Db25maWcpO1xuXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvci5lcnJvciA/PyBlcnJvcik7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KHRvYXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJ1bnRpbWUgZXJyb3Igb2NjdXJyZWQsIHBvdGVudGlhbCBidWcuXG4gICAgICAgICAgICBjb25zdCB0b2FzdCA9IEVycm9ySGFuZGxlclNlcnZpY2UuX2NyZWF0ZVRvYXN0Q29uZmlnRm9yRXJyb3IoZXJyb3IsIG92ZXJyaWRkZW5Db25maWcpO1xuXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcblxuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyh0b2FzdCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbWVtYmVyLW9yZGVyaW5nICovXG5cbiAgICBwcml2YXRlIHN0YXRpYyBfY3JlYXRlVG9hc3RDb25maWdGb3JIdHRwRXJyb3JSZXNwb25zZShlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UsIG92ZXJyaWRkZW5Db25maWc6IEVycm9ySGFuZGxlckNvbmZpZyk6IFRvYXN0IHtcbiAgICAgICAgbGV0IHRpdGxlOiBzdHJpbmc7XG4gICAgICAgIGxldCBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgICBsZXQgcm9vdEVycm9yOiBFcnJvciA9IGVycm9yLmVycm9yIGFzIEVycm9yO1xuICAgICAgICBjb25zdCByZXNwb25zZVN0YXR1cyA9IGVycm9yLnN0YXR1cztcblxuICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIHRpdGxlID0gJ0FDQ0VTUyBERU5JRUQnO1xuICAgICAgICAgICAgZGVzY3JpcHRpb24gPVxuICAgICAgICAgICAgICAgICdZb3UgYXJlIG5vdCBhdXRob3JpemVkIGZvciB0aGlzIGNvbnRlbnQhICcgK1xuICAgICAgICAgICAgICAgICdJZiB5b3UgdGhpbmsgaXQgaXMgYSBtaXN0YWtlIHBsZWFzZSBjb250YWN0IHRoZSBkYXRhIG93bmVycyBhbmQgcmVxdWVzdCB0aGVtIHRvIGdyYW50IHlvdSBhY2Nlc3MuJztcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvci5zdGF0dXMgPT09IDUwMCkge1xuICAgICAgICAgICAgdGl0bGUgPSAoZXJyb3IuZXJyb3IgYXMgRm9ybWF0dGVkRXJyb3IpPy53aGF0ID8gKGVycm9yLmVycm9yIGFzIEZvcm1hdHRlZEVycm9yKS53aGF0IDogJ0ludGVybmFsIFNlcnZlciBFcnJvcic7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IChlcnJvci5lcnJvciBhcyBGb3JtYXR0ZWRFcnJvcik/LndoeVxuICAgICAgICAgICAgICAgID8gKGVycm9yLmVycm9yIGFzIEZvcm1hdHRlZEVycm9yKS53aHlcbiAgICAgICAgICAgICAgICA6ICdXZSBhcmUgc29ycnkgZm9yIHRoZSBpbmNvbnZlbmllbmNlLicgK1xuICAgICAgICAgICAgICAgICAgJ1BsZWFzZSB0cnkgYWdhaW4gb3IgY29tZSBiYWNrIGxhdGVyLCBhbmQgaWYgdGhlIGlzc3VlIHBlcnNpc3RzIOKAkyBwbGVhc2UgY29weSB0aGUgZGV0YWlscyBhbmQgcmVwb3J0IHRoZSBlcnJvci4nO1xuICAgICAgICB9IGVsc2UgaWYgKENvbGxlY3Rpb25zVXRpbC5pc05pbChlcnJvci5lcnJvcikpIHtcbiAgICAgICAgICAgIHRpdGxlID0gRXJyb3JIYW5kbGVyU2VydmljZS5fZ2V0RXJyb3JUaXRsZShlcnJvci5zdGF0dXMpO1xuICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAnT3BlcmF0aW9uIGZhaWxlZCc7XG4gICAgICAgICAgICByb290RXJyb3IgPSBlcnJvcjtcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvci5lcnJvciAmJiAoZXJyb3IuZXJyb3IgYXMgRm9ybWF0dGVkRXJyb3IpLndoYXQgJiYgKGVycm9yLmVycm9yIGFzIEZvcm1hdHRlZEVycm9yKS53aHkpIHtcbiAgICAgICAgICAgIHRpdGxlID0gKGVycm9yLmVycm9yIGFzIEZvcm1hdHRlZEVycm9yKS53aGF0O1xuICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAoZXJyb3IuZXJyb3IgYXMgRm9ybWF0dGVkRXJyb3IpLndoeTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXJyb3IuZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aXRsZSA9IGVycm9yLmVycm9yO1xuICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBlcnJvci5tZXNzYWdlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGl0bGUgPSBFcnJvckhhbmRsZXJTZXJ2aWNlLl9nZXRFcnJvclRpdGxlKGVycm9yLnN0YXR1cyk7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IGVycm9yLm1lc3NhZ2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gRXJyb3JIYW5kbGVyU2VydmljZS5fY3JlYXRlVG9hc3RDb25maWcodGl0bGUsIGRlc2NyaXB0aW9uLCByb290RXJyb3IsIHJlc3BvbnNlU3RhdHVzLCBvdmVycmlkZGVuQ29uZmlnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfY3JlYXRlVG9hc3RDb25maWdGb3JFcnJvcihlcnJvcjogRXJyb3IsIG92ZXJyaWRkZW5Db25maWc6IEVycm9ySGFuZGxlckNvbmZpZyk6IFRvYXN0IHtcbiAgICAgICAgcmV0dXJuIEVycm9ySGFuZGxlclNlcnZpY2UuX2NyZWF0ZVRvYXN0Q29uZmlnKFxuICAgICAgICAgICAgYEFuIGVycm9yIG9jY3VycmVkOiAke2Vycm9yPy5tZXNzYWdlfWAsXG4gICAgICAgICAgICAnV2UgYXJlIHNvcnJ5IGZvciB0aGUgaW5jb252ZW5pZW5jZS4nICtcbiAgICAgICAgICAgICAgICAnUGxlYXNlIHRyeSBhZ2FpbiBvciBjb21lIGJhY2sgbGF0ZXIsIGFuZCBpZiB0aGUgaXNzdWUgcGVyc2lzdHMg4oCTIHBsZWFzZSBjb3B5IHRoZSBkZXRhaWxzIGFuZCByZXBvcnQgdGhlIGVycm9yLicsXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG92ZXJyaWRkZW5Db25maWdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfZ2V0RXJyb3JUaXRsZShzdGF0dXM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgICAgICAgICBjYXNlIDQwMDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0ludmFsaWQgcGFyYW0nO1xuICAgICAgICAgICAgY2FzZSA0MDE6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdVbmF1dGhvcml6ZWQnO1xuICAgICAgICAgICAgY2FzZSA0MDQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdOb3QgRm91bmQnO1xuICAgICAgICAgICAgY2FzZSA0MDU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdOb3QgQWxsb3dlZCc7XG4gICAgICAgICAgICBjYXNlIDQyMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0ludmFsaWQgb3BlcmF0aW9uJztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdVbmtub3duIEVycm9yJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIF9jcmVhdGVUb2FzdENvbmZpZyhcbiAgICAgICAgdGl0bGU6IHN0cmluZyxcbiAgICAgICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICAgICAgZXJyb3I6IEVycm9yLFxuICAgICAgICByZXNwb25zZVN0YXR1czogbnVtYmVyID0gbnVsbCxcbiAgICAgICAgb3ZlcnJpZGRlbkNvbmZpZzogRXJyb3JIYW5kbGVyQ29uZmlnID0gbnVsbFxuICAgICk6IFRvYXN0IHtcbiAgICAgICAgbGV0IHRvYXN0Q29uZmlnOiBUb2FzdCA9IHtcbiAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICB0eXBlOiBWbXdUb2FzdFR5cGUuRkFJTFVSRSxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgcmVzcG9uc2VTdGF0dXNcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoQ29sbGVjdGlvbnNVdGlsLmlzRGVmaW5lZChvdmVycmlkZGVuQ29uZmlnKSkge1xuICAgICAgICAgICAgdG9hc3RDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgLi4udG9hc3RDb25maWcsXG4gICAgICAgICAgICAgICAgLi4ub3ZlcnJpZGRlbkNvbmZpZyxcbiAgICAgICAgICAgICAgICBleHRlbmRlZERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0b2FzdENvbmZpZztcbiAgICB9XG59XG4iXX0=