UNPKG

@angular/fire

Version:

The official library for Firebase and Angular

285 lines 20.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Inject, Injectable, InjectionToken, NgZone, Optional, PLATFORM_ID } from '@angular/core'; import { EMPTY, Observable, of } from 'rxjs'; import { map, shareReplay, switchMap, tap } from 'rxjs/operators'; import { FirebaseApp, ɵlazySDKProxy } from '@angular/fire'; import { isPlatformBrowser } from '@angular/common'; import * as i0 from "@angular/core"; import * as i1 from "@angular/fire"; // SEMVER @ v6, drop and move core ng metrics to a service /** @type {?} */ export const AUTOMATICALLY_TRACE_CORE_NG_METRICS = new InjectionToken('angularfire2.performance.auto_trace'); /** @type {?} */ export const INSTRUMENTATION_ENABLED = new InjectionToken('angularfire2.performance.instrumentationEnabled'); /** @type {?} */ export const DATA_COLLECTION_ENABLED = new InjectionToken('angularfire2.performance.dataCollectionEnabled'); // WARNING: interface has both a type and a value, skipping emit export class AngularFirePerformance { /** * @param {?} app * @param {?} instrumentationEnabled * @param {?} dataCollectionEnabled * @param {?} zone * @param {?} platformId */ constructor(app, instrumentationEnabled, dataCollectionEnabled, zone, // tslint:disable-next-line:ban-types platformId) { this.zone = zone; this.performance = of(undefined).pipe(switchMap((/** * @return {?} */ () => isPlatformBrowser(platformId) ? zone.runOutsideAngular((/** * @return {?} */ () => import('firebase/performance'))) : EMPTY)), map((/** * @return {?} */ () => zone.runOutsideAngular((/** * @return {?} */ () => app.performance())))), tap((/** * @param {?} performance * @return {?} */ performance => { if (instrumentationEnabled !== true) { performance.instrumentationEnabled = false; } if (dataCollectionEnabled !== true) { performance.dataCollectionEnabled = false; } })), shareReplay({ bufferSize: 1, refCount: false })); return ɵlazySDKProxy(this, this.performance, zone); } } AngularFirePerformance.decorators = [ { type: Injectable, args: [{ providedIn: 'any' },] } ]; /** @nocollapse */ AngularFirePerformance.ctorParameters = () => [ { type: FirebaseApp }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [INSTRUMENTATION_ENABLED,] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DATA_COLLECTION_ENABLED,] }] }, { type: NgZone }, { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] } ]; /** @nocollapse */ AngularFirePerformance.ɵprov = i0.ɵɵdefineInjectable({ factory: function AngularFirePerformance_Factory() { return new AngularFirePerformance(i0.ɵɵinject(i1.FirebaseApp), i0.ɵɵinject(INSTRUMENTATION_ENABLED, 8), i0.ɵɵinject(DATA_COLLECTION_ENABLED, 8), i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i0.PLATFORM_ID)); }, token: AngularFirePerformance, providedIn: "any" }); if (false) { /** * @type {?} * @private */ AngularFirePerformance.prototype.performance; /** * @type {?} * @private */ AngularFirePerformance.prototype.zone; } /** @type {?} */ const trace$ = (/** * @param {?} traceId * @return {?} */ (traceId) => { if (typeof window !== 'undefined' && window.performance) { /** @type {?} */ const entries = window.performance.getEntriesByName(traceId, 'measure') || []; /** @type {?} */ const startMarkName = `_${traceId}Start[${entries.length}]`; /** @type {?} */ const endMarkName = `_${traceId}End[${entries.length}]`; return new Observable((/** * @param {?} emitter * @return {?} */ emitter => { window.performance.mark(startMarkName); emitter.next(); return { unsubscribe: (/** * @return {?} */ () => { window.performance.mark(endMarkName); window.performance.measure(traceId, startMarkName, endMarkName); }) }; })); } else { return EMPTY; } }); const ɵ0 = trace$; /** @type {?} */ export const traceUntil = (/** * @template T * @param {?} name * @param {?} test * @param {?=} options * @return {?} */ (name, test, options) => (/** * @param {?} source$ * @return {?} */ (source$) => new Observable((/** * @param {?} subscriber * @return {?} */ subscriber => { /** @type {?} */ const traceSubscription = trace$(name).subscribe(); return source$.pipe(tap((/** * @param {?} a * @return {?} */ a => test(a) && traceSubscription.unsubscribe()), (/** * @return {?} */ () => { }), (/** * @return {?} */ () => options && options.orComplete && traceSubscription.unsubscribe()))).subscribe(subscriber); })))); /** @type {?} */ export const traceWhile = (/** * @template T * @param {?} name * @param {?} test * @param {?=} options * @return {?} */ (name, test, options) => (/** * @param {?} source$ * @return {?} */ (source$) => new Observable((/** * @param {?} subscriber * @return {?} */ subscriber => { /** @type {?} */ let traceSubscription; return source$.pipe(tap((/** * @param {?} a * @return {?} */ a => { if (test(a)) { traceSubscription = traceSubscription || trace$(name).subscribe(); } else { if (traceSubscription) { traceSubscription.unsubscribe(); } traceSubscription = undefined; } }), (/** * @return {?} */ () => { }), (/** * @return {?} */ () => options && options.orComplete && traceSubscription && traceSubscription.unsubscribe()))).subscribe(subscriber); })))); /** @type {?} */ export const traceUntilComplete = (/** * @template T * @param {?} name * @return {?} */ (name) => (/** * @param {?} source$ * @return {?} */ (source$) => new Observable((/** * @param {?} subscriber * @return {?} */ subscriber => { /** @type {?} */ const traceSubscription = trace$(name).subscribe(); return source$.pipe(tap((/** * @return {?} */ () => { }), (/** * @return {?} */ () => { }), (/** * @return {?} */ () => traceSubscription.unsubscribe()))).subscribe(subscriber); })))); /** @type {?} */ export const traceUntilFirst = (/** * @template T * @param {?} name * @return {?} */ (name) => (/** * @param {?} source$ * @return {?} */ (source$) => new Observable((/** * @param {?} subscriber * @return {?} */ subscriber => { /** @type {?} */ const traceSubscription = trace$(name).subscribe(); return source$.pipe(tap((/** * @return {?} */ () => traceSubscription.unsubscribe()), (/** * @return {?} */ () => { }), (/** * @return {?} */ () => { }))).subscribe(subscriber); })))); /** @type {?} */ export const trace = (/** * @template T * @param {?} name * @return {?} */ (name) => (/** * @param {?} source$ * @return {?} */ (source$) => new Observable((/** * @param {?} subscriber * @return {?} */ subscriber => { /** @type {?} */ const traceSubscription = trace$(name).subscribe(); return source$.pipe(tap((/** * @return {?} */ () => traceSubscription.unsubscribe()), (/** * @return {?} */ () => { }), (/** * @return {?} */ () => traceSubscription.unsubscribe()))).subscribe(subscriber); })))); export { ɵ0 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyZm9ybWFuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcGVyZm9ybWFuY2UvcGVyZm9ybWFuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRyxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzNELE9BQU8sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDMUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7O0FBR3BELE1BQU0sT0FBTyxtQ0FBbUMsR0FBRyxJQUFJLGNBQWMsQ0FBVSxxQ0FBcUMsQ0FBQzs7QUFDckgsTUFBTSxPQUFPLHVCQUF1QixHQUFHLElBQUksY0FBYyxDQUFVLGlEQUFpRCxDQUFDOztBQUNySCxNQUFNLE9BQU8sdUJBQXVCLEdBQUcsSUFBSSxjQUFjLENBQVUsZ0RBQWdELENBQUM7O0FBUXBILE1BQU0sT0FBTyxzQkFBc0I7Ozs7Ozs7O0lBSWpDLFlBQ0UsR0FBZ0IsRUFDNkIsc0JBQXNDLEVBQ3RDLHFCQUFxQyxFQUMxRSxJQUFZO0lBQ3BCLHFDQUFxQztJQUNoQixVQUFrQjtRQUYvQixTQUFJLEdBQUosSUFBSSxDQUFRO1FBS3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FDbkMsU0FBUzs7O1FBQUMsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FB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LFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMxQixDQUFDLEVBQUMsQ0FBQSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgTmdab25lLCBPcHRpb25hbCwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEVNUFRZLCBPYnNlcnZhYmxlLCBvZiwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IHBlcmZvcm1hbmNlIH0gZnJvbSAnZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IEZpcmViYXNlQXBwLCDJtWxhenlTREtQcm94eSwgybVQcm9taXNlUHJveHkgfSBmcm9tICdAYW5ndWxhci9maXJlJztcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuLy8gU0VNVkVSIEAgdjYsIGRyb3AgYW5kIG1vdmUgY29yZSBuZyBtZXRyaWNzIHRvIGEgc2VydmljZVxuZXhwb3J0IGNvbnN0IEFVVE9NQVRJQ0FMTFlfVFJBQ0VfQ09SRV9OR19NRVRSSUNTID0gbmV3IEluamVjdGlvblRva2VuPGJvb2xlYW4+KCdhbmd1bGFyZmlyZTIucGVyZm9ybWFuY2UuYXV0b190cmFjZScpO1xuZXhwb3J0IGNvbnN0IElOU1RSVU1FTlRBVElPTl9FTkFCTEVEID0gbmV3IEluamVjdGlvblRva2VuPGJvb2xlYW4+KCdhbmd1bGFyZmlyZTIucGVyZm9ybWFuY2UuaW5zdHJ1bWVudGF0aW9uRW5hYmxlZCcpO1xuZXhwb3J0IGNvbnN0IERBVEFfQ09MTEVDVElPTl9FTkFCTEVEID0gbmV3IEluamVjdGlvblRva2VuPGJvb2xlYW4+KCdhbmd1bGFyZmlyZTIucGVyZm9ybWFuY2UuZGF0YUNvbGxlY3Rpb25FbmFibGVkJyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQW5ndWxhckZpcmVQZXJmb3JtYW5jZSBleHRlbmRzIMm1UHJvbWlzZVByb3h5PHBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlPiB7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ2FueSdcbn0pXG5leHBvcnQgY2xhc3MgQW5ndWxhckZpcmVQZXJmb3JtYW5jZSB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwZXJmb3JtYW5jZTogT2JzZXJ2YWJsZTxwZXJmb3JtYW5jZS5QZXJmb3JtYW5jZT47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYXBwOiBGaXJlYmFzZUFwcCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KElOU1RSVU1FTlRBVElPTl9FTkFCTEVEKSBpbnN0cnVtZW50YXRpb25FbmFibGVkOiBib29sZWFuIHwgbnVsbCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERBVEFfQ09MTEVDVElPTl9FTkFCTEVEKSBkYXRhQ29sbGVjdGlvbkVuYWJsZWQ6IGJvb2xlYW4gfCBudWxsLFxuICAgIHByaXZhdGUgem9uZTogTmdab25lLFxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpiYW4tdHlwZXNcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwbGF0Zm9ybUlkOiBPYmplY3RcbiAgKSB7XG5cbiAgICB0aGlzLnBlcmZvcm1hbmNlID0gb2YodW5kZWZpbmVkKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKCgpID0+IGlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtSWQpID8gem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiBpbXBvcnQoJ2ZpcmViYXNlL3BlcmZvcm1hbmNlJykpIDogRU1QVFkpLFxuICAgICAgbWFwKCgpID0+IHpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gYXBwLnBlcmZvcm1hbmNlKCkpKSxcbiAgICAgIHRhcChwZXJmb3JtYW5jZSA9PiB7XG4gICAgICAgIGlmIChpbnN0cnVtZW50YXRpb25FbmFibGVkICE9PSB0cnVlKSB7XG4gICAgICAgICAgcGVyZm9ybWFuY2UuaW5zdHJ1bWVudGF0aW9uRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhQ29sbGVjdGlvbkVuYWJsZWQgIT09IHRydWUpIHtcbiAgICAgICAgICBwZXJmb3JtYW5jZS5kYXRhQ29sbGVjdGlvbkVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiBmYWxzZSB9KVxuICAgICk7XG5cbiAgICByZXR1cm4gybVsYXp5U0RLUHJveHkodGhpcywgdGhpcy5wZXJmb3JtYW5jZSwgem9uZSk7XG5cbiAgfVxuXG59XG5cbmNvbnN0IHRyYWNlJCA9ICh0cmFjZUlkOiBzdHJpbmcpID0+IHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5wZXJmb3JtYW5jZSkge1xuICAgIGNvbnN0IGVudHJpZXMgPSB3aW5kb3cucGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5TmFtZSh0cmFjZUlkLCAnbWVhc3VyZScpIHx8IFtdO1xuICAgIGNvbnN0IHN0YXJ0TWFya05hbWUgPSBgXyR7dHJhY2VJZH1TdGFydFske2VudHJpZXMubGVuZ3RofV1gO1xuICAgIGNvbnN0IGVuZE1hcmtOYW1lID0gYF8ke3RyYWNlSWR9RW5kWyR7ZW50cmllcy5sZW5ndGh9XWA7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPHZvaWQ+KGVtaXR0ZXIgPT4ge1xuICAgICAgd2luZG93LnBlcmZvcm1hbmNlLm1hcmsoc3RhcnRNYXJrTmFtZSk7XG4gICAgICBlbWl0dGVyLm5leHQoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVuc3Vic2NyaWJlOiAoKSA9PiB7XG4gICAgICAgICAgd2luZG93LnBlcmZvcm1hbmNlLm1hcmsoZW5kTWFya05hbWUpO1xuICAgICAgICAgIHdpbmRvdy5wZXJmb3JtYW5jZS5tZWFzdXJlKHRyYWNlSWQsIHN0YXJ0TWFya05hbWUsIGVuZE1hcmtOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gRU1QVFk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCB0cmFjZVVudGlsID0gPFQgPSBhbnk+KFxuICBuYW1lOiBzdHJpbmcsXG4gIHRlc3Q6IChhOiBUKSA9PiBib29sZWFuLFxuICBvcHRpb25zPzogeyBvckNvbXBsZXRlPzogYm9vbGVhbiB9XG4pID0+IChzb3VyY2UkOiBPYnNlcnZhYmxlPFQ+KSA9PiBuZXcgT2JzZXJ2YWJsZTxUPihzdWJzY3JpYmVyID0+IHtcbiAgY29uc3QgdHJhY2VTdWJzY3JpcHRpb24gPSB0cmFjZSQobmFtZSkuc3Vic2NyaWJlKCk7XG4gIHJldHVybiBzb3VyY2UkLnBpcGUoXG4gICAgdGFwKFxuICAgICAgYSA9PiB0ZXN0KGEpICYmIHRyYWNlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksXG4gICAgICAoKSA9PiB7XG4gICAgICB9LFxuICAgICAgKCkgPT4gb3B0aW9ucyAmJiBvcHRpb25zLm9yQ29tcGxldGUgJiYgdHJhY2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIClcbiAgKS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG59KTtcblxuZXhwb3J0IGNvbnN0IHRyYWNlV2hpbGUgPSA8VCA9IGFueT4oXG4gIG5hbWU6IHN0cmluZyxcbiAgdGVzdDogKGE6IFQpID0+IGJvb2xlYW4sXG4gIG9wdGlvbnM/OiB7IG9yQ29tcGxldGU/OiBib29sZWFuIH1cbikgPT4gKHNvdXJjZSQ6IE9ic2VydmFibGU8VD4pID0+IG5ldyBPYnNlcnZhYmxlPFQ+KHN1YnNjcmliZXIgPT4ge1xuICBsZXQgdHJhY2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHNvdXJjZSQucGlwZShcbiAgICB0YXAoXG4gICAgICBhID0+IHtcbiAgICAgICAgaWYgKHRlc3QoYSkpIHtcbiAgICAgICAgICB0cmFjZVN1YnNjcmlwdGlvbiA9IHRyYWNlU3Vic2NyaXB0aW9uIHx8IHRyYWNlJChuYW1lKS5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodHJhY2VTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRyYWNlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdHJhY2VTdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICB9LFxuICAgICAgKCkgPT4gb3B0aW9ucyAmJiBvcHRpb25zLm9yQ29tcGxldGUgJiYgdHJhY2VTdWJzY3JpcHRpb24gJiYgdHJhY2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIClcbiAgKS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG59KTtcblxuZXhwb3J0IGNvbnN0IHRyYWNlVW50aWxDb21wbGV0ZSA9IDxUID0gYW55PihuYW1lOiBzdHJpbmcpID0+IChzb3VyY2UkOiBPYnNlcnZhYmxlPFQ+KSA9PiBuZXcgT2JzZXJ2YWJsZTxUPihzdWJzY3JpYmVyID0+IHtcbiAgY29uc3QgdHJhY2VTdWJzY3JpcHRpb24gPSB0cmFjZSQobmFtZSkuc3Vic2NyaWJlKCk7XG4gIHJldHVybiBzb3VyY2UkLnBpcGUoXG4gICAgdGFwKFxuICAgICAgKCkgPT4ge1xuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB0cmFjZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgKVxuICApLnN1YnNjcmliZShzdWJzY3JpYmVyKTtcbn0pO1xuXG5leHBvcnQgY29uc3QgdHJhY2VVbnRpbEZpcnN0ID0gPFQgPSBhbnk+KG5hbWU6IHN0cmluZykgPT4gKHNvdXJjZSQ6IE9ic2VydmFibGU8VD4pID0+IG5ldyBPYnNlcnZhYmxlPFQ+KHN1YnNjcmliZXIgPT4ge1xuICBjb25zdCB0cmFjZVN1YnNjcmlwdGlvbiA9IHRyYWNlJChuYW1lKS5zdWJzY3JpYmUoKTtcbiAgcmV0dXJuIHNvdXJjZSQucGlwZShcbiAgICB0YXAoXG4gICAgICAoKSA9PiB0cmFjZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLFxuICAgICAgKCkgPT4ge1xuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgIH1cbiAgICApXG4gICkuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xufSk7XG5cbmV4cG9ydCBjb25zdCB0cmFjZSA9IDxUID0gYW55PihuYW1lOiBzdHJpbmcpID0+IChzb3VyY2UkOiBPYnNlcnZhYmxlPFQ+KSA9PiBuZXcgT2JzZXJ2YWJsZTxUPihzdWJzY3JpYmVyID0+IHtcbiAgY29uc3QgdHJhY2VTdWJzY3JpcHRpb24gPSB0cmFjZSQobmFtZSkuc3Vic2NyaWJlKCk7XG4gIHJldHVybiBzb3VyY2UkLnBpcGUoXG4gICAgdGFwKFxuICAgICAgKCkgPT4gdHJhY2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSxcbiAgICAgICgpID0+IHtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB0cmFjZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgKVxuICApLnN1YnNjcmliZShzdWJzY3JpYmVyKTtcbn0pO1xuIl19