@dotglitch/ngx-common 1.0.26 → 1.0.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -109,10 +109,12 @@ export declare class LazyLoaderComponent implements AfterViewInit {
109
109
  private err;
110
110
  private warn;
111
111
  private log;
112
- private loaderEmitter;
112
+ private clearEmitter;
113
113
  private clearLoader$;
114
- private loaderSub;
115
- showLoader: boolean;
114
+ private showEmitter;
115
+ private showLoader$;
116
+ private subscriptions;
117
+ renderSpinner: boolean;
116
118
  isClearingLoader: boolean;
117
119
  constructor(service: LazyLoaderService, viewContainerRef: ViewContainerRef, dialog: DialogRef, dialogArguments: any);
118
120
  private initialized;
@@ -120,9 +120,23 @@ export class LazyLoaderComponent {
120
120
  */
121
121
  this.componentLoaded = new EventEmitter();
122
122
  // Force 500ms delay before revealing the spinner
123
- this.loaderEmitter = new EventEmitter();
124
- this.clearLoader$ = this.loaderEmitter.pipe(debounceTime(300));
125
- this.showLoader = true; // whether we render the DOM for the spinner
123
+ this.clearEmitter = new EventEmitter();
124
+ this.clearLoader$ = this.clearEmitter.pipe(debounceTime(300));
125
+ this.showEmitter = new EventEmitter();
126
+ this.showLoader$ = this.showEmitter.pipe(debounceTime(1));
127
+ this.subscriptions = [
128
+ this.clearLoader$.subscribe(() => {
129
+ this.isClearingLoader = true;
130
+ setTimeout(() => {
131
+ this.renderSpinner = false;
132
+ }, 300);
133
+ }),
134
+ this.showLoader$.subscribe(() => {
135
+ this.isClearingLoader = false;
136
+ this.renderSpinner = true;
137
+ })
138
+ ];
139
+ this.renderSpinner = true; // whether we render the DOM for the spinner
126
140
  this.isClearingLoader = false; // should the spinner start fading out
127
141
  this.initialized = false;
128
142
  this.config = LazyLoaderService.config;
@@ -136,14 +150,11 @@ export class LazyLoaderComponent {
136
150
  this.id = this.dialogArguments.id;
137
151
  this.group = this.dialogArguments.group;
138
152
  }
139
- this.loaderSub = this.clearLoader$.subscribe(() => {
140
- this.showLoader = false;
141
- });
142
153
  }
143
154
  async ngAfterViewInit() {
144
155
  this.ngOnDestroy(false);
145
156
  this.isClearingLoader = false;
146
- this.showLoader = true;
157
+ this.renderSpinner = true;
147
158
  this.initialized = true;
148
159
  if (!this._id) {
149
160
  this.warn("No component was specified!");
@@ -200,22 +211,15 @@ export class LazyLoaderComponent {
200
211
  const isLoading$ = instance['ngxShowDistractor$'];
201
212
  if (isLoading$ && typeof isLoading$.subscribe == "function") {
202
213
  this.distractorSubscription = isLoading$.subscribe(loading => {
203
- if (!loading) {
204
- this.isClearingLoader = true;
205
- this.loaderEmitter.emit();
206
- }
207
- else {
208
- this.showLoader = true;
209
- this.isClearingLoader = false;
210
- }
214
+ loading ? this.showEmitter.emit() : this.clearEmitter.emit();
211
215
  });
212
216
  }
213
217
  else {
214
- this.isClearingLoader = true;
218
+ this.clearEmitter.emit();
215
219
  }
216
220
  const name = Object.keys(bundle)[0];
217
221
  this.log(`Loaded '${name}'`);
218
- this.loaderEmitter.emit();
222
+ this.clearEmitter.emit();
219
223
  return componentRef;
220
224
  }
221
225
  catch (ex) {
@@ -240,7 +244,9 @@ export class LazyLoaderComponent {
240
244
  this.outputSubscriptions = {};
241
245
  // Clear all things
242
246
  if (clearAll) {
243
- this.loaderSub?.unsubscribe();
247
+ Object.entries(this.subscriptions).forEach(([key, sub]) => {
248
+ sub.unsubscribe();
249
+ });
244
250
  }
245
251
  this.distractorSubscription?.unsubscribe();
246
252
  // Clear target container
@@ -309,7 +315,7 @@ export class LazyLoaderComponent {
309
315
  loadDefault() {
310
316
  if (this.config.notFoundComponent)
311
317
  this.targetContainer.createComponent(this.config.notFoundComponent);
312
- this.showLoader = false;
318
+ this.clearEmitter.emit();
313
319
  }
314
320
  /**
315
321
  * Load the "Error" component.
@@ -320,14 +326,14 @@ export class LazyLoaderComponent {
320
326
  loadError() {
321
327
  if (this.config.errorComponent)
322
328
  this.targetContainer.createComponent(this.config.errorComponent);
323
- this.showLoader = false;
329
+ this.clearEmitter.emit();
324
330
  }
325
331
  }
326
332
  LazyLoaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: LazyLoaderComponent, deps: [{ token: i1.LazyLoaderService }, { token: i0.ViewContainerRef, optional: true }, { token: i2.DialogRef, optional: true }, { token: MAT_DIALOG_DATA, optional: true }], target: i0.ɵɵFactoryTarget.Component });
327
- LazyLoaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: LazyLoaderComponent, isStandalone: true, selector: "ngx-lazy-loader", inputs: { id: ["component", "id"], group: "group", inputs: "inputs", outputs: "outputs" }, outputs: { componentLoadError: "componentLoadError", componentLoaded: "componentLoaded" }, viewQueries: [{ propertyName: "targetContainer", first: true, predicate: ["content"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<ng-container #content></ng-container>\n\n<div class=\"ngx-lazy-loader-distractor\" [class.destroying]=\"isClearingLoader\">\n <ng-container *ngIf=\"config.loaderDistractorComponent\" [ngComponentOutlet]=\"config.loaderDistractorComponent\"></ng-container>\n <ng-container *ngIf=\"config.loaderDistractorTemplate\" [ngTemplateOutlet]=\"config.loaderDistractorTemplate\" [ngTemplateOutletContext]=\"{ '$implicit': inputs }\"></ng-container>\n</div>\n", styles: [":host{display:contents;contain:content;z-index:1;position:relative}.ngx-lazy-loader-distractor{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;flex-direction:column;background-color:var(--background-color, #212121);opacity:1;transition:opacity .3s ease;z-index:999999}.ngx-lazy-loader-distractor.destroying{opacity:0;pointer-events:none}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
333
+ LazyLoaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: LazyLoaderComponent, isStandalone: true, selector: "ngx-lazy-loader", inputs: { id: ["component", "id"], group: "group", inputs: "inputs", outputs: "outputs" }, outputs: { componentLoadError: "componentLoadError", componentLoaded: "componentLoaded" }, viewQueries: [{ propertyName: "targetContainer", first: true, predicate: ["content"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<ng-container #content></ng-container>\n\n<div\n *ngIf=\"renderSpinner\"\n class=\"ngx-lazy-loader-distractor\"\n [class.destroying]=\"isClearingLoader\"\n>\n <ng-container *ngIf=\"config.loaderDistractorComponent\" [ngComponentOutlet]=\"config.loaderDistractorComponent\"></ng-container>\n <ng-container *ngIf=\"config.loaderDistractorTemplate\" [ngTemplateOutlet]=\"config.loaderDistractorTemplate\" [ngTemplateOutletContext]=\"{ '$implicit': inputs }\"></ng-container>\n</div>\n", styles: [":host{display:contents;contain:content;z-index:1;position:relative}.ngx-lazy-loader-distractor{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;flex-direction:column;background-color:var(--background-color, #212121);opacity:1;transition:opacity .3s ease;z-index:999999;animation:fade-in .3s ease}.ngx-lazy-loader-distractor.destroying{opacity:0;pointer-events:none}@keyframes fade-in{0%{opacity:0;pointer-events:none}to{opacity:1;pointer-events:all}}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
328
334
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: LazyLoaderComponent, decorators: [{
329
335
  type: Component,
330
- args: [{ selector: 'ngx-lazy-loader', imports: [NgIf, NgComponentOutlet, NgTemplateOutlet], standalone: true, template: "<ng-container #content></ng-container>\n\n<div class=\"ngx-lazy-loader-distractor\" [class.destroying]=\"isClearingLoader\">\n <ng-container *ngIf=\"config.loaderDistractorComponent\" [ngComponentOutlet]=\"config.loaderDistractorComponent\"></ng-container>\n <ng-container *ngIf=\"config.loaderDistractorTemplate\" [ngTemplateOutlet]=\"config.loaderDistractorTemplate\" [ngTemplateOutletContext]=\"{ '$implicit': inputs }\"></ng-container>\n</div>\n", styles: [":host{display:contents;contain:content;z-index:1;position:relative}.ngx-lazy-loader-distractor{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;flex-direction:column;background-color:var(--background-color, #212121);opacity:1;transition:opacity .3s ease;z-index:999999}.ngx-lazy-loader-distractor.destroying{opacity:0;pointer-events:none}\n"] }]
336
+ args: [{ selector: 'ngx-lazy-loader', imports: [NgIf, NgComponentOutlet, NgTemplateOutlet], standalone: true, template: "<ng-container #content></ng-container>\n\n<div\n *ngIf=\"renderSpinner\"\n class=\"ngx-lazy-loader-distractor\"\n [class.destroying]=\"isClearingLoader\"\n>\n <ng-container *ngIf=\"config.loaderDistractorComponent\" [ngComponentOutlet]=\"config.loaderDistractorComponent\"></ng-container>\n <ng-container *ngIf=\"config.loaderDistractorTemplate\" [ngTemplateOutlet]=\"config.loaderDistractorTemplate\" [ngTemplateOutletContext]=\"{ '$implicit': inputs }\"></ng-container>\n</div>\n", styles: [":host{display:contents;contain:content;z-index:1;position:relative}.ngx-lazy-loader-distractor{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;flex-direction:column;background-color:var(--background-color, #212121);opacity:1;transition:opacity .3s ease;z-index:999999;animation:fade-in .3s ease}.ngx-lazy-loader-distractor.destroying{opacity:0;pointer-events:none}@keyframes fade-in{0%{opacity:0;pointer-events:none}to{opacity:1;pointer-events:all}}\n"] }]
331
337
  }], ctorParameters: function () { return [{ type: i1.LazyLoaderService }, { type: i0.ViewContainerRef, decorators: [{
332
338
  type: Optional
333
339
  }] }, { type: i2.DialogRef, decorators: [{
@@ -357,4 +363,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
357
363
  }], componentLoaded: [{
358
364
  type: Output
359
365
  }] } });
360
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF6eS1sb2FkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL3NyYy9jb21wb25lbnRzL2xhenktbG9hZGVyL2xhenktbG9hZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvY29tcG9uZW50cy9sYXp5LWxvYWRlci9sYXp5LWxvYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBZ0IsWUFBWSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQW1DLE1BQU0sZUFBZSxDQUFDO0FBQ2hMLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsZUFBZSxHQUFHLE1BQU0sMEJBQTBCLENBQUM7QUFFNUQsT0FBTyxFQUFtQixZQUFZLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7Ozs7QUFXM0MsTUFBTSxPQUFPLG1CQUFtQjtJQWdCNUI7O09BRUc7SUFDSCxJQUF3QixFQUFFLENBQUMsSUFBWTtRQUNuQyxNQUFNLEVBQUUsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFOUIsMERBQTBEO1FBQzFELGlFQUFpRTtRQUNqRSxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUU7WUFDcEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FD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dCI6WyJpbXBvcnQgeyBJbnB1dCwgVmlld0NvbnRhaW5lclJlZiwgaXNEZXZNb2RlLCBDb21wb25lbnRSZWYsIEV2ZW50RW1pdHRlciwgT3B0aW9uYWwsIFZpZXdDaGlsZCwgQ29tcG9uZW50LCBJbmplY3QsIE91dHB1dCwgTmdNb2R1bGUsIEFmdGVyVmlld0luaXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdDb21wb25lbnRPdXRsZXQsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBEaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9jZGsvZGlhbG9nJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZGVib3VuY2VUaW1lLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IExhenlMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnLi9sYXp5LWxvYWRlci5zZXJ2aWNlJztcbmltcG9ydCB7IHN0cmluZ1RvU2x1ZyB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IENvbXBpbGVkQnVuZGxlLCBOZ3hMYXp5TG9hZGVyQ29uZmlnIH0gZnJvbSAnLi90eXBlcyc7XG5cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduZ3gtbGF6eS1sb2FkZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9sYXp5LWxvYWRlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbICcuL2xhenktbG9hZGVyLmNvbXBvbmVudC5zY3NzJyBdLFxuICAgIGltcG9ydHM6IFsgTmdJZiwgTmdDb21wb25lbnRPdXRsZXQsIE5nVGVtcGxhdGVPdXRsZXQgXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIExhenlMb2FkZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgICBAVmlld0NoaWxkKFwiY29udGVudFwiLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSkgdGFyZ2V0Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gICAgLyoqXG4gICAgICogISBIZXJlIGJlIGRyYWdvbnMuXG4gICAgICogT25seSB0aGUgYnJhdmVzdCBvZiBBZHZlbnR1cmVycyBjYW4gc3Vydml2ZSB0aGUgYmF0dGxlcyBiZWxvdyxcbiAgICAgKiBhbmQgdGhleSBtdXN0IGJlIHRyYWluZWQgYW5kIHJlYWR5IGZvciB0aGUgZ3J1ZWxsaW5nIGpvdXJuZXkgYWhlYWQuXG4gICAgICogTWFueSBhIHNvdWwgaGFzIHRyaWVkIHRvIGJlc3QgdGhlc2UgRHJhZ29ucywgeWV0IG9ubHkgb25lIGhhc1xuICAgICAqIHN1Y2NlZWRlZCBzaW5jZSBvdXIgZm91bmRpbmcuXG4gICAgICpcbiAgICAgKiBUTDtEUiAtLSBEb24ndCBtZXNzIHdpdGggdGhpcyB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuXG4gICAgICogICAgIFRoaXMgaXMgY2VudHJhbCB0byBhIHRvbiBvZiBtb3ZpbmcgcGFydHMgLS0gYnJlYWtpbmcgaXQgd2lsbFxuICAgICAqICAgICBjYXVzZSBtb3JlIGNvbGxhdGVyYWwgZGFtYWdlIHRoYW4geW91IG1heSByZWFsaXplLlxuICAgICAqL1xuXG4gICAgcHJpdmF0ZSBfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGNvbXBvbmVudCB0aGF0IHdpbGwgYmUgbGF6eSBsb2FkZWRcbiAgICAgKi9cbiAgICBASW5wdXQoXCJjb21wb25lbnRcIikgc2V0IGlkKGRhdGE6IHN0cmluZykge1xuICAgICAgICBjb25zdCBpZCA9IHN0cmluZ1RvU2x1ZyhkYXRhKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIGNoYW5nZSB0byB0aGUgbG9hZGVkIGNvbXBvbmVudCdzIGlkXG4gICAgICAgIC8vIGlmIGl0J3MgdXBkYXRlZCwgd2UgZGVzdHJveSBhbmQgcmVoeWRyYXRlIHRoZSBlbnRpcmUgY29udGFpbmVyXG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkICYmIHRoaXMuX2lkICE9IGlkKSB7XG4gICAgICAgICAgICB0aGlzLl9pZCA9IGlkO1xuICAgICAgICAgICAgdGhpcy5uZ0FmdGVyVmlld0luaXQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2lkID0gaWQ7XG4gICAgICAgIH1cbiAgICB9O1xuXG5cbiAgICBwcml2YXRlIF9ncm91cCA9IFwiZGVmYXVsdFwiO1xuICAgIEBJbnB1dChcImdyb3VwXCIpIHNldCBncm91cChkYXRhOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSBzdHJpbmdUb1NsdWcoZGF0YSk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBncm91cCAhPSBcInN0cmluZ1wiIHx8ICFncm91cCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIElmIHRoZSBncm91cCB3YXMgdXBkYXRlZCwgcmV0cnkgdG8gYm9vdHN0cmFwIHNvbWV0aGluZyBpbnRvIHRoZSBjb250YWluZXIuXG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkICYmIHRoaXMuX2dyb3VwICE9IGdyb3VwKSB7XG4gICAgICAgICAgICB0aGlzLl9ncm91cCA9IGdyb3VwO1xuXG4gICAgICAgICAgICB0aGlzLm5nQWZ0ZXJWaWV3SW5pdCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZ3JvdXAgPSBncm91cDtcbiAgICB9XG4gICAgZ2V0IGdyb3VwKCkgeyByZXR1cm4gdGhpcy5fZ3JvdXAgfVxuXG4gICAgcHJpdmF0ZSBfbWF0Y2hHcm91cHM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gICAgcHJpdmF0ZSBfaW5wdXRzOiB7IFtrZXk6IHN0cmluZ106IGFueTsgfTtcbiAgICAvKipcbiAgICAgKiBBIG1hcCBvZiBpbnB1dHMgdG8gYmluZCB0byB0aGUgY2hpbGQuXG4gICAgICogU3VwcG9ydHMgY2hhbmdlIGRldGVjdGlvbi4gKE1heSBmYWlsIG9uIGRlZXAgSlNPTiBjaGFuZ2VzKVxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxsYXp5LWxvYWRlciBjb21wb25lbnQ9XCJNeUxhenlDb21wb25lbnRcIlxuICAgICAqICAgICAgIFtpbnB1dHNdPVwie1xuICAgICAqICAgICAgICAgIHByb3AxOiB0cnVlLFxuICAgICAqICAgICAgICAgIHByb3AyOiBmYWxzZSxcbiAgICAgKiAgICAgICAgICBjb21wbGV4OiB7XG4gICAgICogICAgICAgICAgICAgIGE6IHRydWUsXG4gICAgICogICAgICAgICAgICAgIGI6IDBcbiAgICAgKiAgICAgICAgICB9XG4gICAgICogICAgICAgfVwiXG4gICAgICogPlxuICAgICAqIDwvbGF6eS1sb2FkZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KFwiaW5wdXRzXCIpIHNldCBpbnB1dHMoZGF0YTogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0pIHtcbiAgICAgICAgaWYgKGRhdGEgPT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgICAgbGV0IHByZXZpb3VzID0gdGhpcy5faW5wdXRzO1xuICAgICAgICB0aGlzLl9pbnB1dHMgPSBkYXRhO1xuICAgICAgICBpZiAoZGF0YSA9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBjb25zb2xlLnRyYWNlKGRhdGEpO1xuXG4gICAgICAgIGlmICh0aGlzLnRhcmdldENvbXBvbmVudEZhY3RvcnkpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgaW5wdXRzIH0gPSB0aGlzLnRhcmdldENvbXBvbmVudEZhY3RvcnkuybVjbXA7XG5cbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRLZXlzID0gT2JqZWN0LmtleXMoaW5wdXRzKTtcblxuICAgICAgICAgICAgY29uc3Qgb2xkS2V5cyA9IE9iamVjdC5rZXlzKHByZXZpb3VzKS5maWx0ZXIoa2V5ID0+IGN1cnJlbnRLZXlzLmluY2x1ZGVzKGtleSkpO1xuICAgICAgICAgICAgY29uc3QgbmV3S2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpLmZpbHRlcihrZXkgPT4gY3VycmVudEtleXMuaW5jbHVkZXMoa2V5KSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWQgPSBvbGRLZXlzLmZpbHRlcihrZXkgPT4gIW5ld0tleXMuaW5jbHVkZXMoa2V5KSk7XG5cbiAgICAgICAgICAgIC8vID8gcGVyaGFwcyBzZXQgdG8gbnVsbCBvciB1bmRlZmluZWQgaW5zdGVhZFxuICAgICAgICAgICAgcmVtb3ZlZC5mb3JFYWNoKGsgPT4gdGhpcy50YXJnZXRDb21wb25lbnRJbnN0YW5jZVtrXSA9IG51bGwpO1xuXG4gICAgICAgICAgICB0aGlzLmJpbmRJbnB1dHMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBvdXRwdXRTdWJzY3JpcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IFN1YnNjcmlwdGlvbjsgfSA9IHt9O1xuICAgIHByaXZhdGUgX291dHB1dHM6IHsgW2tleTogc3RyaW5nXTogRnVuY3Rpb247IH07XG4gICAgLyoqXG4gICAgICogQSBtYXAgb2Ygb3V0cHV0cyB0byBiaW5kIGZyb20gdGhlIGNoaWxkLlxuICAgICAqIFNob3VsZCBzdXBwb3J0IGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxsYXp5LWxvYWRlciBjb21wb25lbnQ9XCJNeUxhenlDb21wb25lbnRcIlxuICAgICAqICAgICAgIFtvdXRwdXRzXT1cIntcbiAgICAgKiAgICAgICAgICAgcHJvcDM6IG9uT3V0cHV0RmlyZVxuICAgICAqICAgICAgIH1cIlxuICAgICAqID5cbiAgICAgKiA8L2xhenktbG9hZGVyPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dChcIm91dHB1dHNcIikgc2V0IG91dHB1dHMoZGF0YTogeyBba2V5OiBzdHJpbmddOiBGdW5jdGlvbjsgfSkge1xuICAgICAgICBsZXQgcHJldmlvdXMgPSB0aGlzLl9vdXRwdXRzO1xuICAgICAgICB0aGlzLl9vdXRwdXRzID0gZGF0YTtcblxuICAgICAgICBpZiAodGhpcy50YXJnZXRDb21wb25lbnRGYWN0b3J5KSB7XG4gICAgICAgICAgICBjb25zdCB7IGlucHV0cyB9ID0gdGhpcy50YXJnZXRDb21wb25lbnRGYWN0b3J5Lsm1Y21wO1xuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50S2V5cyA9IE9iamVjdC5rZXlzKGlucHV0cyk7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVkID0gT2JqZWN0LmtleXMocHJldmlvdXMpLmZpbHRlcihrZXkgPT4gIWN1cnJlbnRLZXlzLmluY2x1ZGVzKGtleSkpO1xuXG4gICAgICAgICAgICByZW1vdmVkLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICAgICAgLy8gVW5zdWJzY3JpYmUgZnJvbSBvYnNlcnZhYmxlXG4gICAgICAgICAgICAgICAgdGhpcy5vdXRwdXRTdWJzY3JpcHRpb25zW2tdPy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnRhcmdldENvbXBvbmVudEluc3RhbmNlW2tdO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuYmluZE91dHB1dHMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGVycm9ycyBlbmNvdW50ZXJlZCB3aGVuIGxvYWRpbmcgY29tcG9uZW50c1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBjb21wb25lbnRMb2FkRXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyB3aGVuIHRoZSBjb21wb25lbnQgaXMgZnVsbHkgY29uc3RydWN0ZWRcbiAgICAgKiBhbmQgaGFkIGl0J3MgaW5wdXRzIGFuZCBvdXRwdXRzIGJvdW5kXG4gICAgICogPiBiZWZvcmUgYE9uSW5pdGBcbiAgICAgKlxuICAgICAqIFJldHVybnMgdGhlIGFjdGl2ZSBjbGFzcyBpbnN0YW5jZSBvZiB0aGUgbGF6eS1sb2FkZWQgY29tcG9uZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIGNvbXBvbmVudExvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50IHRoYXQgaXMgY3VycmVudGx5IGxvYWRlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zdGFuY2U6IGFueTtcblxuXG4gICAgLyoqXG4gICAgICogQ29udGFpbmVyIHRoYXQgcHJvdmlkZXMgdGhlIGNvbXBvbmVudCBkYXRhXG4gICAgICovXG4gICAgcHJpdmF0ZSB0YXJnZXRNb2R1bGU6IENvbXBpbGVkQnVuZGxlO1xuXG4gICAgLyoqXG4gICAgICogQ29tcG9uZW50IGRlZmluaXRpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIHRhcmdldENvbXBvbmVudEZhY3Rvcnk6IGFueTtcblxuICAgIC8qKlxuICAgICAqIEFjdGl2ZSBjb21wb25lbnQgY29udGFpbmVyIHJlZmVyZW5jZVxuICAgICAqL1xuICAgIHByaXZhdGUgdGFyZ2V0Q29tcG9uZW50Q29udGFpbmVyUmVmOiBDb21wb25lbnRSZWY8YW55PjtcbiAgICBwcml2YXRlIHRhcmdldFJlZjogYW55O1xuICAgIC8qKlxuICAgICAqIFJlZmVyZW5jZSB0byB0aGUgY29tcG9uZW50IGNsYXNzIGluc3RhbmNlXG4gICAgICovXG4gICAgcHJpdmF0ZSB0YXJnZXRDb21wb25lbnRJbnN0YW5jZTogYW55O1xuXG4gICAgLyoqXG4gICAgICogU3Vic2NyaXB0aW9uIHdpdGggdHJ1ZS9mYWxzZSBzdGF0ZSBvbiB3aGV0aGVyIHRoZSBkaXN0cmFjdG9yIHNob3VsZCBiZVxuICAgICAqL1xuICAgIHByaXZhdGUgZGlzdHJhY3RvclN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gICAgcHVibGljIGNvbmZpZzogTmd4TGF6eUxvYWRlckNvbmZpZztcbiAgICBwcml2YXRlIGVycjtcbiAgICBwcml2YXRlIHdhcm47XG4gICAgcHJpdmF0ZSBsb2c7XG5cbiAgICAvLyBGb3JjZSA1MDBtcyBkZWxheSBiZWZvcmUgcmV2ZWFsaW5nIHRoZSBzcGlubmVyXG4gICAgcHJpdmF0ZSBsb2FkZXJFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHByaXZhdGUgY2xlYXJMb2FkZXIkID0gdGhpcy5sb2FkZXJFbWl0dGVyLnBpcGUoZGVib3VuY2VUaW1lKDMwMCkpO1xuICAgIHByaXZhdGUgbG9hZGVyU3ViOiBTdWJzY3JpcHRpb247XG4gICAgc2hvd0xvYWRlciA9IHRydWU7IC8vIHdoZXRoZXIgd2UgcmVuZGVyIHRoZSBET00gZm9yIHRoZSBzcGlubmVyXG4gICAgaXNDbGVhcmluZ0xvYWRlciA9IGZhbHNlOyAvLyBzaG91bGQgdGhlIHNwaW5uZXIgc3RhcnQgZmFkaW5nIG91dFxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgc2VydmljZTogTGF6eUxvYWRlclNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgQE9wdGlvbmFsKCkgcHVibGljIGRpYWxvZzogRGlhbG9nUmVmLFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRpYWxvZ0FyZ3VtZW50c1xuICAgICkge1xuICAgICAgICB0aGlzLmNvbmZpZyA9IExhenlMb2FkZXJTZXJ2aWNlLmNvbmZpZztcbiAgICAgICAgdGhpcy5lcnIgPSBMYXp5TG9hZGVyU2VydmljZS5jb25maWcubG9nZ2VyLmVycjtcbiAgICAgICAgdGhpcy53YXJuID0gTGF6eUxvYWRlclNlcnZpY2UuY29uZmlnLmxvZ2dlci53YXJuO1xuICAgICAgICB0aGlzLmxvZyA9IExhenlMb2FkZXJTZXJ2aWNlLmNvbmZpZy5sb2dnZXIubG9nO1xuXG4gICAgICAgIC8vIEZpcnN0LCBjaGVjayBmb3IgZGlhbG9nIGFyZ3VtZW50c1xuICAgICAgICBpZiAodGhpcy5kaWFsb2dBcmd1bWVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRzID0gdGhpcy5kaWFsb2dBcmd1bWVudHMuaW5wdXRzIHx8IHRoaXMuZGlhbG9nQXJndW1lbnRzLmRhdGE7XG4gICAgICAgICAgICB0aGlzLm91dHB1dHMgPSB0aGlzLmRpYWxvZ0FyZ3VtZW50cy5vdXRwdXRzO1xuICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMuZGlhbG9nQXJndW1lbnRzLmlkO1xuICAgICAgICAgICAgdGhpcy5ncm91cCA9IHRoaXMuZGlhbG9nQXJndW1lbnRzLmdyb3VwO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2FkZXJTdWIgPSB0aGlzLmNsZWFyTG9hZGVyJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93TG9hZGVyID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICBhc3luYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMubmdPbkRlc3Ryb3koZmFsc2UpO1xuICAgICAgICB0aGlzLmlzQ2xlYXJpbmdMb2FkZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaG93TG9hZGVyID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIXRoaXMuX2lkKSB7XG4gICAgICAgICAgICB0aGlzLndhcm4oXCJObyBjb21wb25lbnQgd2FzIHNwZWNpZmllZCFcIik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkRGVmYXVsdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IF9lbnRyeSA9IHRoaXMuc2VydmljZS5yZXNvbHZlUmVnaXN0cmF0aW9uRW50cnkodGhpcy5faWQsIHRoaXMuX2dyb3VwKTtcbiAgICAgICAgICAgIGlmICghX2VudHJ5IHx8ICFfZW50cnkuZW50cnkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVycihgRmFpbGVkIHRvIGZpbmQgQ29tcG9uZW50ICcke3RoaXMuX2lkfScgaW4gZ3JvdXAgJyR7dGhpcy5fZ3JvdXB9JyBpbiByZWdpc3RyeSFgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkRGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB7IGVudHJ5LCBtYXRjaEdyb3VwcyB9ID0gX2VudHJ5O1xuICAgICAgICAgICAgdGhpcy5fbWF0Y2hHcm91cHMgPSBtYXRjaEdyb3VwcztcblxuICAgICAgICAgICAgLy8gRG93bmxvYWQgdGhlIFwibW9kdWxlXCIgKHRoZSBzdGFuZGFsb25lIGNvbXBvbmVudClcbiAgICAgICAgICAgIGNvbnN0IGJ1bmRsZTogQ29tcGlsZWRCdW5kbGUgPSB0aGlzLnRhcmdldE1vZHVsZSA9IGF3YWl0IGVudHJ5LmxvYWQoKTtcblxuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBzb21lIGNvcnJ1cHRpb24gb24gdGhlIGJ1bmRsZS5cbiAgICAgICAgICAgIGlmICghYnVuZGxlIHx8IHR5cGVvZiBidW5kbGUgIT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVycihgRmFpbGVkIHRvIGxvYWQgY29tcG9uZW50L21vZHVsZSBmb3IgJyR7dGhpcy5faWR9JyEgUGFyc2VkIHJlc291cmNlIGlzIGludmFsaWQuYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZEVycm9yKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZXMgPSBPYmplY3Qua2V5cyhidW5kbGUpXG4gICAgICAgICAgICAgICAgLm1hcChrID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBidW5kbGVba107XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU3RyaWN0bHkgY2hlY2sgZm9yIGV4cG9ydGVkIG1vZHVsZXMgb3Igc3RhbmRhbG9uZSBjb21wb25lbnRzXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBlbnRyeVtcIsm1ZmFjXCJdID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGUgPT4gZSAhPSBudWxsKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoZW50cnkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlbnRyeVsnX2lzTW9kdWxlJ10gPSAhIWVudHJ5WyfJtW1vZCddOyAvLyBtb2R1bGVcbiAgICAgICAgICAgICAgICAgICAgZW50cnlbJ19pc0NvbXBvbmVudCddID0gISFlbnRyeVsnybVjbXAnXTsgLy8gY29tcG9uZW50XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlbnRyeVsnX2lzTW9kdWxlJ10gfHwgZW50cnlbJ19pc0NvbXBvbmVudCddKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKG1vZHVsZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVycihgQ29tcG9uZW50L01vZHVsZSBsb2FkZWQgZm9yICcke3RoaXMuX2lkfScgaGFzIG5vIGV4cG9ydGVkIGNvbXBvbmVudHMgb3IgbW9kdWxlcyFgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkRXJyb3IoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy50YXJnZXRDb21wb25lbnRGYWN0b3J5ID0gdGhpcy5zZXJ2aWNlLnJlc29sdmVDb21wb25lbnQodGhpcy5faWQsIFwiZGVmYXVsdFwiLCBtb2R1bGVzKTtcblxuICAgICAgICAgICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVycihgQ29tcG9uZW50ICcke3RoaXMuX2lkfScgaXMgaW52YWxpZCBvciBjb3JydXB0ZWQhYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZEVycm9yKCk7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgLy8gQm9vdHN0cmFwIHRoZSBjb21wb25lbnQgaW50byB0aGUgY29udGFpbmVyXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLnRhcmdldENvbXBvbmVudENvbnRhaW5lclJlZiA9IHRoaXMudGFyZ2V0Q29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnQgYXMgYW55KTtcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0UmVmID0gdGhpcy50YXJnZXRDb250YWluZXIuaW5zZXJ0KHRoaXMudGFyZ2V0Q29tcG9uZW50Q29udGFpbmVyUmVmLmhvc3RWaWV3KTtcblxuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2U6IGFueSA9IHRoaXMudGFyZ2V0Q29tcG9uZW50SW5zdGFuY2UgPSBjb21wb25lbnRSZWZbJ2luc3RhbmNlJ107XG5cbiAgICAgICAgICAgIHRoaXMuYmluZElucHV0cygpO1xuICAgICAgICAgICAgdGhpcy5iaW5kT3V0cHV0cygpO1xuXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudExvYWRlZC5uZXh0KGluc3RhbmNlKTtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcblxuICAgICAgICAgICAgLy8gTG9vayBmb3IgYW4gb2JzZXJ2YWJsZSBjYWxsZWQgaXNMb2FkaW5nJCB0aGF0IHdpbGwgbWFrZSB1cyBzaG93L2hpZGVcbiAgICAgICAgICAgIC8vIHRoZSBzYW1lIGRpc3RyYWN0b3IgdGhhdCBpcyB1c2VkIG9uIGJhc2ljIGxvYWRpbmdcbiAgICAgICAgICAgIGNvbnN0IGlzTG9hZGluZyQgPSBpbnN0YW5jZVsnbmd4U2hvd0Rpc3RyYWN0b3IkJ10gYXMgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+O1xuXG4gICAgICAgICAgICBpZiAoaXNMb2FkaW5nJCAmJiB0eXBlb2YgaXNMb2FkaW5nJC5zdWJzY3JpYmUgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXN0cmFjdG9yU3Vic2NyaXB0aW9uID0gaXNMb2FkaW5nJC5zdWJzY3JpYmUobG9hZGluZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbG9hZGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0NsZWFyaW5nTG9hZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGVyRW1pdHRlci5lbWl0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dMb2FkZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0NsZWFyaW5nTG9hZGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNDbGVhcmluZ0xvYWRlciA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBPYmplY3Qua2V5cyhidW5kbGUpWzBdO1xuICAgICAgICAgICAgdGhpcy5sb2coYExvYWRlZCAnJHtuYW1lfSdgKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGVyRW1pdHRlci5lbWl0KCk7XG5cbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRSZWY7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGV4KSB7XG5cbiAgICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIkNvbXBvbmVudCBcIiArIHRoaXMuX2lkICsgXCIgdGhyZXcgYW4gZXJyb3Igb24gbW91bnQhXCIpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlRoaXMgd2lsbCBjYXVzZSB5b3UgdG8gc2VlIGEgNDA0IHBhbmVsLlwiKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGV4KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTmV0d29yayBlcnJvcnMgdGhyb3cgYSB0b2FzdCBhbmQgcmV0dXJuIGFuIGVycm9yIGNvbXBvbmVudFxuICAgICAgICAgICAgaWYgKGV4ICYmICFpc0Rldk1vZGUoKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJVbmNhdWdodCBlcnJvciB3aGVuIGxvYWRpbmcgY29tcG9uZW50XCIpO1xuICAgICAgICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkRGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koY2xlYXJBbGwgPSB0cnVlKSB7XG4gICAgICAgIC8vIHVuc3Vic2NyaWJlIGZyb20gYWxsIHN1YnNjcmlwdGlvbnNcbiAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5vdXRwdXRTdWJzY3JpcHRpb25zKS5mb3JFYWNoKChba2V5LCBzdWJdKSA9PiB7XG4gICAgICAgICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub3V0cHV0U3Vic2NyaXB0aW9ucyA9IHt9O1xuXG4gICAgICAgIC8vIENsZWFyIGFsbCB0aGluZ3NcbiAgICAgICAgaWYgKGNsZWFyQWxsKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRlclN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlzdHJhY3RvclN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcblxuICAgICAgICAvLyBDbGVhciB0YXJnZXQgY29udGFpbmVyXG4gICAgICAgIHRoaXMudGFyZ2V0UmVmPy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMudGFyZ2V0Q29tcG9uZW50Q29udGFpbmVyUmVmPy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMudGFyZ2V0Q29udGFpbmVyPy5jbGVhcigpO1xuXG4gICAgICAgIC8vIFdpcGUgdGhlIHJlc3Qgb2YgdGhlIHN0YXRlIGNsZWFuXG4gICAgICAgIHRoaXMudGFyZ2V0UmVmID0gbnVsbDtcbiAgICAgICAgdGhpcy50YXJnZXRDb21wb25lbnRDb250YWluZXJSZWYgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJpbmQgdGhlIGlucHV0IHZhbHVlcyB0byB0aGUgY2hpbGQgY29tcG9uZW50LlxuICAgICAqL1xuICAgIHByaXZhdGUgYmluZElucHV0cygpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pbnB1dHMgfHwgIXRoaXMudGFyZ2V0Q29tcG9uZW50SW5zdGFuY2UpIHJldHVybjtcblxuICAgICAgICAvLyBNZXJnZSBtYXRjaCBncm91cHNcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9tYXRjaEdyb3VwcyA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLl9tYXRjaEdyb3VwcykuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5faW5wdXRzW2tleV0gPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0c1trZXldID0gdmFsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmb3J3YXJkLWJpbmQgaW5wdXRzXG4gICAgICAgIGNvbnN0IHsgaW5wdXRzIH0gPSB0aGlzLnRhcmdldENvbXBvbmVudEZhY3RvcnkuybVjbXA7XG5cbiAgICAgICAgLy8gUmV0dXJucyBhIGxpc3Qgb2YgZW50cmllcyB0aGF0IG5lZWQgdG8gYmUgc2V0XG4gICAgICAgIC8vIFRoaXMgbWFrZXMgaXQgc28gdGhhdCB1bm5lY2Vzc2FyeSBzZXR0ZXJzIGFyZSBub3QgaW52b2tlZC5cbiAgICAgICAgY29uc3QgdXBkYXRlZCA9IE9iamVjdC5lbnRyaWVzKGlucHV0cykuZmlsdGVyKChbcGFyZW50S2V5LCBjaGlsZEtleV06IFtzdHJpbmcsIHN0cmluZ10pID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRhcmdldENvbXBvbmVudEluc3RhbmNlW2NoaWxkS2V5XSAhPSB0aGlzLl9pbnB1dHNbcGFyZW50S2V5XTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdXBkYXRlZC5mb3JFYWNoKChbcGFyZW50S2V5LCBjaGlsZEtleV06IFtzdHJpbmcsIHN0cmluZ10pID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9pbnB1dHMuaGFzT3duUHJvcGVydHkocGFyZW50S2V5KSlcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldENvbXBvbmVudEluc3RhbmNlW2NoaWxkS2V5XSA9IHRoaXMuX2lucHV0c1twYXJlbnRLZXldO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCaW5kIHRoZSBvdXRwdXQgaGFuZGxlcnMgdG8gdGhlIGxvYWRlZCBjaGlsZCBjb21wb25lbnRcbiAgICAgKi9cbiAgICBwcml2YXRlIGJpbmRPdXRwdXRzKCkge1xuICAgICAgICBpZiAoIXRoaXMuX291dHB1dHMgfHwgIXRoaXMudGFyZ2V0Q29tcG9uZW50SW5zdGFuY2UpIHJldHVybjtcblxuICAgICAgICBjb25zdCB7IG91dHB1dHMgfSA9IHRoaXMudGFyZ2V0Q29tcG9uZW50RmFjdG9yeS7JtWNtcDtcblxuICAgICAgICAvLyBHZXQgYSBsaXN0IG9mIHVucmVnaXN0ZXJlZCBvdXRwdXRzXG4gICAgICAgIGNvbnN0IG5ld091dHB1dHMgPSBPYmplY3QuZW50cmllcyhvdXRwdXRzKS5maWx0ZXIoKFtwYXJlbnRLZXksIGNoaWxkS2V5XTogW3N0cmluZywgc3RyaW5nXSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICF0aGlzLm91dHB1dFN1YnNjcmlwdGlvbnNbcGFyZW50S2V5XTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmV2ZXJzZSBiaW5kIHZpYSBzdWJzY3JpcHRpb25cbiAgICAgICAgbmV3T3V0cHV0cy5mb3JFYWNoKChbcGFyZW50S2V5LCBjaGlsZEtleV06IFtzdHJpbmcsIHN0cmluZ10pID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9vdXRwdXRzLmhhc093blByb3BlcnR5KHBhcmVudEtleSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQ6IEV2ZW50RW1pdHRlcjx1bmtub3duPiA9IHRoaXMudGFyZ2V0Q29tcG9uZW50SW5zdGFuY2VbY2hpbGRLZXldO1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dHMgPSB0aGlzLl9vdXRwdXRzO1xuXG4gICAgICAgICAgICAgICAgLy8gQW5ndWxhciBmb2xrcywgc3RvcCBtYWtpbmcgdGhpcyBzbyBkaWZmaWN1bHQuXG4gICAgICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy52aWV3Q29udGFpbmVyUmVmWydfaG9zdExWaWV3J11bOF07XG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViID0gdGFyZ2V0LnN1YnNjcmliZShvdXRwdXRzW3BhcmVudEtleV0uYmluZChjdHgpKTsgLy8gU3Vic2NyaXB0aW9uXG5cbiAgICAgICAgICAgICAgICB0aGlzLm91dHB1dFN1YnNjcmlwdGlvbnNbcGFyZW50S2V5XSA9IHN1YjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCB0aGUgXCJEZWZhdWx0XCIgY29tcG9uZW50ICg0MDQpIHNjcmVlbiBub3JtYWxseS5cbiAgICAgKiBUaGlzIGlzIHNob3duIHdoZW4gdGhlIGNvbXBvbmVudCBpZCBpc24ndCBpbiB0aGVcbiAgICAgKiByZWdpc3RyeSBvciBvdGhlcndpc2UgZG9lc24ndCBtYXRjaFxuICAgICAqXG4gICAgICogVGhpc1xuICAgICAqL1xuICAgIHByaXZhdGUgbG9hZERlZmF1bHQoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5ub3RGb3VuZENvbXBvbmVudClcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0Q29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudCh0aGlzLmNvbmZpZy5ub3RGb3VuZENvbXBvbmVudCk7XG5cbiAgICAgICAgdGhpcy5zaG93TG9hZGVyID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCB0aGUgXCJFcnJvclwiIGNvbXBvbmVudC5cbiAgICAgKiBUaGlzIGlzIHNob3duIHdoZW4gd2UgYXJlIGFibGUgdG8gcmVzb2x2ZSB0aGUgY29tcG9uZW50XG4gICAgICogaW4gdGhlIHJlZ2lzdHJ5LCBidXQgaGF2ZSBzb21lIGlzc3VlIGJvb3N0cmFwcGluZyB0aGVcbiAgICAgKiBjb21wb25lbnQgaW50byB0aGUgdmlld0NvbnRhaW5lclxuICAgICAqL1xuICAgIHByaXZhdGUgbG9hZEVycm9yKCkge1xuICAgICAgICBpZiAodGhpcy5jb25maWcuZXJyb3JDb21wb25lbnQpXG4gICAgICAgICAgICB0aGlzLnRhcmdldENvbnRhaW5lci5jcmVhdGVDb21wb25lbnQodGhpcy5jb25maWcuZXJyb3JDb21wb25lbnQpO1xuXG4gICAgICAgIHRoaXMuc2hvd0xvYWRlciA9IGZhbHNlO1xuICAgIH1cbn1cbiIsIjxuZy1jb250YWluZXIgI2NvbnRlbnQ+PC9uZy1jb250YWluZXI+XG5cbjxkaXYgY2xhc3M9XCJuZ3gtbGF6eS1sb2FkZXItZGlzdHJhY3RvclwiIFtjbGFzcy5kZXN0cm95aW5nXT1cImlzQ2xlYXJpbmdMb2FkZXJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29uZmlnLmxvYWRlckRpc3RyYWN0b3JDb21wb25lbnRcIiBbbmdDb21wb25lbnRPdXRsZXRdPVwiY29uZmlnLmxvYWRlckRpc3RyYWN0b3JDb21wb25lbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29uZmlnLmxvYWRlckRpc3RyYWN0b3JUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbmZpZy5sb2FkZXJEaXN0cmFjdG9yVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAnJGltcGxpY2l0JzogaW5wdXRzIH1cIj48L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuIl19
366
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF6eS1sb2FkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL3NyYy9jb21wb25lbnRzL2xhenktbG9hZGVyL2xhenktbG9hZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvY29tcG9uZW50cy9sYXp5LWxvYWRlci9sYXp5LWxvYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBZ0IsWUFBWSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQW1DLE1BQU0sZUFBZSxDQUFDO0FBQ2hMLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsZUFBZSxHQUFHLE1BQU0sMEJBQTBCLENBQUM7QUFFNUQsT0FBTyxFQUFtQixZQUFZLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7Ozs7QUFXM0MsTUFBTSxPQUFPLG1CQUFtQjtJQWdCNUI7O09BRUc7SUFDSCxJQUF3QixFQUFFLENBQUMsSUFBWTtRQUNuQyxNQUFNLEVBQUUsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFOUIsMERBQTBEO1FBQzFELGlFQUFpRTtRQUNqRSxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUU7WUFDcEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FD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Q0FBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLENBQUUsY0FDMUMsSUFBSTs7MEJBbU5YLFFBQVE7OzBCQUNSLFFBQVE7OzBCQUNSLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsZUFBZTs0Q0FsTlcsZUFBZTtzQkFBaEUsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBa0J4QixFQUFFO3NCQUF6QixLQUFLO3VCQUFDLFdBQVc7Z0JBZ0JFLEtBQUs7c0JBQXhCLEtBQUs7dUJBQUMsT0FBTztnQkFxQ08sTUFBTTtzQkFBMUIsS0FBSzt1QkFBQyxRQUFRO2dCQXdDTyxPQUFPO3NCQUE1QixLQUFLO3VCQUFDLFNBQVM7Z0JBdUJOLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFTRyxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5wdXQsIFZpZXdDb250YWluZXJSZWYsIGlzRGV2TW9kZSwgQ29tcG9uZW50UmVmLCBFdmVudEVtaXR0ZXIsIE9wdGlvbmFsLCBWaWV3Q2hpbGQsIENvbXBvbmVudCwgSW5qZWN0LCBPdXRwdXQsIE5nTW9kdWxlLCBBZnRlclZpZXdJbml0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nQ29tcG9uZW50T3V0bGV0LCBOZ0lmLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgRGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RpYWxvZyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGRlYm91bmNlVGltZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBMYXp5TG9hZGVyU2VydmljZSB9IGZyb20gJy4vbGF6eS1sb2FkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBzdHJpbmdUb1NsdWcgfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBDb21waWxlZEJ1bmRsZSwgTmd4TGF6eUxvYWRlckNvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xuXG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd4LWxhenktbG9hZGVyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbGF6eS1sb2FkZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWyAnLi9sYXp5LWxvYWRlci5jb21wb25lbnQuc2NzcycgXSxcbiAgICBpbXBvcnRzOiBbIE5nSWYsIE5nQ29tcG9uZW50T3V0bGV0LCBOZ1RlbXBsYXRlT3V0bGV0IF0sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBMYXp5TG9hZGVyQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gICAgQFZpZXdDaGlsZChcImNvbnRlbnRcIiwgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pIHRhcmdldENvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZjtcblxuICAgIC8qKlxuICAgICAqICEgSGVyZSBiZSBkcmFnb25zLlxuICAgICAqIE9ubHkgdGhlIGJyYXZlc3Qgb2YgQWR2ZW50dXJlcnMgY2FuIHN1cnZpdmUgdGhlIGJhdHRsZXMgYmVsb3csXG4gICAgICogYW5kIHRoZXkgbXVzdCBiZSB0cmFpbmVkIGFuZCByZWFkeSBmb3IgdGhlIGdydWVsbGluZyBqb3VybmV5IGFoZWFkLlxuICAgICAqIE1hbnkgYSBzb3VsIGhhcyB0cmllZCB0byBiZXN0IHRoZXNlIERyYWdvbnMsIHlldCBvbmx5IG9uZSBoYXNcbiAgICAgKiBzdWNjZWVkZWQgc2luY2Ugb3VyIGZvdW5kaW5nLlxuICAgICAqXG4gICAgICogVEw7RFIgLS0gRG9uJ3QgbWVzcyB3aXRoIHRoaXMgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLlxuICAgICAqICAgICBUaGlzIGlzIGNlbnRyYWwgdG8gYSB0b24gb2YgbW92aW5nIHBhcnRzIC0tIGJyZWFraW5nIGl0IHdpbGxcbiAgICAgKiAgICAgY2F1c2UgbW9yZSBjb2xsYXRlcmFsIGRhbWFnZSB0aGFuIHlvdSBtYXkgcmVhbGl6ZS5cbiAgICAgKi9cblxuICAgIHByaXZhdGUgX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBjb21wb25lbnQgdGhhdCB3aWxsIGJlIGxhenkgbG9hZGVkXG4gICAgICovXG4gICAgQElucHV0KFwiY29tcG9uZW50XCIpIHNldCBpZChkYXRhOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgaWQgPSBzdHJpbmdUb1NsdWcoZGF0YSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBjaGFuZ2UgdG8gdGhlIGxvYWRlZCBjb21wb25lbnQncyBpZFxuICAgICAgICAvLyBpZiBpdCdzIHVwZGF0ZWQsIHdlIGRlc3Ryb3kgYW5kIHJlaHlkcmF0ZSB0aGUgZW50aXJlIGNvbnRhaW5lclxuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXplZCAmJiB0aGlzLl9pZCAhPSBpZCkge1xuICAgICAgICAgICAgdGhpcy5faWQgPSBpZDtcbiAgICAgICAgICAgIHRoaXMubmdBZnRlclZpZXdJbml0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pZCA9IGlkO1xuICAgICAgICB9XG4gICAgfTtcblxuXG4gICAgcHJpdmF0ZSBfZ3JvdXAgPSBcImRlZmF1bHRcIjtcbiAgICBASW5wdXQoXCJncm91cFwiKSBzZXQgZ3JvdXAoZGF0YTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gc3RyaW5nVG9TbHVnKGRhdGEpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZ3JvdXAgIT0gXCJzdHJpbmdcIiB8fCAhZ3JvdXApIHJldHVybjtcblxuICAgICAgICAvLyBJZiB0aGUgZ3JvdXAgd2FzIHVwZGF0ZWQsIHJldHJ5IHRvIGJvb3RzdHJhcCBzb21ldGhpbmcgaW50byB0aGUgY29udGFpbmVyLlxuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXplZCAmJiB0aGlzLl9ncm91cCAhPSBncm91cCkge1xuICAgICAgICAgICAgdGhpcy5fZ3JvdXAgPSBncm91cDtcblxuICAgICAgICAgICAgdGhpcy5uZ0FmdGVyVmlld0luaXQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2dyb3VwID0gZ3JvdXA7XG4gICAgfVxuICAgIGdldCBncm91cCgpIHsgcmV0dXJuIHRoaXMuX2dyb3VwIH1cblxuICAgIHByaXZhdGUgX21hdGNoR3JvdXBzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAgIHByaXZhdGUgX2lucHV0czogeyBba2V5OiBzdHJpbmddOiBhbnk7IH07XG4gICAgLyoqXG4gICAgICogQSBtYXAgb2YgaW5wdXRzIHRvIGJpbmQgdG8gdGhlIGNoaWxkLlxuICAgICAqIFN1cHBvcnRzIGNoYW5nZSBkZXRlY3Rpb24uIChNYXkgZmFpbCBvbiBkZWVwIEpTT04gY2hhbmdlcylcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8bGF6eS1sb2FkZXIgY29tcG9uZW50PVwiTXlMYXp5Q29tcG9uZW50XCJcbiAgICAgKiAgICAgICBbaW5wdXRzXT1cIntcbiAgICAgKiAgICAgICAgICBwcm9wMTogdHJ1ZSxcbiAgICAgKiAgICAgICAgICBwcm9wMjogZmFsc2UsXG4gICAgICogICAgICAgICAgY29tcGxleDoge1xuICAgICAqICAgICAgICAgICAgICBhOiB0cnVlLFxuICAgICAqICAgICAgICAgICAgICBiOiAwXG4gICAgICogICAgICAgICAgfVxuICAgICAqICAgICAgIH1cIlxuICAgICAqID5cbiAgICAgKiA8L2xhenktbG9hZGVyPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dChcImlucHV0c1wiKSBzZXQgaW5wdXRzKGRhdGE6IHsgW2tleTogc3RyaW5nXTogYW55OyB9KSB7XG4gICAgICAgIGlmIChkYXRhID09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgICAgIGxldCBwcmV2aW91cyA9IHRoaXMuX2lucHV0cztcbiAgICAgICAgdGhpcy5faW5wdXRzID0gZGF0YTtcbiAgICAgICAgaWYgKGRhdGEgPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgY29uc29sZS50cmFjZShkYXRhKTtcblxuICAgICAgICBpZiAodGhpcy50YXJnZXRDb21wb25lbnRGYWN0b3J5KSB7XG4gICAgICAgICAgICBjb25zdCB7IGlucHV0cyB9ID0gdGhpcy50YXJnZXRDb21wb25lbnRGYWN0b3J5Lsm1Y21wO1xuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50S2V5cyA9IE9iamVjdC5rZXlzKGlucHV0cyk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9sZEtleXMgPSBPYmplY3Qua2V5cyhwcmV2aW91cykuZmlsdGVyKGtleSA9PiBjdXJyZW50S2V5cy5pbmNsdWRlcyhrZXkpKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0tleXMgPSBPYmplY3Qua2V5cyhkYXRhKS5maWx0ZXIoa2V5ID0+IGN1cnJlbnRLZXlzLmluY2x1ZGVzKGtleSkpO1xuXG4gICAgICAgICAgICBjb25zdCByZW1vdmVkID0gb2xkS2V5cy5maWx0ZXIoa2V5ID0+ICFuZXdLZXlzLmluY2x1ZGVzKGtleSkpO1xuXG4gICAgICAgICAgICAvLyA/IHBlcmhhcHMgc2V0IHRvIG51bGwgb3IgdW5kZWZpbmVkIGluc3RlYWRcbiAgICAgICAgICAgIHJlbW92ZWQuZm9yRWFjaChrID0+IHRoaXMudGFyZ2V0Q29tcG9uZW50SW5zdGFuY2Vba10gPSBudWxsKTtcblxuICAgICAgICAgICAgdGhpcy5iaW5kSW5wdXRzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHByaXZhdGUgb3V0cHV0U3Vic2NyaXB0aW9uczogeyBba2V5OiBzdHJpbmddOiBTdWJzY3JpcHRpb247IH0gPSB7fTtcbiAgICBwcml2YXRlIF9vdXRwdXRzOiB7IFtrZXk6IHN0cmluZ106IEZ1bmN0aW9uOyB9O1xuICAgIC8qKlxuICAgICAqIEEgbWFwIG9mIG91dHB1dHMgdG8gYmluZCBmcm9tIHRoZSBjaGlsZC5cbiAgICAgKiBTaG91bGQgc3VwcG9ydCBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8bGF6eS1sb2FkZXIgY29tcG9uZW50PVwiTXlMYXp5Q29tcG9uZW50XCJcbiAgICAgKiAgICAgICBbb3V0cHV0c109XCJ7XG4gICAgICogICAgICAgICAgIHByb3AzOiBvbk91dHB1dEZpcmVcbiAgICAgKiAgICAgICB9XCJcbiAgICAgKiA+XG4gICAgICogPC9sYXp5LWxvYWRlcj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoXCJvdXRwdXRzXCIpIHNldCBvdXRwdXRzKGRhdGE6IHsgW2tleTogc3RyaW5nXTogRnVuY3Rpb247IH0pIHtcbiAgICAgICAgbGV0IHByZXZpb3VzID0gdGhpcy5fb3V0cHV0cztcbiAgICAgICAgdGhpcy5fb3V0cHV0cyA9IGRhdGE7XG5cbiAgICAgICAgaWYgKHRoaXMudGFyZ2V0Q29tcG9uZW50RmFjdG9yeSkge1xuICAgICAgICAgICAgY29uc3QgeyBpbnB1dHMgfSA9IHRoaXMudGFyZ2V0Q29tcG9uZW50RmFjdG9yeS7JtWNtcDtcblxuICAgICAgICAgICAgY29uc3QgY3VycmVudEtleXMgPSBPYmplY3Qua2V5cyhpbnB1dHMpO1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IE9iamVjdC5rZXlzKHByZXZpb3VzKS5maWx0ZXIoa2V5ID0+ICFjdXJyZW50S2V5cy5pbmNsdWRlcyhrZXkpKTtcblxuICAgICAgICAgICAgcmVtb3ZlZC5mb3JFYWNoKGsgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFVuc3Vic2NyaWJlIGZyb20gb2JzZXJ2YWJsZVxuICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0U3Vic2NyaXB0aW9uc1trXT8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy50YXJnZXRDb21wb25lbnRJbnN0YW5jZVtrXTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmJpbmRPdXRwdXRzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyBlcnJvcnMgZW5jb3VudGVyZWQgd2hlbiBsb2FkaW5nIGNvbXBvbmVudHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgY29tcG9uZW50TG9hZEVycm9yID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHMgd2hlbiB0aGUgY29tcG9uZW50IGlzIGZ1bGx5IGNvbnN0cnVjdGVkXG4gICAgICogYW5kIGhhZCBpdCdzIGlucHV0cyBhbmQgb3V0cHV0cyBib3VuZFxuICAgICAqID4gYmVmb3JlIGBPbkluaXRgXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIHRoZSBhY3RpdmUgY2xhc3MgaW5zdGFuY2Ugb2YgdGhlIGxhenktbG9hZGVkIGNvbXBvbmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBjb21wb25lbnRMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNvbXBvbmVudCB0aGF0IGlzIGN1cnJlbnRseSBsb2FkZWQuXG4gICAgICovXG4gICAgcHVibGljIGluc3RhbmNlOiBhbnk7XG5cblxuICAgIC8qKlxuICAgICAqIENvbnRhaW5lciB0aGF0IHByb3ZpZGVzIHRoZSBjb21wb25lbnQgZGF0YVxuICAgICAqL1xuICAgIHByaXZhdGUgdGFyZ2V0TW9kdWxlOiBDb21waWxlZEJ1bmRsZTtcblxuICAgIC8qKlxuICAgICAqIENvbXBvbmVudCBkZWZpbml0aW9uXG4gICAgICovXG4gICAgcHJpdmF0ZSB0YXJnZXRDb21wb25lbnRGYWN0b3J5OiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBBY3RpdmUgY29tcG9uZW50IGNvbnRhaW5lciByZWZlcmVuY2VcbiAgICAgKi9cbiAgICBwcml2YXRlIHRhcmdldENvbXBvbmVudENvbnRhaW5lclJlZjogQ29tcG9uZW50UmVmPGFueT47XG4gICAgcHJpdmF0ZSB0YXJnZXRSZWY6IGFueTtcbiAgICAvKipcbiAgICAgKiBSZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCBjbGFzcyBpbnN0YW5jZVxuICAgICAqL1xuICAgIHByaXZhdGUgdGFyZ2V0Q29tcG9uZW50SW5zdGFuY2U6IGFueTtcblxuICAgIC8qKlxuICAgICAqIFN1YnNjcmlwdGlvbiB3aXRoIHRydWUvZmFsc2Ugc3RhdGUgb24gd2hldGhlciB0aGUgZGlzdHJhY3RvciBzaG91bGQgYmVcbiAgICAgKi9cbiAgICBwcml2YXRlIGRpc3RyYWN0b3JTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIHB1YmxpYyBjb25maWc6IE5neExhenlMb2FkZXJDb25maWc7XG4gICAgcHJpdmF0ZSBlcnI7XG4gICAgcHJpdmF0ZSB3YXJuO1xuICAgIHByaXZhdGUgbG9nO1xuXG4gICAgLy8gRm9yY2UgNTAwbXMgZGVsYXkgYmVmb3JlIHJldmVhbGluZyB0aGUgc3Bpbm5lclxuICAgIHByaXZhdGUgY2xlYXJFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHByaXZhdGUgY2xlYXJMb2FkZXIkID0gdGhpcy5jbGVhckVtaXR0ZXIucGlwZShkZWJvdW5jZVRpbWUoMzAwKSk7XG5cbiAgICBwcml2YXRlIHNob3dFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHByaXZhdGUgc2hvd0xvYWRlciQgPSB0aGlzLnNob3dFbWl0dGVyLnBpcGUoZGVib3VuY2VUaW1lKDEpKTtcblxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IFtcbiAgICAgICAgdGhpcy5jbGVhckxvYWRlciQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNDbGVhcmluZ0xvYWRlciA9IHRydWU7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyU3Bpbm5lciA9IGZhbHNlO1xuICAgICAgICAgICAgfSwgMzAwKVxuICAgICAgICB9KSxcbiAgICAgICAgdGhpcy5zaG93TG9hZGVyJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc0NsZWFyaW5nTG9hZGVyID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnJlbmRlclNwaW5uZXIgPSB0cnVlO1xuICAgICAgICB9KVxuICAgIF07XG5cbiAgICBwdWJsaWMgcmVuZGVyU3Bpbm5lciA9IHRydWU7IC8vIHdoZXRoZXIgd2UgcmVuZGVyIHRoZSBET00gZm9yIHRoZSBzcGlubmVyXG4gICAgcHVibGljIGlzQ2xlYXJpbmdMb2FkZXIgPSBmYWxzZTsgLy8gc2hvdWxkIHRoZSBzcGlubmVyIHN0YXJ0IGZhZGluZyBvdXRcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHNlcnZpY2U6IExhenlMb2FkZXJTZXJ2aWNlLFxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIEBPcHRpb25hbCgpIHB1YmxpYyBkaWFsb2c6IERpYWxvZ1JlZixcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkaWFsb2dBcmd1bWVudHNcbiAgICApIHtcbiAgICAgICAgdGhpcy5jb25maWcgPSBMYXp5TG9hZGVyU2VydmljZS5jb25maWc7XG4gICAgICAgIHRoaXMuZXJyID0gTGF6eUxvYWRlclNlcnZpY2UuY29uZmlnLmxvZ2dlci5lcnI7XG4gICAgICAgIHRoaXMud2FybiA9IExhenlMb2FkZXJTZXJ2aWNlLmNvbmZpZy5sb2dnZXIud2FybjtcbiAgICAgICAgdGhpcy5sb2cgPSBMYXp5TG9hZGVyU2VydmljZS5jb25maWcubG9nZ2VyLmxvZztcblxuICAgICAgICAvLyBGaXJzdCwgY2hlY2sgZm9yIGRpYWxvZyBhcmd1bWVudHNcbiAgICAgICAgaWYgKHRoaXMuZGlhbG9nQXJndW1lbnRzKSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0cyA9IHRoaXMuZGlhbG9nQXJndW1lbnRzLmlucHV0cyB8fCB0aGlzLmRpYWxvZ0FyZ3VtZW50cy5kYXRhO1xuICAgICAgICAgICAgdGhpcy5vdXRwdXRzID0gdGhpcy5kaWFsb2dBcmd1bWVudHMub3V0cHV0cztcbiAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLmRpYWxvZ0FyZ3VtZW50cy5pZDtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXAgPSB0aGlzLmRpYWxvZ0FyZ3VtZW50cy5ncm91cDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICBhc3luYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMubmdPbkRlc3Ryb3koZmFsc2UpO1xuICAgICAgICB0aGlzLmlzQ2xlYXJpbmdMb2FkZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZW5kZXJTcGlubmVyID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9pZCkge1xuICAgICAgICAgICAgdGhpcy53YXJuKFwiTm8gY29tcG9uZW50IHdhcyBzcGVjaWZpZWQhXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZERlZmF1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBfZW50cnkgPSB0aGlzLnNlcnZpY2UucmVzb2x2ZVJlZ2lzdHJhdGlvbkVudHJ5KHRoaXMuX2lkLCB0aGlzLl9ncm91cCk7XG4gICAgICAgICAgICBpZiAoIV9lbnRyeSB8fCAhX2VudHJ5LmVudHJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnIoYEZhaWxlZCB0byBmaW5kIENvbXBvbmVudCAnJHt0aGlzLl9pZH0nIGluIGdyb3VwICcke3RoaXMuX2dyb3VwfScgaW4gcmVnaXN0cnkhYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgeyBlbnRyeSwgbWF0Y2hHcm91cHMgfSA9IF9lbnRyeTtcbiAgICAgICAgICAgIHRoaXMuX21hdGNoR3JvdXBzID0gbWF0Y2hHcm91cHM7XG5cbiAgICAgICAgICAgIC8vIERvd25sb2FkIHRoZSBcIm1vZHVsZVwiICh0aGUgc3RhbmRhbG9uZSBjb21wb25lbnQpXG4gICAgICAgICAgICBjb25zdCBidW5kbGU6IENvbXBpbGVkQnVuZGxlID0gdGhpcy50YXJnZXRNb2R1bGUgPSBhd2FpdCBlbnRyeS5sb2FkKCk7XG5cblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgc29tZSBjb3JydXB0aW9uIG9uIHRoZSBidW5kbGUuXG4gICAgICAgICAgICBpZiAoIWJ1bmRsZSB8fCB0eXBlb2YgYnVuZGxlICE9ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnIoYEZhaWxlZCB0byBsb2FkIGNvbXBvbmVudC9tb2R1bGUgZm9yICcke3RoaXMuX2lkfSchIFBhcnNlZCByZXNvdXJjZSBpcyBpbnZhbGlkLmApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRFcnJvcigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtb2R1bGVzID0gT2JqZWN0LmtleXMoYnVuZGxlKVxuICAgICAgICAgICAgICAgIC5tYXAoayA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gYnVuZGxlW2tdO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFN0cmljdGx5IGNoZWNrIGZvciBleHBvcnRlZCBtb2R1bGVzIG9yIHN0YW5kYWxvbmUgY29tcG9uZW50c1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgZW50cnlbXCLJtWZhY1wiXSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmZpbHRlcihlID0+IGUgIT0gbnVsbClcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGVudHJ5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZW50cnlbJ19pc01vZHVsZSddID0gISFlbnRyeVsnybVtb2QnXTsgLy8gbW9kdWxlXG4gICAgICAgICAgICAgICAgICAgIGVudHJ5WydfaXNDb21wb25lbnQnXSA9ICEhZW50cnlbJ8m1Y21wJ107IC8vIGNvbXBvbmVudFxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoZW50cnlbJ19pc01vZHVsZSddIHx8IGVudHJ5WydfaXNDb21wb25lbnQnXSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChtb2R1bGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnIoYENvbXBvbmVudC9Nb2R1bGUgbG9hZGVkIGZvciAnJHt0aGlzLl9pZH0nIGhhcyBubyBleHBvcnRlZCBjb21wb25lbnRzIG9yIG1vZHVsZXMhYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZEVycm9yKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMudGFyZ2V0Q29tcG9uZW50RmFjdG9yeSA9IHRoaXMuc2VydmljZS5yZXNvbHZlQ29tcG9uZW50KHRoaXMuX2lkLCBcImRlZmF1bHRcIiwgbW9kdWxlcyk7XG5cbiAgICAgICAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnIoYENvbXBvbmVudCAnJHt0aGlzLl9pZH0nIGlzIGludmFsaWQgb3IgY29ycnVwdGVkIWApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRFcnJvcigpO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIC8vIEJvb3RzdHJhcCB0aGUgY29tcG9uZW50IGludG8gdGhlIGNvbnRhaW5lclxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy50YXJnZXRDb21wb25lbnRDb250YWluZXJSZWYgPSB0aGlzLnRhcmdldENvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50IGFzIGFueSk7XG4gICAgICAgICAgICB0aGlzLnRhcmdldFJlZiA9IHRoaXMudGFyZ2V0Q29udGFpbmVyLmluc2VydCh0aGlzLnRhcmdldENvbXBvbmVudENvbnRhaW5lclJlZi5ob3N0Vmlldyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlOiBhbnkgPSB0aGlzLnRhcmdldENvbXBvbmVudEluc3RhbmNlID0gY29tcG9uZW50UmVmWydpbnN0YW5jZSddO1xuXG4gICAgICAgICAgICB0aGlzLmJpbmRJbnB1dHMoKTtcbiAgICAgICAgICAgIHRoaXMuYmluZE91dHB1dHMoKTtcblxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRMb2FkZWQubmV4dChpbnN0YW5jZSk7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG5cbiAgICAgICAgICAgIC8vIExvb2sgZm9yIGFuIG9ic2VydmFibGUgY2FsbGVkIGlzTG9hZGluZyQgdGhhdCB3aWxsIG1ha2UgdXMgc2hvdy9oaWRlXG4gICAgICAgICAgICAvLyB0aGUgc2FtZSBkaXN0cmFjdG9yIHRoYXQgaXMgdXNlZCBvbiBiYXNpYyBsb2FkaW5nXG4gICAgICAgICAgICBjb25zdCBpc0xvYWRpbmckID0gaW5zdGFuY2VbJ25neFNob3dEaXN0cmFjdG9yJCddIGFzIEJlaGF2aW9yU3ViamVjdDxib29sZWFuPjtcblxuICAgICAgICAgICAgaWYgKGlzTG9hZGluZyQgJiYgdHlwZW9mIGlzTG9hZGluZyQuc3Vic2NyaWJlID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzdHJhY3RvclN1YnNjcmlwdGlvbiA9IGlzTG9hZGluZyQuc3Vic2NyaWJlKGxvYWRpbmcgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2FkaW5nID8gdGhpcy5zaG93RW1pdHRlci5lbWl0KCkgOiB0aGlzLmNsZWFyRW1pdHRlci5lbWl0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyRW1pdHRlci5lbWl0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBPYmplY3Qua2V5cyhidW5kbGUpWzBdO1xuICAgICAgICAgICAgdGhpcy5sb2coYExvYWRlZCAnJHtuYW1lfSdgKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJFbWl0dGVyLmVtaXQoKTtcblxuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFJlZjtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXgpIHtcblxuICAgICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiQ29tcG9uZW50IFwiICsgdGhpcy5faWQgKyBcIiB0aHJldyBhbiBlcnJvciBvbiBtb3VudCFcIik7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVGhpcyB3aWxsIGNhdXNlIHlvdSB0byBzZWUgYSA0MDQgcGFuZWwuXCIpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBOZXR3b3JrIGVycm9ycyB0aHJvdyBhIHRvYXN0IGFuZCByZXR1cm4gYW4gZXJyb3IgY29tcG9uZW50XG4gICAgICAgICAgICBpZiAoZXggJiYgIWlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlVuY2F1Z2h0IGVycm9yIHdoZW4gbG9hZGluZyBjb21wb25lbnRcIik7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveShjbGVhckFsbCA9IHRydWUpIHtcbiAgICAgICAgLy8gdW5zdWJzY3JpYmUgZnJvbSBhbGwgc3Vic2NyaXB0aW9uc1xuICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLm91dHB1dFN1YnNjcmlwdGlvbnMpLmZvckVhY2goKFtrZXksIHN1Yl0pID0+IHtcbiAgICAgICAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vdXRwdXRTdWJzY3JpcHRpb25zID0ge307XG5cbiAgICAgICAgLy8gQ2xlYXIgYWxsIHRoaW5nc1xuICAgICAgICBpZiAoY2xlYXJBbGwpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuc3Vic2NyaXB0aW9ucykuZm9yRWFjaCgoW2tleSwgc3ViXSkgPT4ge1xuICAgICAgICAgICAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpc3RyYWN0b3JTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgLy8gQ2xlYXIgdGFyZ2V0IGNvbnRhaW5lclxuICAgICAgICB0aGlzLnRhcmdldFJlZj8uZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnRhcmdldENvbXBvbmVudENvbnRhaW5lclJlZj8uZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnRhcmdldENvbnRhaW5lcj8uY2xlYXIoKTtcblxuICAgICAgICAvLyBXaXBlIHRoZSByZXN0IG9mIHRoZSBzdGF0ZSBjbGVhblxuICAgICAgICB0aGlzLnRhcmdldFJlZiA9IG51bGw7XG4gICAgICAgIHRoaXMudGFyZ2V0Q29tcG9uZW50Q29udGFpbmVyUmVmID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCaW5kIHRoZSBpbnB1dCB2YWx1ZXMgdG8gdGhlIGNoaWxkIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGJpbmRJbnB1dHMoKSB7XG4gICAgICAgIGlmICghdGhpcy5faW5wdXRzIHx8ICF0aGlzLnRhcmdldENvbXBvbmVudEluc3RhbmNlKSByZXR1cm47XG5cbiAgICAgICAgLy8gTWVyZ2UgbWF0Y2ggZ3JvdXBzXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fbWF0Y2hHcm91cHMgPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5fbWF0Y2hHcm91cHMpLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2lucHV0c1trZXldID09ICd1bmRlZmluZWQnKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dHNba2V5XSA9IHZhbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZm9yd2FyZC1iaW5kIGlucHV0c1xuICAgICAgICBjb25zdCB7IGlucHV0cyB9ID0gdGhpcy50YXJnZXRDb21wb25lbnRGYWN0b3J5Lsm1Y21wO1xuXG4gICAgICAgIC8vIFJldHVybnMgYSBsaXN0IG9mIGVudHJpZXMgdGhhdCBuZWVkIHRvIGJlIHNldFxuICAgICAgICAvLyBUaGlzIG1ha2VzIGl0IHNvIHRoYXQgdW5uZWNlc3Nhcnkgc2V0dGVycyBhcmUgbm90IGludm9rZWQuXG4gICAgICAgIGNvbnN0IHVwZGF0ZWQgPSBPYmplY3QuZW50cmllcyhpbnB1dHMpLmZpbHRlcigoW3BhcmVudEtleSwgY2hpbGRLZXldOiBbc3RyaW5nLCBzdHJpbmddKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YXJnZXRDb21wb25lbnRJbnN0YW5jZVtjaGlsZEtleV0gIT0gdGhpcy5faW5wdXRzW3BhcmVudEtleV07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHVwZGF0ZWQuZm9yRWFjaCgoW3BhcmVudEtleSwgY2hpbGRLZXldOiBbc3RyaW5nLCBzdHJpbmddKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5faW5wdXRzLmhhc093blByb3BlcnR5KHBhcmVudEtleSkpXG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRDb21wb25lbnRJbnN0YW5jZVtjaGlsZEtleV0gPSB0aGlzLl9pbnB1dHNbcGFyZW50S2V5XTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQmluZCB0aGUgb3V0cHV0IGhhbmRsZXJzIHRvIHRoZSBsb2FkZWQgY2hpbGQgY29tcG9uZW50XG4gICAgICovXG4gICAgcHJpdmF0ZSBiaW5kT3V0cHV0cygpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9vdXRwdXRzIHx8ICF0aGlzLnRhcmdldENvbXBvbmVudEluc3RhbmNlKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgeyBvdXRwdXRzIH0gPSB0aGlzLnRhcmdldENvbXBvbmVudEZhY3RvcnkuybVjbXA7XG5cbiAgICAgICAgLy8gR2V0IGEgbGlzdCBvZiB1bnJlZ2lzdGVyZWQgb3V0cHV0c1xuICAgICAgICBjb25zdCBuZXdPdXRwdXRzID0gT2JqZWN0LmVudHJpZXMob3V0cHV0cykuZmlsdGVyKChbcGFyZW50S2V5LCBjaGlsZEtleV06IFtzdHJpbmcsIHN0cmluZ10pID0+IHtcbiAgICAgICAgICAgIHJldHVybiAhdGhpcy5vdXRwdXRTdWJzY3JpcHRpb25zW3BhcmVudEtleV07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJldmVyc2UgYmluZCB2aWEgc3Vic2NyaXB0aW9uXG4gICAgICAgIG5ld091dHB1dHMuZm9yRWFjaCgoW3BhcmVudEtleSwgY2hpbGRLZXldOiBbc3RyaW5nLCBzdHJpbmddKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fb3V0cHV0cy5oYXNPd25Qcm9wZXJ0eShwYXJlbnRLZXkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0OiBFdmVudEVtaXR0ZXI8dW5rbm93bj4gPSB0aGlzLnRhcmdldENvbXBvbmVudEluc3RhbmNlW2NoaWxkS2V5XTtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRzID0gdGhpcy5fb3V0cHV0cztcblxuICAgICAgICAgICAgICAgIC8vIEFuZ3VsYXIgZm9sa3MsIHN0b3AgbWFraW5nIHRoaXMgc28gZGlmZmljdWx0LlxuICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMudmlld0NvbnRhaW5lclJlZlsnX2hvc3RMVmlldyddWzhdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1YiA9IHRhcmdldC5zdWJzY3JpYmUob3V0cHV0c1twYXJlbnRLZXldLmJpbmQoY3R4KSk7IC8vIFN1YnNjcmlwdGlvblxuXG4gICAgICAgICAgICAgICAgdGhpcy5vdXRwdXRTdWJzY3JpcHRpb25zW3BhcmVudEtleV0gPSBzdWI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgdGhlIFwiRGVmYXVsdFwiIGNvbXBvbmVudCAoNDA0KSBzY3JlZW4gbm9ybWFsbHkuXG4gICAgICogVGhpcyBpcyBzaG93biB3aGVuIHRoZSBjb21wb25lbnQgaWQgaXNuJ3QgaW4gdGhlXG4gICAgICogcmVnaXN0cnkgb3Igb3RoZXJ3aXNlIGRvZXNuJ3QgbWF0Y2hcbiAgICAgKlxuICAgICAqIFRoaXNcbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWREZWZhdWx0KCkge1xuICAgICAgICBpZiAodGhpcy5jb25maWcubm90Rm91bmRDb21wb25lbnQpXG4gICAgICAgICAgICB0aGlzLnRhcmdldENvbnRhaW5lci5jcmVhdGVDb21wb25lbnQodGhpcy5jb25maWcubm90Rm91bmRDb21wb25lbnQpO1xuXG4gICAgICAgIHRoaXMuY2xlYXJFbWl0dGVyLmVtaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIHRoZSBcIkVycm9yXCIgY29tcG9uZW50LlxuICAgICAqIFRoaXMgaXMgc2hvd24gd2hlbiB3ZSBhcmUgYWJsZSB0byByZXNvbHZlIHRoZSBjb21wb25lbnRcbiAgICAgKiBpbiB0aGUgcmVnaXN0cnksIGJ1dCBoYXZlIHNvbWUgaXNzdWUgYm9vc3RyYXBwaW5nIHRoZVxuICAgICAqIGNvbXBvbmVudCBpbnRvIHRoZSB2aWV3Q29udGFpbmVyXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkRXJyb3IoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5lcnJvckNvbXBvbmVudClcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0Q29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudCh0aGlzLmNvbmZpZy5lcnJvckNvbXBvbmVudCk7XG5cbiAgICAgICAgdGhpcy5jbGVhckVtaXR0ZXIuZW1pdCgpO1xuICAgIH1cbn1cbiIsIjxuZy1jb250YWluZXIgI2NvbnRlbnQ+PC9uZy1jb250YWluZXI+XG5cbjxkaXZcbiAgICAqbmdJZj1cInJlbmRlclNwaW5uZXJcIlxuICAgIGNsYXNzPVwibmd4LWxhenktbG9hZGVyLWRpc3RyYWN0b3JcIlxuICAgIFtjbGFzcy5kZXN0cm95aW5nXT1cImlzQ2xlYXJpbmdMb2FkZXJcIlxuPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb25maWcubG9hZGVyRGlzdHJhY3RvckNvbXBvbmVudFwiIFtuZ0NvbXBvbmVudE91dGxldF09XCJjb25maWcubG9hZGVyRGlzdHJhY3RvckNvbXBvbmVudFwiPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb25maWcubG9hZGVyRGlzdHJhY3RvclRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29uZmlnLmxvYWRlckRpc3RyYWN0b3JUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICckaW1wbGljaXQnOiBpbnB1dHMgfVwiPjwvbmctY29udGFpbmVyPlxuPC9kaXY+XG4iXX0=
@@ -1427,9 +1427,23 @@ class LazyLoaderComponent {
1427
1427
  */
1428
1428
  this.componentLoaded = new EventEmitter();
1429
1429
  // Force 500ms delay before revealing the spinner
1430
- this.loaderEmitter = new EventEmitter();
1431
- this.clearLoader$ = this.loaderEmitter.pipe(debounceTime(300));
1432
- this.showLoader = true; // whether we render the DOM for the spinner
1430
+ this.clearEmitter = new EventEmitter();
1431
+ this.clearLoader$ = this.clearEmitter.pipe(debounceTime(300));
1432
+ this.showEmitter = new EventEmitter();
1433
+ this.showLoader$ = this.showEmitter.pipe(debounceTime(1));
1434
+ this.subscriptions = [
1435
+ this.clearLoader$.subscribe(() => {
1436
+ this.isClearingLoader = true;
1437
+ setTimeout(() => {
1438
+ this.renderSpinner = false;
1439
+ }, 300);
1440
+ }),
1441
+ this.showLoader$.subscribe(() => {
1442
+ this.isClearingLoader = false;
1443
+ this.renderSpinner = true;
1444
+ })
1445
+ ];
1446
+ this.renderSpinner = true; // whether we render the DOM for the spinner
1433
1447
  this.isClearingLoader = false; // should the spinner start fading out
1434
1448
  this.initialized = false;
1435
1449
  this.config = LazyLoaderService.config;
@@ -1443,15 +1457,12 @@ class LazyLoaderComponent {
1443
1457
  this.id = this.dialogArguments.id;
1444
1458
  this.group = this.dialogArguments.group;
1445
1459
  }
1446
- this.loaderSub = this.clearLoader$.subscribe(() => {
1447
- this.showLoader = false;
1448
- });
1449
1460
  }
1450
1461
  ngAfterViewInit() {
1451
1462
  return __awaiter(this, void 0, void 0, function* () {
1452
1463
  this.ngOnDestroy(false);
1453
1464
  this.isClearingLoader = false;
1454
- this.showLoader = true;
1465
+ this.renderSpinner = true;
1455
1466
  this.initialized = true;
1456
1467
  if (!this._id) {
1457
1468
  this.warn("No component was specified!");
@@ -1508,22 +1519,15 @@ class LazyLoaderComponent {
1508
1519
  const isLoading$ = instance['ngxShowDistractor$'];
1509
1520
  if (isLoading$ && typeof isLoading$.subscribe == "function") {
1510
1521
  this.distractorSubscription = isLoading$.subscribe(loading => {
1511
- if (!loading) {
1512
- this.isClearingLoader = true;
1513
- this.loaderEmitter.emit();
1514
- }
1515
- else {
1516
- this.showLoader = true;
1517
- this.isClearingLoader = false;
1518
- }
1522
+ loading ? this.showEmitter.emit() : this.clearEmitter.emit();
1519
1523
  });
1520
1524
  }
1521
1525
  else {
1522
- this.isClearingLoader = true;
1526
+ this.clearEmitter.emit();
1523
1527
  }
1524
1528
  const name = Object.keys(bundle)[0];
1525
1529
  this.log(`Loaded '${name}'`);
1526
- this.loaderEmitter.emit();
1530
+ this.clearEmitter.emit();
1527
1531
  return componentRef;
1528
1532
  }
1529
1533
  catch (ex) {
@@ -1542,7 +1546,7 @@ class LazyLoaderComponent {
1542
1546
  });
1543
1547
  }
1544
1548
  ngOnDestroy(clearAll = true) {
1545
- var _a, _b, _c, _d, _e;
1549
+ var _a, _b, _c, _d;
1546
1550
  // unsubscribe from all subscriptions
1547
1551
  Object.entries(this.outputSubscriptions).forEach(([key, sub]) => {
1548
1552
  sub.unsubscribe();
@@ -1550,13 +1554,15 @@ class LazyLoaderComponent {
1550
1554
  this.outputSubscriptions = {};
1551
1555
  // Clear all things
1552
1556
  if (clearAll) {
1553
- (_a = this.loaderSub) === null || _a === void 0 ? void 0 : _a.unsubscribe();
1557
+ Object.entries(this.subscriptions).forEach(([key, sub]) => {
1558
+ sub.unsubscribe();
1559
+ });
1554
1560
  }
1555
- (_b = this.distractorSubscription) === null || _b === void 0 ? void 0 : _b.unsubscribe();
1561
+ (_a = this.distractorSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
1556
1562
  // Clear target container
1557
- (_c = this.targetRef) === null || _c === void 0 ? void 0 : _c.destroy();
1558
- (_d = this.targetComponentContainerRef) === null || _d === void 0 ? void 0 : _d.destroy();
1559
- (_e = this.targetContainer) === null || _e === void 0 ? void 0 : _e.clear();
1563
+ (_b = this.targetRef) === null || _b === void 0 ? void 0 : _b.destroy();
1564
+ (_c = this.targetComponentContainerRef) === null || _c === void 0 ? void 0 : _c.destroy();
1565
+ (_d = this.targetContainer) === null || _d === void 0 ? void 0 : _d.clear();
1560
1566
  // Wipe the rest of the state clean
1561
1567
  this.targetRef = null;
1562
1568
  this.targetComponentContainerRef = null;
@@ -1619,7 +1625,7 @@ class LazyLoaderComponent {
1619
1625
  loadDefault() {
1620
1626
  if (this.config.notFoundComponent)
1621
1627
  this.targetContainer.createComponent(this.config.notFoundComponent);
1622
- this.showLoader = false;
1628
+ this.clearEmitter.emit();
1623
1629
  }
1624
1630
  /**
1625
1631
  * Load the "Error" component.
@@ -1630,14 +1636,14 @@ class LazyLoaderComponent {
1630
1636
  loadError() {
1631
1637
  if (this.config.errorComponent)
1632
1638
  this.targetContainer.createComponent(this.config.errorComponent);
1633
- this.showLoader = false;
1639
+ this.clearEmitter.emit();
1634
1640
  }
1635
1641
  }
1636
1642
  LazyLoaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: LazyLoaderComponent, deps: [{ token: LazyLoaderService }, { token: i0.ViewContainerRef, optional: true }, { token: i2$1.DialogRef, optional: true }, { token: MAT_DIALOG_DATA, optional: true }], target: i0.ɵɵFactoryTarget.Component });
1637
- LazyLoaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: LazyLoaderComponent, isStandalone: true, selector: "ngx-lazy-loader", inputs: { id: ["component", "id"], group: "group", inputs: "inputs", outputs: "outputs" }, outputs: { componentLoadError: "componentLoadError", componentLoaded: "componentLoaded" }, viewQueries: [{ propertyName: "targetContainer", first: true, predicate: ["content"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<ng-container #content></ng-container>\n\n<div class=\"ngx-lazy-loader-distractor\" [class.destroying]=\"isClearingLoader\">\n <ng-container *ngIf=\"config.loaderDistractorComponent\" [ngComponentOutlet]=\"config.loaderDistractorComponent\"></ng-container>\n <ng-container *ngIf=\"config.loaderDistractorTemplate\" [ngTemplateOutlet]=\"config.loaderDistractorTemplate\" [ngTemplateOutletContext]=\"{ '$implicit': inputs }\"></ng-container>\n</div>\n", styles: [":host{display:contents;contain:content;z-index:1;position:relative}.ngx-lazy-loader-distractor{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;flex-direction:column;background-color:var(--background-color, #212121);opacity:1;transition:opacity .3s ease;z-index:999999}.ngx-lazy-loader-distractor.destroying{opacity:0;pointer-events:none}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
1643
+ LazyLoaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: LazyLoaderComponent, isStandalone: true, selector: "ngx-lazy-loader", inputs: { id: ["component", "id"], group: "group", inputs: "inputs", outputs: "outputs" }, outputs: { componentLoadError: "componentLoadError", componentLoaded: "componentLoaded" }, viewQueries: [{ propertyName: "targetContainer", first: true, predicate: ["content"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<ng-container #content></ng-container>\n\n<div\n *ngIf=\"renderSpinner\"\n class=\"ngx-lazy-loader-distractor\"\n [class.destroying]=\"isClearingLoader\"\n>\n <ng-container *ngIf=\"config.loaderDistractorComponent\" [ngComponentOutlet]=\"config.loaderDistractorComponent\"></ng-container>\n <ng-container *ngIf=\"config.loaderDistractorTemplate\" [ngTemplateOutlet]=\"config.loaderDistractorTemplate\" [ngTemplateOutletContext]=\"{ '$implicit': inputs }\"></ng-container>\n</div>\n", styles: [":host{display:contents;contain:content;z-index:1;position:relative}.ngx-lazy-loader-distractor{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;flex-direction:column;background-color:var(--background-color, #212121);opacity:1;transition:opacity .3s ease;z-index:999999;animation:fade-in .3s ease}.ngx-lazy-loader-distractor.destroying{opacity:0;pointer-events:none}@keyframes fade-in{0%{opacity:0;pointer-events:none}to{opacity:1;pointer-events:all}}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
1638
1644
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: LazyLoaderComponent, decorators: [{
1639
1645
  type: Component,
1640
- args: [{ selector: 'ngx-lazy-loader', imports: [NgIf, NgComponentOutlet, NgTemplateOutlet], standalone: true, template: "<ng-container #content></ng-container>\n\n<div class=\"ngx-lazy-loader-distractor\" [class.destroying]=\"isClearingLoader\">\n <ng-container *ngIf=\"config.loaderDistractorComponent\" [ngComponentOutlet]=\"config.loaderDistractorComponent\"></ng-container>\n <ng-container *ngIf=\"config.loaderDistractorTemplate\" [ngTemplateOutlet]=\"config.loaderDistractorTemplate\" [ngTemplateOutletContext]=\"{ '$implicit': inputs }\"></ng-container>\n</div>\n", styles: [":host{display:contents;contain:content;z-index:1;position:relative}.ngx-lazy-loader-distractor{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;flex-direction:column;background-color:var(--background-color, #212121);opacity:1;transition:opacity .3s ease;z-index:999999}.ngx-lazy-loader-distractor.destroying{opacity:0;pointer-events:none}\n"] }]
1646
+ args: [{ selector: 'ngx-lazy-loader', imports: [NgIf, NgComponentOutlet, NgTemplateOutlet], standalone: true, template: "<ng-container #content></ng-container>\n\n<div\n *ngIf=\"renderSpinner\"\n class=\"ngx-lazy-loader-distractor\"\n [class.destroying]=\"isClearingLoader\"\n>\n <ng-container *ngIf=\"config.loaderDistractorComponent\" [ngComponentOutlet]=\"config.loaderDistractorComponent\"></ng-container>\n <ng-container *ngIf=\"config.loaderDistractorTemplate\" [ngTemplateOutlet]=\"config.loaderDistractorTemplate\" [ngTemplateOutletContext]=\"{ '$implicit': inputs }\"></ng-container>\n</div>\n", styles: [":host{display:contents;contain:content;z-index:1;position:relative}.ngx-lazy-loader-distractor{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;flex-direction:column;background-color:var(--background-color, #212121);opacity:1;transition:opacity .3s ease;z-index:999999;animation:fade-in .3s ease}.ngx-lazy-loader-distractor.destroying{opacity:0;pointer-events:none}@keyframes fade-in{0%{opacity:0;pointer-events:none}to{opacity:1;pointer-events:all}}\n"] }]
1641
1647
  }], ctorParameters: function () {
1642
1648
  return [{ type: LazyLoaderService }, { type: i0.ViewContainerRef, decorators: [{
1643
1649
  type: Optional