UNPKG

@dbg-riskit/angular-view

Version:

157 lines 19.6 kB
import { Injectable } from '@angular/core'; import { CONTENT_TYPE } from '@dbg-riskit/common'; import { BehaviorSubject } from 'rxjs'; import { filter } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "@dbg-riskit/common"; /** * Class instances emitted [to observers] for each mql notification */ export class MediaChange { constructor(mediaQuery = 'all') { this.mediaQuery = mediaQuery; } } /** * MediaMonitor configures listeners to mediaQuery changes and publishes an Observable facade to * convert mediaQuery change callbacks to subscriber notifications. These notifications will be * performed within the ng Zone to trigger change detections and component updates. * * NOTE: both mediaQuery activations and de-activations are announced in notifications */ export class MatchMedia { constructor(ngZone, logger) { this.ngZone = ngZone; this.logger = logger; this._registry = new Map(); this._source = new BehaviorSubject(new MediaChange()); this._observable$ = this._source.asObservable(); } /** * For the specified mediaQuery? */ isActive(mediaQuery) { if (this._registry.has(mediaQuery)) { const mql = this._registry.get(mediaQuery); return mql.matches; } return false; } /** * External observers can watch for all (or a specific) mql changes. * Typically used by the MediaQueryAdaptor; optionally available to components * who wish to use the MediaMonitor as mediaMonitor$ observable service. * * NOTE: if a mediaQuery is not specified, then ALL mediaQuery activations will * be announced. */ observe(mediaQuery) { this.registerQuery(mediaQuery); return this._observable$.pipe(filter((change) => { return mediaQuery ? (change.mediaQuery === mediaQuery) : true; })); } /** * Based on the BreakPointRegistry provider, register internal listeners for each unique * mediaQuery. Each listener emits specific MediaChange data to observers */ registerQuery(mediaQuery) { const list = normalizeQuery(mediaQuery); if (list.length > 0) { prepareQueryCSS(list, this.logger); list.forEach((query) => { let mql = this._registry.get(query); const onMQLEvent = () => { this.ngZone.run(() => { const change = new MediaChange(query); this._source.next(change); }); }; if (!mql) { mql = this._buildMQL(query); mql.addEventListener('change', onMQLEvent); this._registry.set(query, mql); } if (mql.matches) { onMQLEvent(); // Announce activate range for initial subscribers } }); } } /** * Call window.matchMedia() to build a MediaQueryList; which * supports 0..n listeners for activation/deactivation */ _buildMQL(query) { const canListen = !!window.matchMedia('all').addEventListener; return canListen ? window.matchMedia(query) : { matches: query === 'all' || query === '', media: query, addListener: () => undefined, addEventListener: () => undefined, removeListener: () => undefined, removeEventListener: () => undefined, dispatchEvent: () => false, onchange: () => undefined }; } } MatchMedia.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: MatchMedia, deps: [{ token: i0.NgZone }, { token: i1.Logger }], target: i0.ɵɵFactoryTarget.Injectable }); MatchMedia.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: MatchMedia }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: MatchMedia, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i1.Logger }]; } }); /** * Private global registry for all dynamically-created, injected style tags * @see prepare(query) */ const ALL_STYLES = {}; /** * For Webkit engines that only trigger the MediaQueryList Listener * when there is at least one CSS selector for the respective media query. * * @param mediaQueries string[] The mediaQueries used to create a faux CSS selector * */ function prepareQueryCSS(mediaQueries, logger) { const list = mediaQueries.filter((it) => !ALL_STYLES[it]); if (list.length > 0) { const query = list.join(', '); try { const style = document.createElement('style'); style.setAttribute('type', CONTENT_TYPE.TEXT_CSS); // Older IEs if (!style.styleSheet) { const cssText = `/* @angular/flex-layout - workaround for possible browser quirk with mediaQuery listeners see http://bit.ly/2sd4HMP */ @media ${query} {.fx-query-test{ }}`; style.appendChild(document.createTextNode(cssText)); } document.getElementsByTagName('head')[0].appendChild(style); // Store in private global registry list.forEach((mq) => ALL_STYLES[mq] = style); } catch (e) { logger.error(e); } } } /** * Always convert to unique list of queries; for iteration in ::registerQuery() */ function normalizeQuery(mediaQuery) { return (typeof mediaQuery === 'undefined') ? [] : (typeof mediaQuery === 'string') ? [mediaQuery] : unique(mediaQuery); } /** * Filter duplicate mediaQueries in the list */ function unique(list) { const seen = {}; return list.filter((item) => { return seen.hasOwnProperty(item) ? false : (seen[item] = true); }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2gubWVkaWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wa2cvZGJnLXJpc2tpdC9hbmd1bGFyLXZpZXcvc3JjL2xpYi9tYXRjaC5tZWRpYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFTLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBQyxZQUFZLEVBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RCxPQUFPLEVBQUMsZUFBZSxFQUFhLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBRXRDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFdBQVc7SUFDcEIsWUFBbUMsYUFBYSxLQUFLO1FBQWxCLGVBQVUsR0FBVixVQUFVLENBQVE7SUFDckQsQ0FBQztDQUNKO0FBRUQ7Ozs7OztHQU1HO0FBRUgsTUFBTSxPQUFPLFVBQVU7SUFLbkIsWUFBc0MsTUFBYyxFQUNoQixNQUFjO1FBRFosV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNoQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQzlDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQTBCLENBQUM7UUFDbkQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGVBQWUsQ0FBYyxJQUFJLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRDs7T0FFRztJQUNJLFFBQVEsQ0FBQyxVQUFrQjtRQUM5QixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2hDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzNDLE9BQU8sR0FBSSxDQUFDLE9BQU8s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LENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLE1BQU0sQ0FBQyxJQUFjO0lBQzFCLE1BQU0sSUFBSSxHQUErQixFQUFFLENBQUM7SUFDNUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDeEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ25FLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZSwgTmdab25lfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q09OVEVOVF9UWVBFLCBMb2dnZXJ9IGZyb20gJ0BkYmctcmlza2l0L2NvbW1vbic7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2ZpbHRlcn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vKipcbiAqIENsYXNzIGluc3RhbmNlcyBlbWl0dGVkIFt0byBvYnNlcnZlcnNdIGZvciBlYWNoIG1xbCBub3RpZmljYXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIE1lZGlhQ2hhbmdlIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IG1lZGlhUXVlcnkgPSAnYWxsJykge1xuICAgIH1cbn1cblxuLyoqXG4gKiBNZWRpYU1vbml0b3IgY29uZmlndXJlcyBsaXN0ZW5lcnMgdG8gbWVkaWFRdWVyeSBjaGFuZ2VzIGFuZCBwdWJsaXNoZXMgYW4gT2JzZXJ2YWJsZSBmYWNhZGUgdG9cbiAqIGNvbnZlcnQgbWVkaWFRdWVyeSBjaGFuZ2UgY2FsbGJhY2tzIHRvIHN1YnNjcmliZXIgbm90aWZpY2F0aW9ucy4gVGhlc2Ugbm90aWZpY2F0aW9ucyB3aWxsIGJlXG4gKiBwZXJmb3JtZWQgd2l0aGluIHRoZSBuZyBab25lIHRvIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbnMgYW5kIGNvbXBvbmVudCB1cGRhdGVzLlxuICpcbiAqIE5PVEU6IGJvdGggbWVkaWFRdWVyeSBhY3RpdmF0aW9ucyBhbmQgZGUtYWN0aXZhdGlvbnMgYXJlIGFubm91bmNlZCBpbiBub3RpZmljYXRpb25zXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNYXRjaE1lZGlhIHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3JlZ2lzdHJ5OiBNYXA8c3RyaW5nLCBNZWRpYVF1ZXJ5TGlzdD47XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9zb3VyY2U6IEJlaGF2aW9yU3ViamVjdDxNZWRpYUNoYW5nZT47XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9vYnNlcnZhYmxlJDogT2JzZXJ2YWJsZTxNZWRpYUNoYW5nZT47XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IG5nWm9uZTogTmdab25lLFxuICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyKSB7XG4gICAgICAgIHRoaXMuX3JlZ2lzdHJ5ID0gbmV3IE1hcDxzdHJpbmcsIE1lZGlhUXVlcnlMaXN0PigpO1xuICAgICAgICB0aGlzLl9zb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1lZGlhQ2hhbmdlPihuZXcgTWVkaWFDaGFuZ2UoKSk7XG4gICAgICAgIHRoaXMuX29ic2VydmFibGUkID0gdGhpcy5fc291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvciB0aGUgc3BlY2lmaWVkIG1lZGlhUXVlcnk/XG4gICAgICovXG4gICAgcHVibGljIGlzQWN0aXZlKG1lZGlhUXVlcnk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5fcmVnaXN0cnkuaGFzKG1lZGlhUXVlcnkpKSB7XG4gICAgICAgICAgICBjb25zdCBtcWwgPSB0aGlzLl9yZWdpc3RyeS5nZXQobWVkaWFRdWVyeSk7XG4gICAgICAgICAgICByZXR1cm4gbXFsIS5tYXRjaGVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRlcm5hbCBvYnNlcnZlcnMgY2FuIHdhdGNoIGZvciBhbGwgKG9yIGEgc3BlY2lmaWMpIG1xbCBjaGFuZ2VzLlxuICAgICAqIFR5cGljYWxseSB1c2VkIGJ5IHRoZSBNZWRpYVF1ZXJ5QWRhcHRvcjsgb3B0aW9uYWxseSBhdmFpbGFibGUgdG8gY29tcG9uZW50c1xuICAgICAqIHdobyB3aXNoIHRvIHVzZSB0aGUgTWVkaWFNb25pdG9yIGFzIG1lZGlhTW9uaXRvciQgb2JzZXJ2YWJsZSBzZXJ2aWNlLlxuICAgICAqXG4gICAgICogTk9URTogaWYgYSBtZWRpYVF1ZXJ5IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gQUxMIG1lZGlhUXVlcnkgYWN0aXZhdGlvbnMgd2lsbFxuICAgICAqICAgICAgIGJlIGFubm91bmNlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb2JzZXJ2ZShtZWRpYVF1ZXJ5Pzogc3RyaW5nKTogT2JzZXJ2YWJsZTxNZWRpYUNoYW5nZT4ge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyUXVlcnkobWVkaWFRdWVyeSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX29ic2VydmFibGUkLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoKGNoYW5nZTogTWVkaWFDaGFuZ2UpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWVkaWFRdWVyeSA/IChjaGFuZ2UubWVkaWFRdWVyeSA9PT0gbWVkaWFRdWVyeSkgOiB0cnVlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCYXNlZCBvbiB0aGUgQnJlYWtQb2ludFJlZ2lzdHJ5IHByb3ZpZGVyLCByZWdpc3RlciBpbnRlcm5hbCBsaXN0ZW5lcnMgZm9yIGVhY2ggdW5pcXVlXG4gICAgICogbWVkaWFRdWVyeS4gRWFjaCBsaXN0ZW5lciBlbWl0cyBzcGVjaWZpYyBNZWRpYUNoYW5nZSBkYXRhIHRvIG9ic2VydmVyc1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVnaXN0ZXJRdWVyeShtZWRpYVF1ZXJ5Pzogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3QgbGlzdCA9IG5vcm1hbGl6ZVF1ZXJ5KG1lZGlhUXVlcnkpO1xuXG4gICAgICAgIGlmIChsaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHByZXBhcmVRdWVyeUNTUyhsaXN0LCB0aGlzLmxvZ2dlcik7XG5cbiAgICAgICAgICAgIGxpc3QuZm9yRWFjaCgocXVlcnkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbXFsID0gdGhpcy5fcmVnaXN0cnkuZ2V0KHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICBjb25zdCBvbk1RTEV2ZW50ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlID0gbmV3IE1lZGlhQ2hhbmdlKHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NvdXJjZS5uZXh0KGNoYW5nZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoIW1xbCkge1xuICAgICAgICAgICAgICAgICAgICBtcWwgPSB0aGlzLl9idWlsZE1RTChxdWVyeSk7XG4gICAgICAgICAgICAgICAgICAgIG1xbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBvbk1RTEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnkuc2V0KHF1ZXJ5LCBtcWwpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChtcWwubWF0Y2hlcykge1xuICAgICAgICAgICAgICAgICAgICBvbk1RTEV2ZW50KCk7ICAvLyBBbm5vdW5jZSBhY3RpdmF0ZSByYW5nZSBmb3IgaW5pdGlhbCBzdWJzY3JpYmVyc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbCB3aW5kb3cubWF0Y2hNZWRpYSgpIHRvIGJ1aWxkIGEgTWVkaWFRdWVyeUxpc3Q7IHdoaWNoXG4gICAgICogc3VwcG9ydHMgMC4ubiBsaXN0ZW5lcnMgZm9yIGFjdGl2YXRpb24vZGVhY3RpdmF0aW9uXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9idWlsZE1RTChxdWVyeTogc3RyaW5nKTogTWVkaWFRdWVyeUxpc3Qge1xuICAgICAgICBjb25zdCBjYW5MaXN0ZW4gPSAhIXdpbmRvdy5tYXRjaE1lZGlhKCdhbGwnKS5hZGRFdmVudExpc3RlbmVyO1xuICAgICAgICByZXR1cm4gY2FuTGlzdGVuID8gd2luZG93Lm1hdGNoTWVkaWEocXVlcnkpIDoge1xuICAgICAgICAgICAgbWF0Y2hlcyAgICAgICAgICAgIDogcXVlcnkgPT09ICdhbGwnIHx8IHF1ZXJ5ID09PSAnJyxcbiAgICAgICAgICAgIG1lZGlhICAgICAgICAgICAgICA6IHF1ZXJ5LFxuICAgICAgICAgICAgYWRkTGlzdGVuZXIgICAgICAgIDogKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICAgICAgYWRkRXZlbnRMaXN0ZW5lciAgIDogKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIgICAgIDogKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGlzcGF0Y2hFdmVudCAgICAgIDogKCkgPT4gZmFsc2UsXG4gICAgICAgICAgICBvbmNoYW5nZSAgICAgICAgICAgOiAoKSA9PiB1bmRlZmluZWRcbiAgICAgICAgfSBhcyBNZWRpYVF1ZXJ5TGlzdDtcbiAgICB9XG59XG5cbi8qKlxuICogUHJpdmF0ZSBnbG9iYWwgcmVnaXN0cnkgZm9yIGFsbCBkeW5hbWljYWxseS1jcmVhdGVkLCBpbmplY3RlZCBzdHlsZSB0YWdzXG4gKiBAc2VlIHByZXBhcmUocXVlcnkpXG4gKi9cbmNvbnN0IEFMTF9TVFlMRVM6IHsgW2tleTogc3RyaW5nXTogSFRNTFN0eWxlRWxlbWVudCB9ID0ge307XG5cbi8qKlxuICogRm9yIFdlYmtpdCBlbmdpbmVzIHRoYXQgb25seSB0cmlnZ2VyIHRoZSBNZWRpYVF1ZXJ5TGlzdCBMaXN0ZW5lclxuICogd2hlbiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgQ1NTIHNlbGVjdG9yIGZvciB0aGUgcmVzcGVjdGl2ZSBtZWRpYSBxdWVyeS5cbiAqXG4gKiBAcGFyYW0gbWVkaWFRdWVyaWVzIHN0cmluZ1tdIFRoZSBtZWRpYVF1ZXJpZXMgdXNlZCB0byBjcmVhdGUgYSBmYXV4IENTUyBzZWxlY3RvclxuICpcbiAqL1xuZnVuY3Rpb24gcHJlcGFyZVF1ZXJ5Q1NTKG1lZGlhUXVlcmllczogc3RyaW5nW10sIGxvZ2dlcjogTG9nZ2VyKSB7XG4gICAgY29uc3QgbGlzdCA9IG1lZGlhUXVlcmllcy5maWx0ZXIoKGl0KSA9PiAhQUxMX1NUWUxFU1tpdF0pO1xuICAgIGlmIChsaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBsaXN0LmpvaW4oJywgJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZTogSFRNTFN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG5cbiAgICAgICAgICAgIHN0eWxlLnNldEF0dHJpYnV0ZSgndHlwZScsIENPTlRFTlRfVFlQRS5URVhUX0NTUyk7XG4gICAgICAgICAgICAvLyBPbGRlciBJRXNcbiAgICAgICAgICAgIGlmICghKHN0eWxlIGFzIGFueSkuc3R5bGVTaGVldCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNzc1RleHQgPSBgLypcbiAgQGFuZ3VsYXIvZmxleC1sYXlvdXQgLSB3b3JrYXJvdW5kIGZvciBwb3NzaWJsZSBicm93c2VyIHF1aXJrIHdpdGggbWVkaWFRdWVyeSBsaXN0ZW5lcnNcbiAgc2VlIGh0dHA6Ly9iaXQubHkvMnNkNEhNUFxuKi9cbkBtZWRpYSAke3F1ZXJ5fSB7LmZ4LXF1ZXJ5LXRlc3R7IH19YDtcbiAgICAgICAgICAgICAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3NUZXh0KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQoc3R5bGUpO1xuXG4gICAgICAgICAgICAvLyBTdG9yZSBpbiBwcml2YXRlIGdsb2JhbCByZWdpc3RyeVxuICAgICAgICAgICAgbGlzdC5mb3JFYWNoKChtcSkgPT4gQUxMX1NUWUxFU1ttcV0gPSBzdHlsZSk7XG5cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEFsd2F5cyBjb252ZXJ0IHRvIHVuaXF1ZSBsaXN0IG9mIHF1ZXJpZXM7IGZvciBpdGVyYXRpb24gaW4gOjpyZWdpc3RlclF1ZXJ5KClcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUXVlcnkobWVkaWFRdWVyeT86IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiAodHlwZW9mIG1lZGlhUXVlcnkgPT09ICd1bmRlZmluZWQnKSA/IFtdIDpcbiAgICAgICAgKHR5cGVvZiBtZWRpYVF1ZXJ5ID09PSAnc3RyaW5nJykgPyBbbWVkaWFRdWVyeV0gOiB1bmlxdWUobWVkaWFRdWVyeSk7XG59XG5cbi8qKlxuICogRmlsdGVyIGR1cGxpY2F0ZSBtZWRpYVF1ZXJpZXMgaW4gdGhlIGxpc3RcbiAqL1xuZnVuY3Rpb24gdW5pcXVlKGxpc3Q6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNlZW46IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG4gICAgcmV0dXJuIGxpc3QuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBzZWVuLmhhc093blByb3BlcnR5KGl0ZW0pID8gZmFsc2UgOiAoc2VlbltpdGVtXSA9IHRydWUpO1xuICAgIH0pO1xufVxuIl19