UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

149 lines 21.6 kB
/** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { DOCUMENT } from '@angular/common'; import { Inject, Injectable } from '@angular/core'; import { BehaviorSubject, of, ReplaySubject } from 'rxjs'; import { map, tap } from 'rxjs/operators'; import { PREFIX, warn } from 'ng-zorro-antd/core/logger'; import * as i0 from "@angular/core"; import * as i1 from "ng-zorro-antd/core/config"; const NZ_CONFIG_MODULE_NAME = 'codeEditor'; function tryTriggerFunc(fn) { return (...args) => { if (fn) { fn(...args); } }; } // Caretaker note: previously, these were `NzCodeEditorService` properties. // They're kept as static variables because this will allow loading Monaco only once. // This applies to micro frontend apps with multiple Angular apps or a single Angular app // that can be bootstrapped and destroyed multiple times (e.g. using Webpack module federation). // Root providers are re-initialized each time the app is bootstrapped. Platform providers aren't. // We can't make the `NzCodeEditorService` to be a platform provider (`@Injectable({ providedIn: 'platform' })`) // since it depends on other root providers. const loaded$ = new ReplaySubject(1); let loadingStatus = "unload" /* NzCodeEditorLoadingStatus.UNLOAD */; export class NzCodeEditorService { constructor(nzConfigService, _document) { this.nzConfigService = nzConfigService; this.firstEditorInitialized = false; this.option = {}; this.option$ = new BehaviorSubject(this.option); const globalConfig = this.nzConfigService.getConfigForComponent(NZ_CONFIG_MODULE_NAME); this.document = _document; this.config = { ...globalConfig }; if (this.config.monacoEnvironment) { window.MonacoEnvironment = { ...this.config.monacoEnvironment }; } this.option = this.config.defaultEditorOption || {}; this.subscription = this.nzConfigService.getConfigChangeEventForComponent(NZ_CONFIG_MODULE_NAME).subscribe(() => { const newGlobalConfig = this.nzConfigService.getConfigForComponent(NZ_CONFIG_MODULE_NAME); if (newGlobalConfig) { this._updateDefaultOption(newGlobalConfig.defaultEditorOption); } }); } ngOnDestroy() { this.subscription.unsubscribe(); this.subscription = null; } _updateDefaultOption(option) { this.option = { ...this.option, ...option }; this.option$.next(this.option); if ('theme' in option && option.theme) { monaco.editor.setTheme(option.theme); } } requestToInit() { if (loadingStatus === "LOADED" /* NzCodeEditorLoadingStatus.LOADED */) { this.onInit(); return of(this.getLatestOption()); } if (loadingStatus === "unload" /* NzCodeEditorLoadingStatus.UNLOAD */) { if (this.config.useStaticLoading && typeof monaco === 'undefined') { warn('You choose to use static loading but it seems that you forget ' + 'to config webpack plugin correctly. Please refer to our official website' + 'for more details about static loading.'); } else { this.loadMonacoScript(); } } return loaded$.pipe(tap(() => this.onInit()), map(() => this.getLatestOption())); } loadMonacoScript() { if (this.config.useStaticLoading) { Promise.resolve().then(() => this.onLoad()); return; } if (loadingStatus === "loading" /* NzCodeEditorLoadingStatus.LOADING */) { return; } loadingStatus = "loading" /* NzCodeEditorLoadingStatus.LOADING */; const assetsRoot = this.config.assetsRoot; const vs = assetsRoot ? `${assetsRoot}/vs` : 'assets/vs'; const windowAsAny = window; const loadScript = this.document.createElement('script'); loadScript.type = 'text/javascript'; loadScript.src = `${vs}/loader.js`; const onLoad = () => { cleanup(); windowAsAny.require.config({ paths: { vs }, ...this.config.extraConfig }); windowAsAny.require(['vs/editor/editor.main'], () => { this.onLoad(); }); }; const onError = () => { cleanup(); throw new Error(`${PREFIX} cannot load assets of monaco editor from source "${vs}".`); }; const cleanup = () => { // Caretaker note: we have to remove these listeners once the `<script>` is loaded successfully // or not since the `onLoad` listener captures `this`, which will prevent the `NzCodeEditorService` // from being garbage collected. loadScript.removeEventListener('load', onLoad); loadScript.removeEventListener('error', onError); // We don't need to keep the `<script>` element within the `<body>` since JavaScript has // been executed and Monaco is available globally. E.g. Webpack, always removes `<script>` // elements after loading chunks (see its `LoadScriptRuntimeModule`). this.document.documentElement.removeChild(loadScript); }; loadScript.addEventListener('load', onLoad); loadScript.addEventListener('error', onError); this.document.documentElement.appendChild(loadScript); } onLoad() { loadingStatus = "LOADED" /* NzCodeEditorLoadingStatus.LOADED */; loaded$.next(true); loaded$.complete(); tryTriggerFunc(this.config.onLoad)(); } onInit() { if (!this.firstEditorInitialized) { this.firstEditorInitialized = true; tryTriggerFunc(this.config.onFirstEditorInit)(); } tryTriggerFunc(this.config.onInit)(); } getLatestOption() { return { ...this.option }; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: NzCodeEditorService, deps: [{ token: i1.NzConfigService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: NzCodeEditorService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: NzCodeEditorService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i1.NzConfigService }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1lZGl0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvY29kZS1lZGl0b3IvY29kZS1lZGl0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBYyxFQUFFLEVBQUUsYUFBYSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUNwRixPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7OztBQU96RCxNQUFNLHFCQUFxQixHQUFHLFlBQVksQ0FBQztBQUUzQyxTQUFTLGNBQWMsQ0FBQyxFQUF3QztJQUM5RCxPQUFPLENBQUMsR0FBRyxJQUFpQixFQUFFLEVBQUU7UUFDOUIsSUFBSSxFQUFFLEVBQUU7WUFDTixFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztTQUNiO0lBQ0gsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELDJFQUEyRTtBQUMzRSxxRkFBcUY7QUFDckYseUZBQXlGO0FBQ3pGLGdHQUFnRztBQUNoRyxrR0FBa0c7QUFDbEcsZ0hBQWdIO0FBQ2hILDRDQUE0QztBQUM1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLGFBQWEsQ0FBVSxDQUFDLENBQUMsQ0FBQztBQUM5QyxJQUFJLGFBQWEsa0RBQW1DLENBQUM7QUFLckQsTUFBTSxPQUFPLG1CQUFtQjtJQVM5QixZQUNtQixlQUFnQyxFQUMvQixTQUFvQjtRQURyQixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFSM0MsMkJBQXNCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLFdBQU0s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Y2VzQ29udGVudCI6WyIvKipcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBvZiwgUmVwbGF5U3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQ29kZUVkaXRvckNvbmZpZywgTnpDb25maWdTZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL2NvbmZpZyc7XG5pbXBvcnQgeyBQUkVGSVgsIHdhcm4gfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvbG9nZ2VyJztcbmltcG9ydCB7IE56U2FmZUFueSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5cbmltcG9ydCB7IEpvaW5lZEVkaXRvck9wdGlvbnMsIE56Q29kZUVkaXRvckxvYWRpbmdTdGF0dXMgfSBmcm9tICcuL3R5cGluZ3MnO1xuXG5kZWNsYXJlIGNvbnN0IG1vbmFjbzogTnpTYWZlQW55O1xuXG5jb25zdCBOWl9DT05GSUdfTU9EVUxFX05BTUUgPSAnY29kZUVkaXRvcic7XG5cbmZ1bmN0aW9uIHRyeVRyaWdnZXJGdW5jKGZuPzogKC4uLmFyZ3M6IE56U2FmZUFueVtdKSA9PiBOelNhZmVBbnkpOiAoLi4uYXJnczogTnpTYWZlQW55KSA9PiB2b2lkIHtcbiAgcmV0dXJuICguLi5hcmdzOiBOelNhZmVBbnlbXSkgPT4ge1xuICAgIGlmIChmbikge1xuICAgICAgZm4oLi4uYXJncyk7XG4gICAgfVxuICB9O1xufVxuXG4vLyBDYXJldGFrZXIgbm90ZTogcHJldmlvdXNseSwgdGhlc2Ugd2VyZSBgTnpDb2RlRWRpdG9yU2VydmljZWAgcHJvcGVydGllcy5cbi8vIFRoZXkncmUga2VwdCBhcyBzdGF0aWMgdmFyaWFibGVzIGJlY2F1c2UgdGhpcyB3aWxsIGFsbG93IGxvYWRpbmcgTW9uYWNvIG9ubHkgb25jZS5cbi8vIFRoaXMgYXBwbGllcyB0byBtaWNybyBmcm9udGVuZCBhcHBzIHdpdGggbXVsdGlwbGUgQW5ndWxhciBhcHBzIG9yIGEgc2luZ2xlIEFuZ3VsYXIgYXBwXG4vLyB0aGF0IGNhbiBiZSBib290c3RyYXBwZWQgYW5kIGRlc3Ryb3llZCBtdWx0aXBsZSB0aW1lcyAoZS5nLiB1c2luZyBXZWJwYWNrIG1vZHVsZSBmZWRlcmF0aW9uKS5cbi8vIFJvb3QgcHJvdmlkZXJzIGFyZSByZS1pbml0aWFsaXplZCBlYWNoIHRpbWUgdGhlIGFwcCBpcyBib290c3RyYXBwZWQuIFBsYXRmb3JtIHByb3ZpZGVycyBhcmVuJ3QuXG4vLyBXZSBjYW4ndCBtYWtlIHRoZSBgTnpDb2RlRWRpdG9yU2VydmljZWAgdG8gYmUgYSBwbGF0Zm9ybSBwcm92aWRlciAoYEBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3BsYXRmb3JtJyB9KWApXG4vLyBzaW5jZSBpdCBkZXBlbmRzIG9uIG90aGVyIHJvb3QgcHJvdmlkZXJzLlxuY29uc3QgbG9hZGVkJCA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xubGV0IGxvYWRpbmdTdGF0dXMgPSBOekNvZGVFZGl0b3JMb2FkaW5nU3RhdHVzLlVOTE9BRDtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTnpDb2RlRWRpdG9yU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50O1xuICBwcml2YXRlIGZpcnN0RWRpdG9ySW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBvcHRpb246IEpvaW5lZEVkaXRvck9wdGlvbnMgPSB7fTtcbiAgcHJpdmF0ZSBjb25maWc6IENvZGVFZGl0b3JDb25maWc7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsO1xuXG4gIG9wdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEpvaW5lZEVkaXRvck9wdGlvbnM+KHRoaXMub3B0aW9uKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG56Q29uZmlnU2VydmljZTogTnpDb25maWdTZXJ2aWNlLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIF9kb2N1bWVudDogTnpTYWZlQW55XG4gICkge1xuICAgIGNvbnN0IGdsb2JhbENvbmZpZyA9IHRoaXMubnpDb25maWdTZXJ2aWNlLmdldENvbmZpZ0ZvckNvbXBvbmVudChOWl9DT05GSUdfTU9EVUxFX05BTUUpO1xuXG4gICAgdGhpcy5kb2N1bWVudCA9IF9kb2N1bWVudDtcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4uZ2xvYmFsQ29uZmlnIH07XG4gICAgaWYgKHRoaXMuY29uZmlnLm1vbmFjb0Vudmlyb25tZW50KSB7XG4gICAgICB3aW5kb3cuTW9uYWNvRW52aXJvbm1lbnQgPSB7IC4uLnRoaXMuY29uZmlnLm1vbmFjb0Vudmlyb25tZW50IH07XG4gICAgfVxuICAgIHRoaXMub3B0aW9uID0gdGhpcy5jb25maWcuZGVmYXVsdEVkaXRvck9wdGlvbiB8fCB7fTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5uekNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnQ2hhbmdlRXZlbnRGb3JDb21wb25lbnQoTlpfQ09ORklHX01PRFVMRV9OQU1FKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgY29uc3QgbmV3R2xvYmFsQ29uZmlnOiBOelNhZmVBbnkgPSB0aGlzLm56Q29uZmlnU2VydmljZS5nZXRDb25maWdGb3JDb21wb25lbnQoTlpfQ09ORklHX01PRFVMRV9OQU1FKTtcbiAgICAgIGlmIChuZXdHbG9iYWxDb25maWcpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlRGVmYXVsdE9wdGlvbihuZXdHbG9iYWxDb25maWcuZGVmYXVsdEVkaXRvck9wdGlvbik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiEudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVEZWZhdWx0T3B0aW9uKG9wdGlvbjogSm9pbmVkRWRpdG9yT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMub3B0aW9uID0geyAuLi50aGlzLm9wdGlvbiwgLi4ub3B0aW9uIH07XG4gICAgdGhpcy5vcHRpb24kLm5leHQodGhpcy5vcHRpb24pO1xuXG4gICAgaWYgKCd0aGVtZScgaW4gb3B0aW9uICYmIG9wdGlvbi50aGVtZSkge1xuICAgICAgbW9uYWNvLmVkaXRvci5zZXRUaGVtZShvcHRpb24udGhlbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJlcXVlc3RUb0luaXQoKTogT2JzZXJ2YWJsZTxKb2luZWRFZGl0b3JPcHRpb25zPiB7XG4gICAgaWYgKGxvYWRpbmdTdGF0dXMgPT09IE56Q29kZUVkaXRvckxvYWRpbmdTdGF0dXMuTE9BREVEKSB7XG4gICAgICB0aGlzLm9uSW5pdCgpO1xuICAgICAgcmV0dXJuIG9mKHRoaXMuZ2V0TGF0ZXN0T3B0aW9uKCkpO1xuICAgIH1cblxuICAgIGlmIChsb2FkaW5nU3RhdHVzID09PSBOekNvZGVFZGl0b3JMb2FkaW5nU3RhdHVzLlVOTE9BRCkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLnVzZVN0YXRpY0xvYWRpbmcgJiYgdHlwZW9mIG1vbmFjbyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAnWW91IGNob29zZSB0byB1c2Ugc3RhdGljIGxvYWRpbmcgYnV0IGl0IHNlZW1zIHRoYXQgeW91IGZvcmdldCAnICtcbiAgICAgICAgICAgICd0byBjb25maWcgd2VicGFjayBwbHVnaW4gY29ycmVjdGx5LiBQbGVhc2UgcmVmZXIgdG8gb3VyIG9mZmljaWFsIHdlYnNpdGUnICtcbiAgICAgICAgICAgICdmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHN0YXRpYyBsb2FkaW5nLidcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9hZE1vbmFjb1NjcmlwdCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsb2FkZWQkLnBpcGUoXG4gICAgICB0YXAoKCkgPT4gdGhpcy5vbkluaXQoKSksXG4gICAgICBtYXAoKCkgPT4gdGhpcy5nZXRMYXRlc3RPcHRpb24oKSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkTW9uYWNvU2NyaXB0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmZpZy51c2VTdGF0aWNMb2FkaW5nKSB7XG4gICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHRoaXMub25Mb2FkKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChsb2FkaW5nU3RhdHVzID09PSBOekNvZGVFZGl0b3JMb2FkaW5nU3RhdHVzLkxPQURJTkcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2FkaW5nU3RhdHVzID0gTnpDb2RlRWRpdG9yTG9hZGluZ1N0YXR1cy5MT0FESU5HO1xuXG4gICAgY29uc3QgYXNzZXRzUm9vdCA9IHRoaXMuY29uZmlnLmFzc2V0c1Jvb3Q7XG4gICAgY29uc3QgdnMgPSBhc3NldHNSb290ID8gYCR7YXNzZXRzUm9vdH0vdnNgIDogJ2Fzc2V0cy92cyc7XG4gICAgY29uc3Qgd2luZG93QXNBbnkgPSB3aW5kb3cgYXMgTnpTYWZlQW55O1xuICAgIGNvbnN0IGxvYWRTY3JpcHQgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuXG4gICAgbG9hZFNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgbG9hZFNjcmlwdC5zcmMgPSBgJHt2c30vbG9hZGVyLmpzYDtcblxuICAgIGNvbnN0IG9uTG9hZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICAgIHdpbmRvd0FzQW55LnJlcXVpcmUuY29uZmlnKHtcbiAgICAgICAgcGF0aHM6IHsgdnMgfSxcbiAgICAgICAgLi4udGhpcy5jb25maWcuZXh0cmFDb25maWdcbiAgICAgIH0pO1xuICAgICAgd2luZG93QXNBbnkucmVxdWlyZShbJ3ZzL2VkaXRvci9lZGl0b3IubWFpbiddLCAoKSA9PiB7XG4gICAgICAgIHRoaXMub25Mb2FkKCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25FcnJvciA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtQUkVGSVh9IGNhbm5vdCBsb2FkIGFzc2V0cyBvZiBtb25hY28gZWRpdG9yIGZyb20gc291cmNlIFwiJHt2c31cIi5gKTtcbiAgICB9O1xuXG4gICAgY29uc3QgY2xlYW51cCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIC8vIENhcmV0YWtlciBub3RlOiB3ZSBoYXZlIHRvIHJlbW92ZSB0aGVzZSBsaXN0ZW5lcnMgb25jZSB0aGUgYDxzY3JpcHQ+YCBpcyBsb2FkZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICAvLyBvciBub3Qgc2luY2UgdGhlIGBvbkxvYWRgIGxpc3RlbmVyIGNhcHR1cmVzIGB0aGlzYCwgd2hpY2ggd2lsbCBwcmV2ZW50IHRoZSBgTnpDb2RlRWRpdG9yU2VydmljZWBcbiAgICAgIC8vIGZyb20gYmVpbmcgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gICAgICBsb2FkU2NyaXB0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBvbkxvYWQpO1xuICAgICAgbG9hZFNjcmlwdC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBrZWVwIHRoZSBgPHNjcmlwdD5gIGVsZW1lbnQgd2l0aGluIHRoZSBgPGJvZHk+YCBzaW5jZSBKYXZhU2NyaXB0IGhhc1xuICAgICAgLy8gYmVlbiBleGVjdXRlZCBhbmQgTW9uYWNvIGlzIGF2YWlsYWJsZSBnbG9iYWxseS4gRS5nLiBXZWJwYWNrLCBhbHdheXMgcmVtb3ZlcyBgPHNjcmlwdD5gXG4gICAgICAvLyBlbGVtZW50cyBhZnRlciBsb2FkaW5nIGNodW5rcyAoc2VlIGl0cyBgTG9hZFNjcmlwdFJ1bnRpbWVNb2R1bGVgKS5cbiAgICAgIHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKGxvYWRTY3JpcHQpO1xuICAgIH07XG5cbiAgICBsb2FkU2NyaXB0LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBvbkxvYWQpO1xuICAgIGxvYWRTY3JpcHQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcblxuICAgIHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKGxvYWRTY3JpcHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkxvYWQoKTogdm9pZCB7XG4gICAgbG9hZGluZ1N0YXR1cyA9IE56Q29kZUVkaXRvckxvYWRpbmdTdGF0dXMuTE9BREVEO1xuICAgIGxvYWRlZCQubmV4dCh0cnVlKTtcbiAgICBsb2FkZWQkLmNvbXBsZXRlKCk7XG5cbiAgICB0cnlUcmlnZ2VyRnVuYyh0aGlzLmNvbmZpZy5vbkxvYWQpKCk7XG4gIH1cblxuICBwcml2YXRlIG9uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZmlyc3RFZGl0b3JJbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5maXJzdEVkaXRvckluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHRyeVRyaWdnZXJGdW5jKHRoaXMuY29uZmlnLm9uRmlyc3RFZGl0b3JJbml0KSgpO1xuICAgIH1cblxuICAgIHRyeVRyaWdnZXJGdW5jKHRoaXMuY29uZmlnLm9uSW5pdCkoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGF0ZXN0T3B0aW9uKCk6IEpvaW5lZEVkaXRvck9wdGlvbnMge1xuICAgIHJldHVybiB7IC4uLnRoaXMub3B0aW9uIH07XG4gIH1cbn1cbiJdfQ==