UNPKG

ngx-avatar-fork

Version:

A universal avatar component for Angular applications that fetches / generates avatar based on the information you have about the user.

119 lines 15.8 kB
import { Injectable } from '@angular/core'; import { catchError, finalize, of, share, tap, throwError } from 'rxjs'; import { AvatarSource } from './sources/avatar-source.enum'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common/http"; import * as i2 from "./ngx-avatar-config.service"; /** * list of Supported avatar sources */ export const defaultSources = [ AvatarSource.FACEBOOK, AvatarSource.GOOGLE, AvatarSource.TWITTER, AvatarSource.INSTAGRAM, AvatarSource.VKONTAKTE, AvatarSource.SKYPE, AvatarSource.GRAVATAR, AvatarSource.GITHUB, AvatarSource.CUSTOM, AvatarSource.INITIALS, AvatarSource.VALUE, ]; /** * list of default colors */ export const defaultColors = ['#1abc9c', '#3498db', '#f1c40f', '#8e44ad', '#e74c3c', '#d35400', '#2c3e50', '#7f8c8d']; /** * Default request cache lifetime */ export const defaultCacheLifetimeSecond = 30 * 60; /** * Provides utilities methods related to Avatar component */ class NgxAvatarService { constructor(http, avatarConfigService) { this.http = http; this.avatarConfigService = avatarConfigService; this.avatarSources = defaultSources; this.avatarColors = defaultColors; this.cacheLifetimeSecond = defaultCacheLifetimeSecond; this.failedSources = new Map(); this.cache = new Map(); this.requestCache = new Map(); this.overrideAvatarSources(); this.overrideAvatarColors(); this.overrideCacheLifetime(); } fetchAvatar(avatarUrl) { const cached = this.cache.get(avatarUrl); if (cached) { return cached.error ? throwError(() => cached.error) : of(cached.data); } let request = this.requestCache.get(avatarUrl); if (request) return request; request = this.http.get(avatarUrl).pipe(tap(r => { this.requestCache.delete(avatarUrl); this.cache.set(avatarUrl, { data: r }); }), catchError(e => { this.requestCache.delete(avatarUrl); this.cache.set(avatarUrl, { error: e }); return throwError(() => e); }), finalize(() => { setTimeout(() => this.cache.delete(avatarUrl), this.cacheLifetimeSecond * 1000); }), share()); this.requestCache.set(avatarUrl, request); return request; } getRandomColor(avatarText) { if (!avatarText) { return 'transparent'; } const asciiCodeSum = this.calculateAsciiCode(avatarText); return this.avatarColors[asciiCodeSum % this.avatarColors.length]; } compareSources(sourceType1, sourceType2) { return this.getSourcePriority(sourceType1) - this.getSourcePriority(sourceType2); } isSource(source) { return this.avatarSources.includes(source); } isTextAvatar(sourceType) { return [AvatarSource.INITIALS, AvatarSource.VALUE].includes(sourceType); } buildSourceKey(source) { return source.sourceType + '-' + source.sourceId; } sourceHasFailedBefore(source) { return this.failedSources.has(this.buildSourceKey(source)); } markSourceAsFailed(source) { this.failedSources.set(this.buildSourceKey(source), source); } overrideAvatarSources() { this.avatarSources = this.avatarConfigService.getAvatarSources(defaultSources); } overrideAvatarColors() { this.avatarColors = this.avatarConfigService.getAvatarColors(defaultColors); } overrideCacheLifetime() { this.cacheLifetimeSecond = this.avatarConfigService.getCacheLifetime(defaultCacheLifetimeSecond); } calculateAsciiCode(value) { return value .split('') .map(letter => letter.charCodeAt(0)) .reduce((previous, current) => previous + current); } getSourcePriority(sourceType) { return this.avatarSources.indexOf(sourceType); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: NgxAvatarService, deps: [{ token: i1.HttpClient }, { token: i2.NgxAvatarConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: NgxAvatarService }); } } export { NgxAvatarService }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: NgxAvatarService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.NgxAvatarConfigService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWF2YXRhci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWF2YXRhci9zcmMvbGliL25neC1hdmF0YXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdwRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7QUFHNUQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsWUFBWSxDQUFDLFFBQVE7SUFDckIsWUFBWSxDQUFDLE1BQU07SUFDbkIsWUFBWSxDQUFDLE9BQU87SUFDcEIsWUFBWSxDQUFDLFNBQVM7SUFDdEIsWUFBWSxDQUFDLFNBQVM7SUFDdEIsWUFBWSxDQUFDLEtBQUs7SUFDbEIsWUFBWSxDQUFDLFFBQVE7SUFDckIsWUFBWSxDQUFDLE1BQU07SUFDbkIsWUFBWSxDQUFDLE1BQU07SUFDbkIsWUFBWSxDQUFDLFFBQVE7SUFDckIsWUFBWSxDQUFDLEtBQUs7Q0FDbkIsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBRXRIOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUVsRDs7R0FFRztBQUNILE1BQ2EsZ0JBQWdCO0lBZTNCLFlBQW9CLElBQWdCLEVBQVUsbUJBQTJDO1FBQXJFLFNBQUksR0FBSixJQUFJLENBQVk7UUFBVSx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXdCO1FBZGxGLGtCQUFhLEdBQW1CLGNBQWMsQ0FBQztRQUMvQyxpQkFBWSxHQUFhLGFBQWEsQ0FBQztRQUN2Qyx3QkFBbUIsR0FBVywwQkFBMEIsQ0FBQztRQUUvQyxrQkFBYSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBQzFDLFVBQUssR0FBRyxJQUFJLEdBQUcsRUFNN0IsQ0FBQztRQUNhLGlCQUFZLEdBQUcsSUFBSSxHQUFHLEVBQStCLENBQUM7UUFHckUsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVNLFdBQVcsQ0FBQyxTQUFpQjtRQUNsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6QyxJQUFJLE1BQU0sRUFBRTtZQUNWLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN4RTtRQUVELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9DLElBQUksT0FBTztZQUFFLE9BQU8sT0FBTyxDQUFDO1FBRTVCLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQ3JDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNOLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxFQUNGLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNiLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hDLE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxFQUNGLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDWixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ2xGLENBQUMsQ0FBQyxFQUNGLEtBQUssRUFBRSxDQUNSLENBQUM7UUFFRixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDMUMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVNLGNBQWMsQ0FBQyxVQUFrQjtRQUN0QyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2YsT0FBTyxhQUFhLENBQUM7U0FDdEI7UUFDRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFTSxjQUFjLENBQUMsV0FBeUIsRUFBRSxXQUF5QjtRQUN4RSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVNLFFBQVEsQ0FBQyxNQUFjO1FBQzVCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBc0IsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFTSxZQUFZLENBQUMsVUFBd0I7UUFDMUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRU8sY0FBYyxDQUFDLE1BQWM7UUFDbkMsT0FBTyxNQUFNLENBQUMsVUFBVSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ25ELENBQUM7SUFFTSxxQkFBcUIsQ0FBQyxNQUFjO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFTSxrQkFBa0IsQ0FBQyxNQUFjO1FBQ3RDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVPLHFCQUFxQjtRQUMzQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRU8scUJBQXFCO1FBQzNCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUNuRyxDQUFDO0lBRU8sa0JBQWtCLENBQUMsS0FBYTtRQUN0QyxPQUFPLEtBQUs7YUFDVCxLQUFLLENBQUMsRUFBRSxDQUFDO2FBQ1QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNuQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVPLGlCQUFpQixDQUFDLFVBQXdCO1FBQ2hELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEQsQ0FBQzs4R0F2R1UsZ0JBQWdCO2tIQUFoQixnQkFBZ0I7O1NBQWhCLGdCQUFnQjsyRkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZmluYWxpemUsIE9ic2VydmFibGUsIG9mLCBzaGFyZSwgdGFwLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE5neEF2YXRhckNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL25neC1hdmF0YXItY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXZhdGFyU291cmNlIH0gZnJvbSAnLi9zb3VyY2VzL2F2YXRhci1zb3VyY2UuZW51bSc7XG5pbXBvcnQgeyBTb3VyY2UgfSBmcm9tICcuL3NvdXJjZXMvc291cmNlJztcblxuLyoqXG4gKiBsaXN0IG9mIFN1cHBvcnRlZCBhdmF0YXIgc291cmNlc1xuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdFNvdXJjZXMgPSBbXG4gIEF2YXRhclNvdXJjZS5GQUNFQk9PSyxcbiAgQXZhdGFyU291cmNlLkdPT0dMRSxcbiAgQXZhdGFyU291cmNlLlRXSVRURVIsXG4gIEF2YXRhclNvdXJjZS5JTlNUQUdSQU0sXG4gIEF2YXRhclNvdXJjZS5WS09OVEFLVEUsXG4gIEF2YXRhclNvdXJjZS5TS1lQRSxcbiAgQXZhdGFyU291cmNlLkdSQVZBVEFSLFxuICBBdmF0YXJTb3VyY2UuR0lUSFVCLFxuICBBdmF0YXJTb3VyY2UuQ1VTVE9NLFxuICBBdmF0YXJTb3VyY2UuSU5JVElBTFMsXG4gIEF2YXRhclNvdXJjZS5WQUxVRSxcbl07XG5cbi8qKlxuICogbGlzdCBvZiBkZWZhdWx0IGNvbG9yc1xuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdENvbG9ycyA9IFsnIzFhYmM5YycsICcjMzQ5OGRiJywgJyNmMWM0MGYnLCAnIzhlNDRhZCcsICcjZTc0YzNjJywgJyNkMzU0MDAnLCAnIzJjM2U1MCcsICcjN2Y4YzhkJ107XG5cbi8qKlxuICogRGVmYXVsdCByZXF1ZXN0IGNhY2hlIGxpZmV0aW1lXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q2FjaGVMaWZldGltZVNlY29uZCA9IDMwICogNjA7XG5cbi8qKlxuICogUHJvdmlkZXMgdXRpbGl0aWVzIG1ldGhvZHMgcmVsYXRlZCB0byBBdmF0YXIgY29tcG9uZW50XG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOZ3hBdmF0YXJTZXJ2aWNlIHtcbiAgcHVibGljIGF2YXRhclNvdXJjZXM6IEF2YXRhclNvdXJjZVtdID0gZGVmYXVsdFNvdXJjZXM7XG4gIHB1YmxpYyBhdmF0YXJDb2xvcnM6IHN0cmluZ1tdID0gZGVmYXVsdENvbG9ycztcbiAgcHVibGljIGNhY2hlTGlmZXRpbWVTZWNvbmQ6IG51bWJlciA9IGRlZmF1bHRDYWNoZUxpZmV0aW1lU2Vjb25kO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZmFpbGVkU291cmNlcyA9IG5ldyBNYXA8c3RyaW5nLCBTb3VyY2U+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGUgPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICB7XG4gICAgICBkYXRhPzogb2JqZWN0O1xuICAgICAgZXJyb3I/OiB1bmtub3duO1xuICAgIH1cbiAgPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcXVlc3RDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBPYnNlcnZhYmxlPHVua25vd24+PigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgcHJpdmF0ZSBhdmF0YXJDb25maWdTZXJ2aWNlOiBOZ3hBdmF0YXJDb25maWdTZXJ2aWNlKSB7XG4gICAgdGhpcy5vdmVycmlkZUF2YXRhclNvdXJjZXMoKTtcbiAgICB0aGlzLm92ZXJyaWRlQXZhdGFyQ29sb3JzKCk7XG4gICAgdGhpcy5vdmVycmlkZUNhY2hlTGlmZXRpbWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBmZXRjaEF2YXRhcihhdmF0YXJVcmw6IHN0cmluZyk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuY2FjaGUuZ2V0KGF2YXRhclVybCk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZC5lcnJvciA/IHRocm93RXJyb3IoKCkgPT4gY2FjaGVkLmVycm9yKSA6IG9mKGNhY2hlZC5kYXRhKTtcbiAgICB9XG5cbiAgICBsZXQgcmVxdWVzdCA9IHRoaXMucmVxdWVzdENhY2hlLmdldChhdmF0YXJVcmwpO1xuICAgIGlmIChyZXF1ZXN0KSByZXR1cm4gcmVxdWVzdDtcblxuICAgIHJlcXVlc3QgPSB0aGlzLmh0dHAuZ2V0KGF2YXRhclVybCkucGlwZShcbiAgICAgIHRhcChyID0+IHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0Q2FjaGUuZGVsZXRlKGF2YXRhclVybCk7XG4gICAgICAgIHRoaXMuY2FjaGUuc2V0KGF2YXRhclVybCwgeyBkYXRhOiByIH0pO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKGUgPT4ge1xuICAgICAgICB0aGlzLnJlcXVlc3RDYWNoZS5kZWxldGUoYXZhdGFyVXJsKTtcbiAgICAgICAgdGhpcy5jYWNoZS5zZXQoYXZhdGFyVXJsLCB7IGVycm9yOiBlIH0pO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlKTtcbiAgICAgIH0pLFxuICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2FjaGUuZGVsZXRlKGF2YXRhclVybCksIHRoaXMuY2FjaGVMaWZldGltZVNlY29uZCAqIDEwMDApO1xuICAgICAgfSksXG4gICAgICBzaGFyZSgpLFxuICAgICk7XG5cbiAgICB0aGlzLnJlcXVlc3RDYWNoZS5zZXQoYXZhdGFyVXJsLCByZXF1ZXN0KTtcbiAgICByZXR1cm4gcmVxdWVzdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSYW5kb21Db2xvcihhdmF0YXJUZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghYXZhdGFyVGV4dCkge1xuICAgICAgcmV0dXJuICd0cmFuc3BhcmVudCc7XG4gICAgfVxuICAgIGNvbnN0IGFzY2lpQ29kZVN1bSA9IHRoaXMuY2FsY3VsYXRlQXNjaWlDb2RlKGF2YXRhclRleHQpO1xuICAgIHJldHVybiB0aGlzLmF2YXRhckNvbG9yc1thc2NpaUNvZGVTdW0gJSB0aGlzLmF2YXRhckNvbG9ycy5sZW5ndGhdO1xuICB9XG5cbiAgcHVibGljIGNvbXBhcmVTb3VyY2VzKHNvdXJjZVR5cGUxOiBBdmF0YXJTb3VyY2UsIHNvdXJjZVR5cGUyOiBBdmF0YXJTb3VyY2UpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFNvdXJjZVByaW9yaXR5KHNvdXJjZVR5cGUxKSAtIHRoaXMuZ2V0U291cmNlUHJpb3JpdHkoc291cmNlVHlwZTIpO1xuICB9XG5cbiAgcHVibGljIGlzU291cmNlKHNvdXJjZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYXZhdGFyU291cmNlcy5pbmNsdWRlcyhzb3VyY2UgYXMgQXZhdGFyU291cmNlKTtcbiAgfVxuXG4gIHB1YmxpYyBpc1RleHRBdmF0YXIoc291cmNlVHlwZTogQXZhdGFyU291cmNlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFtBdmF0YXJTb3VyY2UuSU5JVElBTFMsIEF2YXRhclNvdXJjZS5WQUxVRV0uaW5jbHVkZXMoc291cmNlVHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU291cmNlS2V5KHNvdXJjZTogU291cmNlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc291cmNlLnNvdXJjZVR5cGUgKyAnLScgKyBzb3VyY2Uuc291cmNlSWQ7XG4gIH1cblxuICBwdWJsaWMgc291cmNlSGFzRmFpbGVkQmVmb3JlKHNvdXJjZTogU291cmNlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmFpbGVkU291cmNlcy5oYXModGhpcy5idWlsZFNvdXJjZUtleShzb3VyY2UpKTtcbiAgfVxuXG4gIHB1YmxpYyBtYXJrU291cmNlQXNGYWlsZWQoc291cmNlOiBTb3VyY2UpOiB2b2lkIHtcbiAgICB0aGlzLmZhaWxlZFNvdXJjZXMuc2V0KHRoaXMuYnVpbGRTb3VyY2VLZXkoc291cmNlKSwgc291cmNlKTtcbiAgfVxuXG4gIHByaXZhdGUgb3ZlcnJpZGVBdmF0YXJTb3VyY2VzKCk6IHZvaWQge1xuICAgIHRoaXMuYXZhdGFyU291cmNlcyA9IHRoaXMuYXZhdGFyQ29uZmlnU2VydmljZS5nZXRBdmF0YXJTb3VyY2VzKGRlZmF1bHRTb3VyY2VzKTtcbiAgfVxuXG4gIHByaXZhdGUgb3ZlcnJpZGVBdmF0YXJDb2xvcnMoKTogdm9pZCB7XG4gICAgdGhpcy5hdmF0YXJDb2xvcnMgPSB0aGlzLmF2YXRhckNvbmZpZ1NlcnZpY2UuZ2V0QXZhdGFyQ29sb3JzKGRlZmF1bHRDb2xvcnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBvdmVycmlkZUNhY2hlTGlmZXRpbWUoKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZUxpZmV0aW1lU2Vjb25kID0gdGhpcy5hdmF0YXJDb25maWdTZXJ2aWNlLmdldENhY2hlTGlmZXRpbWUoZGVmYXVsdENhY2hlTGlmZXRpbWVTZWNvbmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVBc2NpaUNvZGUodmFsdWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHZhbHVlXG4gICAgICAuc3BsaXQoJycpXG4gICAgICAubWFwKGxldHRlciA9PiBsZXR0ZXIuY2hhckNvZGVBdCgwKSlcbiAgICAgIC5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiBwcmV2aW91cyArIGN1cnJlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTb3VyY2VQcmlvcml0eShzb3VyY2VUeXBlOiBBdmF0YXJTb3VyY2UpIHtcbiAgICByZXR1cm4gdGhpcy5hdmF0YXJTb3VyY2VzLmluZGV4T2Yoc291cmNlVHlwZSk7XG4gIH1cbn1cbiJdfQ==