UNPKG

@bcodes/ngx-theme-service

Version:

Configurable theme switching service for use with CSS variables

225 lines 16.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { DOCUMENT } from '@angular/common'; import { Inject, Injectable, InjectionToken } from '@angular/core'; import { BehaviorSubject, Subject, timer } from 'rxjs'; import { switchMap, takeUntil, tap } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; /** * Apply a CSS class to the `<html>` element when switching themes * @record */ export function ThemeTransitionConfig() { } if (false) { /** @type {?} */ ThemeTransitionConfig.prototype.className; /** * remove class after duration in milliseconds * @type {?} */ ThemeTransitionConfig.prototype.duration; } /** * @record */ export function ThemeServiceConfig() { } if (false) { /** @type {?} */ ThemeServiceConfig.prototype.themes; /** * theme that should always be on the target element if using explicit default theme * @type {?|undefined} */ ThemeServiceConfig.prototype.defaultTheme; /** * optional transition configuration * @type {?|undefined} */ ThemeServiceConfig.prototype.transitionConfig; /** * themes applied to <html> by default. Supply CSS selector to change * @type {?|undefined} */ ThemeServiceConfig.prototype.targetElementSelector; } /** @type {?} */ export var THEME_CONFIG = new InjectionToken('ThemeService: Config'); // https://angular.io/guide/angular-compiler-options#strictmetadataemit // @dynamic var ThemeService = /** @class */ (function () { function ThemeService(config, document) { this.config = config; this.document = document; this.stopListening$ = new Subject(); this.selectedTheme = new BehaviorSubject(this.config.defaultTheme || ''); this.selectedTheme$ = this.selectedTheme.asObservable(); this.setupSubscription(); } /** * @param {?} className * @return {?} */ ThemeService.prototype.switchTheme = /** * @param {?} className * @return {?} */ function (className) { this.selectedTheme.next(className); }; /** * @private * @return {?} */ ThemeService.prototype.setupSubscription = /** * @private * @return {?} */ function () { var _this = this; /** @type {?} */ var transitionConfig = this.config.transitionConfig; /** @type {?} */ var nonDefaultThemes = this.config.themes.filter((/** * @param {?} c * @return {?} */ function (c) { return c !== _this.config.defaultTheme; })); this.selectedTheme .pipe(tap((/** * @param {?} theme * @return {?} */ function (theme) { _this.removeClasses(nonDefaultThemes); // Conditional literal entries: // https://2ality.com/2017/04/conditional-literal-entries.html /** @type {?} */ var toAdd = tslib_1.__spread((theme ? [theme] : []), (transitionConfig ? [transitionConfig.className] : [])); _this.addClasses(toAdd); })), transitionConfig ? switchMap((/** * @param {?} value * @return {?} */ function (value) { return timer(transitionConfig.duration).pipe(tap((/** * @param {?} x * @return {?} */ function (x) { _this.removeClasses([ transitionConfig.className, ]); }))); })) : tap((/** * @param {?} x * @return {?} */ function (x) { })), takeUntil(this.stopListening$)) .subscribe(); }; /** * @private * @param {?} arr * @return {?} */ ThemeService.prototype.removeClasses = /** * @private * @param {?} arr * @return {?} */ function (arr) { var _a; (_a = this.targetElement.classList).remove.apply(_a, tslib_1.__spread(arr)); }; /** * @private * @param {?} arr * @return {?} */ ThemeService.prototype.addClasses = /** * @private * @param {?} arr * @return {?} */ function (arr) { var _a; (_a = this.targetElement.classList).add.apply(_a, tslib_1.__spread(arr)); }; Object.defineProperty(ThemeService.prototype, "targetElement", { get: /** * @private * @return {?} */ function () { /** @type {?} */ var elem; if (this.config.targetElementSelector) { elem = this.document.querySelector(this.config.targetElementSelector); if (!elem) { console.warn(this.config.targetElementSelector + " not found, defaulting to <html>"); } } if (!elem) { elem = this.document.documentElement; } return elem; }, enumerable: true, configurable: true }); /** * @return {?} */ ThemeService.prototype.ngOnDestroy = /** * @return {?} */ function () { this.stopListening$.next(true); }; ThemeService.decorators = [ { type: Injectable, args: [{ providedIn: 'root', },] } ]; /** @nocollapse */ ThemeService.ctorParameters = function () { return [ { type: undefined, decorators: [{ type: Inject, args: [THEME_CONFIG,] }] }, { type: Document, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; }; /** @nocollapse */ ThemeService.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function ThemeService_Factory() { return new ThemeService(i0.ɵɵinject(THEME_CONFIG), i0.ɵɵinject(i1.DOCUMENT)); }, token: ThemeService, providedIn: "root" }); return ThemeService; }()); export { ThemeService }; if (false) { /** * @type {?} * @private */ ThemeService.prototype.stopListening$; /** * @type {?} * @private */ ThemeService.prototype.selectedTheme; /** @type {?} */ ThemeService.prototype.selectedTheme$; /** * @type {?} * @private */ ThemeService.prototype.config; /** * @type {?} * @private */ ThemeService.prototype.document; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BiY29kZXMvbmd4LXRoZW1lLXNlcnZpY2UvIiwic291cmNlcyI6WyJsaWIvdGhlbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBRzNELDJDQUlDOzs7SUFIRywwQ0FBMkI7Ozs7O0lBRTNCLHlDQUEwQjs7Ozs7QUFHOUIsd0NBUUM7OztJQVBHLG9DQUF1Qzs7Ozs7SUFFdkMsMENBQStCOzs7OztJQUUvQiw4Q0FBa0Q7Ozs7O0lBRWxELG1EQUF3Qzs7O0FBRzVDLE1BQU0sS0FBTyxZQUFZLEdBQUcsSUFBSSxjQUFjLENBQzFDLHNCQUFzQixDQUN6Qjs7O0FBSUQ7SUFVSSxzQkFDa0MsTUFBMEIsRUFDOUIsUUFBa0I7UUFEZCxXQUFNLEdBQU4sTUFBTSxDQUFvQjtRQUM5QixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBUnhDLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQUN4QyxrQkFBYSxHQUE0QixJQUFJLGVBQWUsQ0FDaEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLElBQUksRUFBRSxDQUNqQyxDQUFDO1FBQ0YsbUJBQWMsR0FBdUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQU1uRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUM3QixDQUFDOzs7OztJQUVELGtDQUFXOzs7O0lBQVgsVUFBWSxTQUFpQjtRQUN6QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN2QyxDQUFDOzs7OztJQUVPLHdDQUFpQjs7OztJQUF6QjtRQUFBLGlCQWtDQzs7WUFqQ1MsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0I7O1lBQy9DLGdCQUFnQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU07Ozs7UUFDOUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLEtBQUssS0FBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQTlCLENBQThCLEVBQ3RDO1FBRUQsSUFBSSxDQUFDLGFBQWE7YUFDYixJQUFJLENBQ0QsR0FBRzs7OztRQUFDLFVBQUEsS0FBSztZQUNMLEtBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzs7OztnQkFHL0IsS0FBSyxvQkFDSixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQ3RCLENBQUMsZ0JBQWdCO2dCQUNoQixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7Z0JBQzlCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDWjtZQUNELEtBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQyxFQUFDLEVBQ0YsZ0JBQWdCO1lBQ1osQ0FBQyxDQUFDLFNBQVM7Ozs7WUFBQyxVQUFBLEtBQUs7Z0JBQ1gsT0FBTyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUN4QyxHQUFHOzs7O2dCQUFDLFVBQUEsQ0FBQztvQkFDRCxLQUFJLENBQUMsYUFBYSxDQUFDO3dCQUNmLGdCQUFnQixDQUFDLFNBQVM7cUJBQzdCLENBQUMsQ0FBQztnQkFDUCxDQUFDLEVBQUMsQ0FDTCxDQUFDO1lBQ04sQ0FBQyxFQUFDO1lBQ0osQ0FBQyxDQUFDLEdBQUc7Ozs7WUFBQyxVQUFDLENBQU0sSUFBTSxDQUFDLEVBQUMsRUFDekIsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FDakM7YUFDQSxTQUFTLEVBQUUsQ0FBQztJQUNyQixDQUFDOzs7Ozs7SUFFTyxvQ0FBYTs7Ozs7SUFBckIsVUFBc0IsR0FBYTs7UUFDL0IsQ0FBQSxLQUFBLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFBLENBQUMsTUFBTSw0QkFBSSxHQUFHLEdBQUU7SUFDaEQsQ0FBQzs7Ozs7O0lBRU8saUNBQVU7Ozs7O0lBQWxCLFVBQW1CLEdBQWE7O1FBQzVCLENBQUEsS0FBQSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQSxDQUFDLEdBQUcsNEJBQUksR0FBRyxHQUFFO0lBQzdDLENBQUM7SUFFRCxzQkFBWSx1Q0FBYTs7Ozs7UUFBekI7O2dCQUNRLElBQWlCO1lBQ3JCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRTtnQkFDbkMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUNwQyxDQUFDO2dCQUNGLElBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQ1AsT0FBTyxDQUFDLElBQUksQ0FDTCxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixxQ0FBa0MsQ0FDekUsQ0FBQztpQkFDTDthQUNKO1lBQ0QsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDUCxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7YUFDeEM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDOzs7T0FBQTs7OztJQUVELGtDQUFXOzs7SUFBWDtRQUNJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7O2dCQXJGSixVQUFVLFNBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzs7O2dEQVNRLE1BQU0sU0FBQyxZQUFZO2dCQUNnQixRQUFRLHVCQUEzQyxNQUFNLFNBQUMsUUFBUTs7O3VCQXhDeEI7Q0FrSEMsQUF0RkQsSUFzRkM7U0FuRlksWUFBWTs7Ozs7O0lBQ3JCLHNDQUFnRDs7Ozs7SUFDaEQscUNBRUU7O0lBQ0Ysc0NBQXVFOzs7OztJQUduRSw4QkFBd0Q7Ozs7O0lBQ3hELGdDQUE0QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgdGltZXIgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbi8qKiBBcHBseSBhIENTUyBjbGFzcyB0byB0aGUgYDxodG1sPmAgZWxlbWVudCB3aGVuIHN3aXRjaGluZyB0aGVtZXMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBUaGVtZVRyYW5zaXRpb25Db25maWcge1xyXG4gICAgcmVhZG9ubHkgY2xhc3NOYW1lOiBzdHJpbmc7XHJcbiAgICAvKiogcmVtb3ZlIGNsYXNzIGFmdGVyIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyAqL1xyXG4gICAgcmVhZG9ubHkgZHVyYXRpb246IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUaGVtZVNlcnZpY2VDb25maWcge1xyXG4gICAgcmVhZG9ubHkgdGhlbWVzOiBSZWFkb25seUFycmF5PHN0cmluZz47XHJcbiAgICAvKiogdGhlbWUgdGhhdCBzaG91bGQgYWx3YXlzIGJlIG9uIHRoZSB0YXJnZXQgZWxlbWVudCBpZiB1c2luZyBleHBsaWNpdCBkZWZhdWx0IHRoZW1lICovXHJcbiAgICByZWFkb25seSBkZWZhdWx0VGhlbWU/OiBzdHJpbmc7XHJcbiAgICAvKiogb3B0aW9uYWwgdHJhbnNpdGlvbiBjb25maWd1cmF0aW9uICovXHJcbiAgICByZWFkb25seSB0cmFuc2l0aW9uQ29uZmlnPzogVGhlbWVUcmFuc2l0aW9uQ29uZmlnO1xyXG4gICAgLyoqIHRoZW1lcyBhcHBsaWVkIHRvIDxodG1sPiBieSBkZWZhdWx0LiBTdXBwbHkgQ1NTIHNlbGVjdG9yIHRvIGNoYW5nZSAqL1xyXG4gICAgcmVhZG9ubHkgdGFyZ2V0RWxlbWVudFNlbGVjdG9yPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgVEhFTUVfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPFRoZW1lU2VydmljZUNvbmZpZz4oXHJcbiAgICAnVGhlbWVTZXJ2aWNlOiBDb25maWcnXHJcbik7XHJcblxyXG4vLyBodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvYW5ndWxhci1jb21waWxlci1vcHRpb25zI3N0cmljdG1ldGFkYXRhZW1pdFxyXG4vLyBAZHluYW1pY1xyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUaGVtZVNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gICAgcHJpdmF0ZSBzdG9wTGlzdGVuaW5nJCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgICBwcml2YXRlIHNlbGVjdGVkVGhlbWU6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChcclxuICAgICAgICB0aGlzLmNvbmZpZy5kZWZhdWx0VGhlbWUgfHwgJydcclxuICAgICk7XHJcbiAgICBzZWxlY3RlZFRoZW1lJDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5zZWxlY3RlZFRoZW1lLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIEBJbmplY3QoVEhFTUVfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogVGhlbWVTZXJ2aWNlQ29uZmlnLFxyXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50XHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLnNldHVwU3Vic2NyaXB0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoVGhlbWUoY2xhc3NOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGhlbWUubmV4dChjbGFzc05hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0dXBTdWJzY3JpcHRpb24oKSB7XHJcbiAgICAgICAgY29uc3QgdHJhbnNpdGlvbkNvbmZpZyA9IHRoaXMuY29uZmlnLnRyYW5zaXRpb25Db25maWc7XHJcbiAgICAgICAgY29uc3Qgbm9uRGVmYXVsdFRoZW1lcyA9IHRoaXMuY29uZmlnLnRoZW1lcy5maWx0ZXIoXHJcbiAgICAgICAgICAgIGMgPT4gYyAhPT0gdGhpcy5jb25maWcuZGVmYXVsdFRoZW1lXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRoZW1lXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgdGFwKHRoZW1lID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUNsYXNzZXMobm9uRGVmYXVsdFRoZW1lcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQ29uZGl0aW9uYWwgbGl0ZXJhbCBlbnRyaWVzOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vMmFsaXR5LmNvbS8yMDE3LzA0L2NvbmRpdGlvbmFsLWxpdGVyYWwtZW50cmllcy5odG1sXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9BZGQgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLih0aGVtZSA/IFt0aGVtZV0gOiBbXSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLih0cmFuc2l0aW9uQ29uZmlnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFt0cmFuc2l0aW9uQ29uZmlnLmNsYXNzTmFtZV1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogW10pLFxyXG4gICAgICAgICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDbGFzc2VzKHRvQWRkKTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbkNvbmZpZ1xyXG4gICAgICAgICAgICAgICAgICAgID8gc3dpdGNoTWFwKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGltZXIodHJhbnNpdGlvbkNvbmZpZy5kdXJhdGlvbikucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVDbGFzc2VzKFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uQ29uZmlnLmNsYXNzTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIDogdGFwKCh4OiBhbnkpID0+IHt9KSxcclxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLnN0b3BMaXN0ZW5pbmckKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlbW92ZUNsYXNzZXMoYXJyOiBzdHJpbmdbXSkge1xyXG4gICAgICAgIHRoaXMudGFyZ2V0RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKC4uLmFycik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRDbGFzc2VzKGFycjogc3RyaW5nW10pIHtcclxuICAgICAgICB0aGlzLnRhcmdldEVsZW1lbnQuY2xhc3NMaXN0LmFkZCguLi5hcnIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0IHRhcmdldEVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGxldCBlbGVtOiBIVE1MRWxlbWVudDtcclxuICAgICAgICBpZiAodGhpcy5jb25maWcudGFyZ2V0RWxlbWVudFNlbGVjdG9yKSB7XHJcbiAgICAgICAgICAgIGVsZW0gPSB0aGlzLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy50YXJnZXRFbGVtZW50U2VsZWN0b3JcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaWYgKCFlbGVtKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5jb25maWcudGFyZ2V0RWxlbWVudFNlbGVjdG9yfSBub3QgZm91bmQsIGRlZmF1bHRpbmcgdG8gPGh0bWw+YFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsZW0pIHtcclxuICAgICAgICAgICAgZWxlbSA9IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZWxlbTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN0b3BMaXN0ZW5pbmckLm5leHQodHJ1ZSk7XHJcbiAgICB9XHJcbn1cclxuIl19