UNPKG

ngx-powerbi-glorium

Version:

TypeScript library for embedding Power BI assets (reports/dashboards/tiles) in your application. This TypeScript library is built on top of the official powerbi-client library provided by Microsoft.

145 lines 19.4 kB
import { Component, ElementRef, EventEmitter, Input, Output, ViewChild, } from '@angular/core'; import * as models from 'powerbi-models'; import { NgxPowerBiService } from './ngx-powerbi.service'; import * as i0 from "@angular/core"; import * as i1 from "./ngx-powerbi.service"; export class NgxPowerBiComponent { constructor(ngxPowerBiService) { this.ngxPowerBiService = ngxPowerBiService; this.embedded = new EventEmitter(); this.powerBiService = ngxPowerBiService; } ngAfterViewInit() { // Embed the report inside the view child that we have fetched from the DOM if (this.ngxPowerBiIFrameRef.nativeElement && this.validateRequiredAttributes()) { this.embed(this.ngxPowerBiIFrameRef.nativeElement, this.getConfig()); } } ngOnChanges(changes) { if (!this.ngxPowerBiIFrameRef) { return; } const { accessToken, tokenType, embedUrl, id, type, name, options } = changes; // TODO: Validate these conditions /*if ( (accessToken.previousValue !== undefined || accessToken.previousValue === accessToken.currentValue) && embedUrl.previousValue === embedUrl.currentValue ) { return; }*/ if (this.validateRequiredAttributes()) { const config = this.getConfig(accessToken && accessToken.currentValue, tokenType && tokenType.currentValue, embedUrl && embedUrl.currentValue, id && id.currentValue, type && type.currentValue, name && name.currentValue, options && options.currentValue); this.embed(this.ngxPowerBiIFrameRef.nativeElement, config); } else if (this.component) { this.reset(this.ngxPowerBiIFrameRef.nativeElement); } } ngOnDestroy() { if (this.component) { this.reset(this.ngxPowerBiIFrameRef.nativeElement); } } /** * Ensure required attributes (embedUrl and accessToken are valid before attempting to embed) */ validateRequiredAttributes() { return (typeof this.embedUrl === 'string' && this.embedUrl.length > 0 && (typeof this.accessToken === 'string' && this.accessToken.length > 0)); } /** * Get the model class compatible token enum from our token type enum * @param tokenType - Token type in our custom enum format * @returns Token type in powerbi-models.TokenType enum format */ getTokenType(tokenType) { if (tokenType) { switch (tokenType) { case "Aad" /* TokenType.Aad */: return models.TokenType.Aad; case "Embed" /* TokenType.Embed */: return models.TokenType.Embed; default: return models.TokenType.Aad; } } else { // default is AAD return models.TokenType.Aad; } } /** * Returns an embed configuration object. * @param accessToken - Access token required to embed a component * @param tokenType - type of accessToken: Aad or Embed * @param embedUrl - Embed URL obtained through Power BI REST API or Portal * @param id - component/element GUID * @param type - type of embedded component e.g. 'dashboard, report or tile' * @param name - name of the embedded component * @param options - Embed configuration options * @returns Embed configuration object */ getConfig(accessToken, tokenType, embedUrl, id, type, name, options) { // For null arguments - use the initial value // For specified arguments - use the current value return { type: type ? type : this.type ? this.type : "Report" /* ReportType.Report */, embedUrl: embedUrl ? embedUrl : this.embedUrl, accessToken: accessToken ? accessToken : this.accessToken, tokenType: tokenType ? this.getTokenType(tokenType) : this.getTokenType(this.tokenType), id: id ? id : this.id, uniqueId: name ? name : this.name, settings: options ? options : this.options }; } /** * Given an HTMLElement, construct an embed configuration based on attributes and pass to service. * @param element - native element where the embedding needs to be done * @param config - configuration to be embedded */ embed(element, config) { /*if (this.options) { const newConfig = { config, ...this.options }; }*/ this.component = this.powerBiService.embed(element, config); this.embedded.emit(this.component); } /** * Reset the component that has been removed from DOM. * @param element - native element where the embedded was made */ reset(element) { this.powerBiService.reset(element); this.component = null; } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgxPowerBiComponent, deps: [{ token: i1.NgxPowerBiService }], target: i0.ɵɵFactoryTarget.Component }); } /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NgxPowerBiComponent, selector: "ngx-powerbi-component", inputs: { accessToken: "accessToken", tokenType: "tokenType", embedUrl: "embedUrl", id: "id", type: "type", name: "name", options: "options" }, outputs: { embedded: "embedded" }, viewQueries: [{ propertyName: "ngxPowerBiIFrameRef", first: true, predicate: ["ngxPowerBiIFrame"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: '<div #ngxPowerBiIFrame style="height:100%; width: 100%;"></div>', isInline: true }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgxPowerBiComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-powerbi-component', template: '<div #ngxPowerBiIFrame style="height:100%; width: 100%;"></div>' }] }], ctorParameters: () => [{ type: i1.NgxPowerBiService }], propDecorators: { accessToken: [{ type: Input }], tokenType: [{ type: Input }], embedUrl: [{ type: Input }], id: [{ type: Input }], type: [{ type: Input }], name: [{ type: Input }], options: [{ type: Input }], embedded: [{ type: Output }], ngxPowerBiIFrameRef: [{ type: ViewChild, args: ['ngxPowerBiIFrame', { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXBvd2VyYmkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXBvd2VyYmkvc3JjL2xpYi9uZ3gtcG93ZXJiaS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFJTCxNQUFNLEVBRU4sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sS0FBSyxNQUFNLE1BQU0sZ0JBQWdCLENBQUM7QUFFekMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7OztBQWtCMUQsTUFBTSxPQUFPLG1CQUFtQjtJQWdCOUIsWUFBb0IsaUJBQW9DO1FBQXBDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFQOUMsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFROUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQztJQUMxQyxDQUFDO0lBRUQsZUFBZTtRQUNiLDJFQUEyRTtRQUMzRSxJQUNFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhO1lBQ3RDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUNqQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM5QixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sRUFDSixXQUFXLEVBQ1gsU0FBUyxFQUNULFFBQVEsRUFDUixFQUFFLEVBQ0YsSUFBSSxFQUNKLElBQUksRUFDSixPQUFPLEVBQ1IsR0FBRyxPQUFPLENBQUM7UUFFWixr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XG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBBZnRlclZpZXdJbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBwYmkgZnJvbSAncG93ZXJiaS1jbGllbnQnO1xuaW1wb3J0ICogYXMgbW9kZWxzIGZyb20gJ3Bvd2VyYmktbW9kZWxzJztcblxuaW1wb3J0IHsgTmd4UG93ZXJCaVNlcnZpY2UgfSBmcm9tICcuL25neC1wb3dlcmJpLnNlcnZpY2UnO1xuXG5leHBvcnQgY29uc3QgZW51bSBUb2tlblR5cGUge1xuICBBYWQgPSAnQWFkJyxcbiAgRW1iZWQgPSAnRW1iZWQnXG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIFJlcG9ydFR5cGUge1xuICBEYXNoYm9hcmQgPSAnRGFzaGJvYXJkJyxcbiAgUmVwb3J0ID0gJ1JlcG9ydCcsXG4gIFRpbGUgPSAnVGlsZSdcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LXBvd2VyYmktY29tcG9uZW50JyxcbiAgdGVtcGxhdGU6ICc8ZGl2ICNuZ3hQb3dlckJpSUZyYW1lIHN0eWxlPVwiaGVpZ2h0OjEwMCU7IHdpZHRoOiAxMDAlO1wiPjwvZGl2PicsXG4gIHN0eWxlczogW11cbn0pXG5leHBvcnQgY2xhc3MgTmd4UG93ZXJCaUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgLy8gUHVibGljIHByb3BlcnRpZXNcbiAgQElucHV0KCkgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgQElucHV0KCkgdG9rZW5UeXBlOiBUb2tlblR5cGU7XG4gIEBJbnB1dCgpIGVtYmVkVXJsOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHR5cGU6IFJlcG9ydFR5cGU7XG4gIEBJbnB1dCgpIG5hbWU6IHN0cmluZztcbiAgQElucHV0KCkgb3B0aW9uczogbW9kZWxzLklTZXR0aW5ncztcbiAgQE91dHB1dCgpIGVtYmVkZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBWaWV3Q2hpbGQoJ25neFBvd2VyQmlJRnJhbWUnLCB7c3RhdGljOiB0cnVlfSkgbmd4UG93ZXJCaUlGcmFtZVJlZjogRWxlbWVudFJlZjtcblxuICAvLyBQcml2YXRlIGZpZWxkc1xuICBwcml2YXRlIGNvbXBvbmVudDogcGJpLkVtYmVkO1xuICBwcml2YXRlIHBvd2VyQmlTZXJ2aWNlOiBOZ3hQb3dlckJpU2VydmljZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5neFBvd2VyQmlTZXJ2aWNlOiBOZ3hQb3dlckJpU2VydmljZSkge1xuICAgIHRoaXMucG93ZXJCaVNlcnZpY2UgPSBuZ3hQb3dlckJpU2VydmljZTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAvLyBFbWJlZCB0aGUgcmVwb3J0IGluc2lkZSB0aGUgdmlldyBjaGlsZCB0aGF0IHdlIGhhdmUgZmV0Y2hlZCBmcm9tIHRoZSBET01cbiAgICBpZiAoXG4gICAgICB0aGlzLm5neFBvd2VyQmlJRnJhbWVSZWYubmF0aXZlRWxlbWVudCAmJlxuICAgICAgdGhpcy52YWxpZGF0ZVJlcXVpcmVkQXR0cmlidXRlcygpXG4gICAgKSB7XG4gICAgICB0aGlzLmVtYmVkKHRoaXMubmd4UG93ZXJCaUlGcmFtZVJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLmdldENvbmZpZygpKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKCF0aGlzLm5neFBvd2VyQmlJRnJhbWVSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgYWNjZXNzVG9rZW4sXG4gICAgICB0b2tlblR5cGUsXG4gICAgICBlbWJlZFVybCxcbiAgICAgIGlkLFxuICAgICAgdHlwZSxcbiAgICAgIG5hbWUsXG4gICAgICBvcHRpb25zXG4gICAgfSA9IGNoYW5nZXM7XG5cbiAgICAvLyBUT0RPOiBWYWxpZGF0ZSB0aGVzZSBjb25kaXRpb25zXG4gICAgLyppZiAoXG4gICAgICAoYWNjZXNzVG9rZW4ucHJldmlvdXNWYWx1ZSAhPT0gdW5kZWZpbmVkIHx8IGFjY2Vzc1Rva2VuLnByZXZpb3VzVmFsdWUgPT09IGFjY2Vzc1Rva2VuLmN1cnJlbnRWYWx1ZSkgJiZcbiAgICAgIGVtYmVkVXJsLnByZXZpb3VzVmFsdWUgPT09IGVtYmVkVXJsLmN1cnJlbnRWYWx1ZVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH0qL1xuXG4gICAgaWYgKHRoaXMudmFsaWRhdGVSZXF1aXJlZEF0dHJpYnV0ZXMoKSkge1xuICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoXG4gICAgICAgIGFjY2Vzc1Rva2VuICYmIGFjY2Vzc1Rva2VuLmN1cnJlbnRWYWx1ZSxcbiAgICAgICAgdG9rZW5UeXBlICYmIHRva2VuVHlwZS5jdXJyZW50VmFsdWUsXG4gICAgICAgIGVtYmVkVXJsICYmIGVtYmVkVXJsLmN1cnJlbnRWYWx1ZSxcbiAgICAgICAgaWQgJiYgaWQuY3VycmVudFZhbHVlLFxuICAgICAgICB0eXBlICYmIHR5cGUuY3VycmVudFZhbHVlLFxuICAgICAgICBuYW1lICYmIG5hbWUuY3VycmVudFZhbHVlLFxuICAgICAgICBvcHRpb25zICYmIG9wdGlvbnMuY3VycmVudFZhbHVlXG4gICAgICApO1xuICAgICAgdGhpcy5lbWJlZCh0aGlzLm5neFBvd2VyQmlJRnJhbWVSZWYubmF0aXZlRWxlbWVudCwgY29uZmlnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29tcG9uZW50KSB7XG4gICAgICB0aGlzLnJlc2V0KHRoaXMubmd4UG93ZXJCaUlGcmFtZVJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5jb21wb25lbnQpIHtcbiAgICAgIHRoaXMucmVzZXQodGhpcy5uZ3hQb3dlckJpSUZyYW1lUmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgcmVxdWlyZWQgYXR0cmlidXRlcyAoZW1iZWRVcmwgYW5kIGFjY2Vzc1Rva2VuIGFyZSB2YWxpZCBiZWZvcmUgYXR0ZW1wdGluZyB0byBlbWJlZClcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVSZXF1aXJlZEF0dHJpYnV0ZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiB0aGlzLmVtYmVkVXJsID09PSAnc3RyaW5nJyAmJlxuICAgICAgdGhpcy5lbWJlZFVybC5sZW5ndGggPiAwICYmXG4gICAgICAodHlwZW9mIHRoaXMuYWNjZXNzVG9rZW4gPT09ICdzdHJpbmcnICYmIHRoaXMuYWNjZXNzVG9rZW4ubGVuZ3RoID4gMClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbW9kZWwgY2xhc3MgY29tcGF0aWJsZSB0b2tlbiBlbnVtIGZyb20gb3VyIHRva2VuIHR5cGUgZW51bVxuICAgKiBAcGFyYW0gdG9rZW5UeXBlIC0gVG9rZW4gdHlwZSBpbiBvdXIgY3VzdG9tIGVudW0gZm9ybWF0XG4gICAqIEByZXR1cm5zIFRva2VuIHR5cGUgaW4gcG93ZXJiaS1tb2RlbHMuVG9rZW5UeXBlIGVudW0gZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIGdldFRva2VuVHlwZSh0b2tlblR5cGU6IFRva2VuVHlwZSk6IG1vZGVscy5Ub2tlblR5cGUge1xuICAgIGlmICh0b2tlblR5cGUpIHtcbiAgICAgIHN3aXRjaCAodG9rZW5UeXBlKSB7XG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLkFhZDpcbiAgICAgICAgICByZXR1cm4gbW9kZWxzLlRva2VuVHlwZS5BYWQ7XG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLkVtYmVkOlxuICAgICAgICAgIHJldHVybiBtb2RlbHMuVG9rZW5UeXBlLkVtYmVkO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBtb2RlbHMuVG9rZW5UeXBlLkFhZDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZGVmYXVsdCBpcyBBQURcbiAgICAgIHJldHVybiBtb2RlbHMuVG9rZW5UeXBlLkFhZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBlbWJlZCBjb25maWd1cmF0aW9uIG9iamVjdC5cbiAgICogQHBhcmFtIGFjY2Vzc1Rva2VuIC0gQWNjZXNzIHRva2VuIHJlcXVpcmVkIHRvIGVtYmVkIGEgY29tcG9uZW50XG4gICAqIEBwYXJhbSB0b2tlblR5cGUgLSB0eXBlIG9mIGFjY2Vzc1Rva2VuOiBBYWQgb3IgRW1iZWRcbiAgICogQHBhcmFtIGVtYmVkVXJsIC0gRW1iZWQgVVJMIG9idGFpbmVkIHRocm91Z2ggUG93ZXIgQkkgUkVTVCBBUEkgb3IgUG9ydGFsXG4gICAqIEBwYXJhbSBpZCAtIGNvbXBvbmVudC9lbGVtZW50IEdVSURcbiAgICogQHBhcmFtIHR5cGUgLSB0eXBlIG9mIGVtYmVkZGVkIGNvbXBvbmVudCBlLmcuICdkYXNoYm9hcmQsIHJlcG9ydCBvciB0aWxlJ1xuICAgKiBAcGFyYW0gbmFtZSAtIG5hbWUgb2YgdGhlIGVtYmVkZGVkIGNvbXBvbmVudFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEVtYmVkIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKiBAcmV0dXJucyBFbWJlZCBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb25maWcoXG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmcsXG4gICAgdG9rZW5UeXBlPzogVG9rZW5UeXBlLFxuICAgIGVtYmVkVXJsPzogc3RyaW5nLFxuICAgIGlkPzogc3RyaW5nLFxuICAgIHR5cGU/OiBSZXBvcnRUeXBlLFxuICAgIG5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IG1vZGVscy5JU2V0dGluZ3NcbiAgKTogcGJpLklFbWJlZENvbmZpZ3VyYXRpb24ge1xuICAgIC8vIEZvciBudWxsIGFyZ3VtZW50cyAtIHVzZSB0aGUgaW5pdGlhbCB2YWx1ZVxuICAgIC8vIEZvciBzcGVjaWZpZWQgYXJndW1lbnRzIC0gdXNlIHRoZSBjdXJyZW50IHZhbHVlXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IHR5cGUgPyB0eXBlIDogdGhpcy50eXBlID8gdGhpcy50eXBlIDogUmVwb3J0VHlwZS5SZXBvcnQsXG4gICAgICBlbWJlZFVybDogZW1iZWRVcmwgPyBlbWJlZFVybCA6IHRoaXMuZW1iZWRVcmwsXG4gICAgICBhY2Nlc3NUb2tlbjogYWNjZXNzVG9rZW4gPyBhY2Nlc3NUb2tlbiA6IHRoaXMuYWNjZXNzVG9rZW4sXG4gICAgICB0b2tlblR5cGU6IHRva2VuVHlwZVxuICAgICAgICA/IHRoaXMuZ2V0VG9rZW5UeXBlKHRva2VuVHlwZSlcbiAgICAgICAgOiB0aGlzLmdldFRva2VuVHlwZSh0aGlzLnRva2VuVHlwZSksXG4gICAgICBpZDogaWQgPyBpZCA6IHRoaXMuaWQsXG4gICAgICB1bmlxdWVJZDogbmFtZSA/IG5hbWUgOiB0aGlzLm5hbWUsXG4gICAgICBzZXR0aW5nczogb3B0aW9ucyA/IG9wdGlvbnMgOiB0aGlzLm9wdGlvbnNcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGFuIEhUTUxFbGVtZW50LCBjb25zdHJ1Y3QgYW4gZW1iZWQgY29uZmlndXJhdGlvbiBiYXNlZCBvbiBhdHRyaWJ1dGVzIGFuZCBwYXNzIHRvIHNlcnZpY2UuXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gbmF0aXZlIGVsZW1lbnQgd2hlcmUgdGhlIGVtYmVkZGluZyBuZWVkcyB0byBiZSBkb25lXG4gICAqIEBwYXJhbSBjb25maWcgLSBjb25maWd1cmF0aW9uIHRvIGJlIGVtYmVkZGVkXG4gICAqL1xuICBwcml2YXRlIGVtYmVkKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjb25maWc6IHBiaS5JRW1iZWRDb25maWd1cmF0aW9uKSB7XG4gICAgLyppZiAodGhpcy5vcHRpb25zKSB7XG4gICAgICBjb25zdCBuZXdDb25maWcgPSB7IGNvbmZpZywgLi4udGhpcy5vcHRpb25zIH07XG4gICAgfSovXG5cbiAgICB0aGlzLmNvbXBvbmVudCA9IHRoaXMucG93ZXJCaVNlcnZpY2UuZW1iZWQoZWxlbWVudCwgY29uZmlnKTtcbiAgICB0aGlzLmVtYmVkZGVkLmVtaXQodGhpcy5jb21wb25lbnQgYXMgYW55KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgY29tcG9uZW50IHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIERPTS5cbiAgICogQHBhcmFtIGVsZW1lbnQgLSBuYXRpdmUgZWxlbWVudCB3aGVyZSB0aGUgZW1iZWRkZWQgd2FzIG1hZGVcbiAgICovXG4gIHJlc2V0KGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5wb3dlckJpU2VydmljZS5yZXNldChlbGVtZW50KTtcbiAgICB0aGlzLmNvbXBvbmVudCA9IG51bGw7XG4gIH1cbn1cbiJdfQ==