UNPKG

ontimize-web-ngx

Version:
175 lines 28.4 kB
import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Injectable, Injector } from '@angular/core'; import { Router } from '@angular/router'; import { Observable } from 'rxjs'; import { map, share } from 'rxjs/operators'; import { AppConfig } from '../config/app-config'; import { Codes } from '../util/codes'; import { Util } from '../util/util'; import { AuthService } from './auth.service'; import { LoginStorageService } from './login-storage.service'; import { NameConvention } from './name-convention/name-convention.service'; import { OntimizeServiceResponseAdapter } from './ontimize/ontimize-service-response.adapter'; import { PaginationContextService } from './pagination-context.service'; import { OntimizeServiceResponseParser } from './parser/o-service-response.parser'; import { OntimizeRequestArgumentsAdapter } from './request-adapter/ontimize-request-arguments.adapter'; import * as i0 from "@angular/core"; export class BaseService { constructor(injector) { this.injector = injector; this.httpClient = this.injector.get(HttpClient); this.router = this.injector.get(Router); this._config = this.injector.get(AppConfig); this._appConfig = this._config.getConfiguration(); this.responseParser = this.injector.get(OntimizeServiceResponseParser); this.authService = this.injector.get(AuthService); this.loginStorageService = this.injector.get(LoginStorageService); this.nameConvention = this.injector.get(NameConvention); this.paginationContextService = new PaginationContextService(); this.requestArgumentAdapter = this.injector.get(OntimizeRequestArgumentsAdapter); this.requestArgumentAdapter.setPaginationContextService(this.paginationContextService); } configureAdapter() { this.adapter = this.injector.get(OntimizeServiceResponseAdapter); } configureService(config) { this.configureAdapter(); this._urlBase = config.urlBase ? config.urlBase : this._appConfig.apiEndpoint; } getDefaultServiceConfiguration(serviceName) { const configuration = this._config.getServiceConfiguration(); let servConfig = {}; if (serviceName && configuration.hasOwnProperty(serviceName)) { servConfig = configuration[serviceName]; } servConfig[Codes.SESSION_KEY] = this.authService.getSessionInfo(); return servConfig; } get urlBase() { return this._urlBase; } set urlBase(value) { this._urlBase = value; } doRequest(param) { if (param?.url.length >= 2048) { console.warn('The maximum length in the URL request must not be greater than 2048 characters.'); } const dataObservable = new Observable((observer) => { const options = param.options || { headers: this.buildHeaders() }; options.observe = 'response'; let requestObs; switch (param.method) { case 'GET': requestObs = this.httpClient.get(param.url, options); break; case 'PUT': requestObs = this.httpClient.put(param.url, param.body, options); break; case 'DELETE': const deleteOptions = { headers: options.headers, body: param.body }; deleteOptions.observe = 'response'; requestObs = this.httpClient.delete(param.url, deleteOptions); break; case 'PATCH': requestObs = this.httpClient.patch(param.url, param.body, options); break; case 'POST': default: requestObs = this.httpClient.post(param.url, param.body, options); break; } requestObs.pipe(map((data) => { this.refreshAuthToken(data); return this.adapter.adapt(data); })).subscribe({ next: (resp) => { (param.successCallback || this.parseSuccessfulResponse).bind(this)(resp, observer); }, error: (error) => { (param.errorCallBack || this.parseUnsuccessfulResponse).bind(this)(error, observer); }, complete: () => observer.complete() }); }); return dataObservable.pipe(share()); } buildHeaders() { return new HttpHeaders({ 'Access-Control-Allow-Origin': '*', 'Content-Type': 'application/json;charset=UTF-8' }); } clientErrorFallback(errorCode) { } serverErrorFallback(errorCode) { } parseSuccessfulResponse(resp, observer) { this.responseParser.parseSuccessfulResponse(resp, observer, this); } parseSuccessfulQueryResponse(resp, observer) { this.parseSuccessfulResponse(resp, observer); } parseSuccessfulAdvancedQueryResponse(resp, observer) { this.parseSuccessfulResponse(resp, observer); } parseSuccessfulInsertResponse(resp, observer) { this.parseSuccessfulResponse(resp, observer); } parseSuccessfulUpdateResponse(resp, observer) { this.parseSuccessfulResponse(resp, observer); } parseSuccessfulDeleteResponse(resp, observer) { this.parseSuccessfulResponse(resp, observer); } parseUnsuccessfulResponse(error, observer) { if (this.adapter?.adaptError) { const adaptedError = this.adapter.adaptError(error); if (Util.isDefined(adaptedError)) { error = adaptedError; } } this.responseParser.parseUnsuccessfulResponse(error, observer, this); } parseUnsuccessfulQueryResponse(resp, observer) { this.parseUnsuccessfulResponse(resp, observer); } parseUnsuccessfulAdvancedQueryResponse(resp, observer) { this.parseUnsuccessfulResponse(resp, observer); } parseUnsuccessfulInsertResponse(resp, observer) { this.parseUnsuccessfulResponse(resp, observer); } parseUnsuccessfulUpdateResponse(resp, observer) { this.parseUnsuccessfulResponse(resp, observer); } parseUnsuccessfulDeleteResponse(resp, observer) { this.parseUnsuccessfulResponse(resp, observer); } refreshAuthToken(res) { const authToken = res.headers.get('X-Auth-Token'); if (Util.isDefined(authToken)) { this.loginStorageService.updateSessionId(authToken); } } setPaginationContext(context) { this.paginationContextService.setContext({ ...this.getPaginationContext(), ...context }); } getPaginationContext() { return this.paginationContextService.getContext(); } reinitializePaginationContext(pageSize) { this.paginationContextService.reinitializeContext(pageSize); } } BaseService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: BaseService, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); BaseService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: BaseService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: BaseService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i0.Injector }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1zZXJ2aWNlLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL3NlcnZpY2VzL2Jhc2Utc2VydmljZS5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFxQixXQUFXLEVBQWdCLE1BQU0sc0JBQXNCLENBQUM7QUFDaEcsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxVQUFVLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU1QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFPakQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDM0UsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDOUYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFbkYsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sc0RBQXNELENBQUM7O0FBR3ZHLE1BQU0sT0FBTyxXQUFXO0lBaUJ0QixZQUFzQixRQUFrQjtRQUFsQixh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dkIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwSGVhZGVycywgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpYmVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHNoYXJlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBBcHBDb25maWcgfSBmcm9tICcuLi9jb25maWcvYXBwLWNvbmZpZyc7XG5pbXBvcnQgeyBQYWdpbmF0aW9uQ29udGV4dCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcGFnaW5hdGlvbi1jb250ZXh0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBJU2VydmljZVJlc3BvbnNlQWRhcHRlciB9IGZyb20gJy4uL2ludGVyZmFjZXMvc2VydmljZS1yZXNwb25zZS1hZGFwdGVyLmludGVyZmFjZSc7XG5pbXBvcnQgeyBTZXJ2aWNlUmVzcG9uc2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3NlcnZpY2UtcmVzcG9uc2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4uL3R5cGVzL2NvbmZpZy50eXBlJztcbmltcG9ydCB7IEh0dHBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzL2h0dHAtcmVxdWVzdC1vcHRpb25zLnR5cGUnO1xuaW1wb3J0IHsgU2VydmljZVJlcXVlc3RQYXJhbSB9IGZyb20gJy4uL3R5cGVzL3NlcnZpY2UtcmVxdWVzdC1wYXJhbS50eXBlJztcbmltcG9ydCB7IENvZGVzIH0gZnJvbSAnLi4vdXRpbC9jb2Rlcyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmFzZVNlcnZpY2VSZXNwb25zZSB9IGZyb20gJy4vYmFzZS1zZXJ2aWNlLXJlc3BvbnNlLmNsYXNzJztcbmltcG9ydCB7IExvZ2luU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuL2xvZ2luLXN0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBOYW1lQ29udmVudGlvbiB9IGZyb20gJy4vbmFtZS1jb252ZW50aW9uL25hbWUtY29udmVudGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE9udGltaXplU2VydmljZVJlc3BvbnNlQWRhcHRlciB9IGZyb20gJy4vb250aW1pemUvb250aW1pemUtc2VydmljZS1yZXNwb25zZS5hZGFwdGVyJztcbmltcG9ydCB7IFBhZ2luYXRpb25Db250ZXh0U2VydmljZSB9IGZyb20gJy4vcGFnaW5hdGlvbi1jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgT250aW1pemVTZXJ2aWNlUmVzcG9uc2VQYXJzZXIgfSBmcm9tICcuL3BhcnNlci9vLXNlcnZpY2UtcmVzcG9uc2UucGFyc2VyJztcbmltcG9ydCB7IEJhc2VSZXF1ZXN0QXJndW1lbnQgfSBmcm9tICcuL3JlcXVlc3QtYWRhcHRlci9iYXNlLXJlcXVlc3QtYXJndW1lbnQuYWRhcHRlcic7XG5pbXBvcnQgeyBPbnRpbWl6ZVJlcXVlc3RBcmd1bWVudHNBZGFwdGVyIH0gZnJvbSAnLi9yZXF1ZXN0LWFkYXB0ZXIvb250aW1pemUtcmVxdWVzdC1hcmd1bWVudHMuYWRhcHRlcic7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBCYXNlU2VydmljZTxUIGV4dGVuZHMgU2VydmljZVJlc3BvbnNlPiB7XG5cbiAgcHJvdGVjdGVkIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQ7XG4gIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcjtcblxuICBwcm90ZWN0ZWQgX3VybEJhc2U6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9hcHBDb25maWc6IENvbmZpZztcbiAgcHJvdGVjdGVkIF9jb25maWc6IEFwcENvbmZpZztcbiAgcHJvdGVjdGVkIHJlc3BvbnNlUGFyc2VyOiBPbnRpbWl6ZVNlcnZpY2VSZXNwb25zZVBhcnNlcjxUPjtcbiAgcHJvdGVjdGVkIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZTtcbiAgcHJvdGVjdGVkIGFkYXB0ZXI6IElTZXJ2aWNlUmVzcG9uc2VBZGFwdGVyPEJhc2VTZXJ2aWNlUmVzcG9uc2U+O1xuICBwcm90ZWN0ZWQgbG9naW5TdG9yYWdlU2VydmljZTogTG9naW5TdG9yYWdlU2VydmljZTtcbiAgbmFtZUNvbnZlbnRpb246IE5hbWVDb252ZW50aW9uO1xuICByZXF1ZXN0QXJndW1lbnRBZGFwdGVyOiBCYXNlUmVxdWVzdEFyZ3VtZW50O1xuICBwcm90ZWN0ZWQgcGFnaW5hdGlvbkNvbnRleHRTZXJ2aWNlOiBQYWdpbmF0aW9uQ29udGV4dFNlcnZpY2U7XG5cblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgdGhpcy5odHRwQ2xpZW50ID0gdGhpcy5pbmplY3Rvci5nZXQ8SHR0cENsaWVudD4oSHR0cENsaWVudCBhcyBUeXBlPEh0dHBDbGllbnQ+KTtcbiAgICB0aGlzLnJvdXRlciA9IHRoaXMuaW5qZWN0b3IuZ2V0PFJvdXRlcj4oUm91dGVyIGFzIFR5cGU8Um91dGVyPik7XG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5pbmplY3Rvci5nZXQ8QXBwQ29uZmlnPihBcHBDb25maWcgYXMgVHlwZTxBcHBDb25maWc+KTtcbiAgICB0aGlzLl9hcHBDb25maWcgPSB0aGlzLl9jb25maWcuZ2V0Q29uZmlndXJhdGlvbigpO1xuICAgIHRoaXMucmVzcG9uc2VQYXJzZXIgPSB0aGlzLmluamVjdG9yLmdldDxPbnRpbWl6ZVNlcnZpY2VSZXNwb25zZVBhcnNlcjxUPj4oT250aW1pemVTZXJ2aWNlUmVzcG9uc2VQYXJzZXIgYXMgVHlwZTxPbnRpbWl6ZVNlcnZpY2VSZXNwb25zZVBhcnNlcjxUPj4pO1xuICAgIHRoaXMuYXV0aFNlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldDxBdXRoU2VydmljZT4oQXV0aFNlcnZpY2UgYXMgVHlwZTxBdXRoU2VydmljZT4pO1xuICAgIHRoaXMubG9naW5TdG9yYWdlU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0PExvZ2luU3RvcmFnZVNlcnZpY2U+KExvZ2luU3RvcmFnZVNlcnZpY2UpO1xuICAgIHRoaXMubmFtZUNvbnZlbnRpb24gPSB0aGlzLmluamVjdG9yLmdldChOYW1lQ29udmVudGlvbik7XG4gICAgdGhpcy5wYWdpbmF0aW9uQ29udGV4dFNlcnZpY2UgPSBuZXcgUGFnaW5hdGlvbkNvbnRleHRTZXJ2aWNlKCk7IC8vXG4gICAgdGhpcy5yZXF1ZXN0QXJndW1lbnRBZGFwdGVyID0gdGhpcy5pbmplY3Rvci5nZXQoT250aW1pemVSZXF1ZXN0QXJndW1lbnRzQWRhcHRlcik7XG4gICAgdGhpcy5yZXF1ZXN0QXJndW1lbnRBZGFwdGVyLnNldFBhZ2luYXRpb25Db250ZXh0U2VydmljZSh0aGlzLnBhZ2luYXRpb25Db250ZXh0U2VydmljZSk7XG4gIH1cblxuICBwdWJsaWMgY29uZmlndXJlQWRhcHRlcigpIHtcbiAgICB0aGlzLmFkYXB0ZXIgPSB0aGlzLmluamVjdG9yLmdldChPbnRpbWl6ZVNlcnZpY2VSZXNwb25zZUFkYXB0ZXIpO1xuICB9XG5cblxuICBwdWJsaWMgY29uZmlndXJlU2VydmljZShjb25maWc6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlndXJlQWRhcHRlcigpO1xuICAgIHRoaXMuX3VybEJhc2UgPSBjb25maWcudXJsQmFzZSA/IGNvbmZpZy51cmxCYXNlIDogdGhpcy5fYXBwQ29uZmlnLmFwaUVuZHBvaW50O1xuICB9XG5cbiAgcHVibGljIGdldERlZmF1bHRTZXJ2aWNlQ29uZmlndXJhdGlvbihzZXJ2aWNlTmFtZT86IHN0cmluZyk6IGFueSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuX2NvbmZpZy5nZXRTZXJ2aWNlQ29uZmlndXJhdGlvbigpO1xuICAgIGxldCBzZXJ2Q29uZmlnID0ge307XG4gICAgaWYgKHNlcnZpY2VOYW1lICYmIGNvbmZpZ3VyYXRpb24uaGFzT3duUHJvcGVydHkoc2VydmljZU5hbWUpKSB7XG4gICAgICBzZXJ2Q29uZmlnID0gY29uZmlndXJhdGlvbltzZXJ2aWNlTmFtZV07XG4gICAgfVxuICAgIHNlcnZDb25maWdbQ29kZXMuU0VTU0lPTl9LRVldID0gdGhpcy5hdXRoU2VydmljZS5nZXRTZXNzaW9uSW5mbygpO1xuICAgIHJldHVybiBzZXJ2Q29uZmlnO1xuICB9XG5cbiAgcHVibGljIGdldCB1cmxCYXNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3VybEJhc2U7XG4gIH1cblxuICBwdWJsaWMgc2V0IHVybEJhc2UodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3VybEJhc2UgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBkb1JlcXVlc3QocGFyYW06IFNlcnZpY2VSZXF1ZXN0UGFyYW08VD4pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICBpZiAocGFyYW0/LnVybC5sZW5ndGggPj0gMjA0OCkge1xuICAgICAgY29uc29sZS53YXJuKCdUaGUgbWF4aW11bSBsZW5ndGggaW4gdGhlIFVSTCByZXF1ZXN0IG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiAyMDQ4IGNoYXJhY3RlcnMuJylcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhT2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxUPiA9IG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogU3Vic2NyaWJlcjxUPikgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHBhcmFtLm9wdGlvbnMgfHwge1xuICAgICAgICBoZWFkZXJzOiB0aGlzLmJ1aWxkSGVhZGVycygpXG4gICAgICB9O1xuICAgICAgb3B0aW9ucy5vYnNlcnZlID0gJ3Jlc3BvbnNlJztcbiAgICAgIGxldCByZXF1ZXN0T2JzOiBPYnNlcnZhYmxlPFQ+O1xuICAgICAgc3dpdGNoIChwYXJhbS5tZXRob2QpIHtcbiAgICAgICAgY2FzZSAnR0VUJzpcbiAgICAgICAgICByZXF1ZXN0T2JzID0gdGhpcy5odHRwQ2xpZW50LmdldDxUPihwYXJhbS51cmwsIG9wdGlvbnMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdQVVQnOlxuICAgICAgICAgIHJlcXVlc3RPYnMgPSB0aGlzLmh0dHBDbGllbnQucHV0PFQ+KHBhcmFtLnVybCwgcGFyYW0uYm9keSwgb3B0aW9ucyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0RFTEVURSc6XG4gICAgICAgICAgY29uc3QgZGVsZXRlT3B0aW9uczogSHR0cFJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgICAgICAgaGVhZGVyczogb3B0aW9ucy5oZWFkZXJzLFxuICAgICAgICAgICAgYm9keTogcGFyYW0uYm9keVxuICAgICAgICAgIH07XG4gICAgICAgICAgZGVsZXRlT3B0aW9ucy5vYnNlcnZlID0gJ3Jlc3BvbnNlJztcbiAgICAgICAgICByZXF1ZXN0T2JzID0gdGhpcy5odHRwQ2xpZW50LmRlbGV0ZTxUPihwYXJhbS51cmwsIGRlbGV0ZU9wdGlvbnMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdQQVRDSCc6XG4gICAgICAgICAgcmVxdWVzdE9icyA9IHRoaXMuaHR0cENsaWVudC5wYXRjaDxUPihwYXJhbS51cmwsIHBhcmFtLmJvZHksIG9wdGlvbnMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdQT1NUJzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXF1ZXN0T2JzID0gdGhpcy5odHRwQ2xpZW50LnBvc3Q8VD4ocGFyYW0udXJsLCBwYXJhbS5ib2R5LCBvcHRpb25zKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcmVxdWVzdE9icy5waXBlKFxuICAgICAgICBtYXAoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMucmVmcmVzaEF1dGhUb2tlbihkYXRhKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLmFkYXB0KGRhdGEpO1xuICAgICAgICB9KVxuICAgICAgKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzcCkgPT4ge1xuICAgICAgICAgIChwYXJhbS5zdWNjZXNzQ2FsbGJhY2sgfHwgdGhpcy5wYXJzZVN1Y2Nlc3NmdWxSZXNwb25zZSkuYmluZCh0aGlzKShyZXNwLCBvYnNlcnZlcik7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICAocGFyYW0uZXJyb3JDYWxsQmFjayB8fCB0aGlzLnBhcnNlVW5zdWNjZXNzZnVsUmVzcG9uc2UpLmJpbmQodGhpcykoZXJyb3IsIG9ic2VydmVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29tcGxldGU6ICgpID0+IG9ic2VydmVyLmNvbXBsZXRlKClcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBkYXRhT2JzZXJ2YWJsZS5waXBlKHNoYXJlKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkSGVhZGVycygpOiBIdHRwSGVhZGVycyB7XG4gICAgcmV0dXJuIG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzogJyonLFxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2xpZW50RXJyb3JGYWxsYmFjayhlcnJvckNvZGU6IG51bWJlcikge1xuXG4gIH1cblxuICBwdWJsaWMgc2VydmVyRXJyb3JGYWxsYmFjayhlcnJvckNvZGU6IG51bWJlcikge1xuXG4gIH1cblxuICAvKlxuICAgKiBTdWNjZXNzZnVsIHJlc3BvbnNlIHBhcnNlcnMsIHRoZXJlIGlzIG9uZSBwYXJzZXIgZm9yIGVhY2ggQ1JVRCBtZXRob2Qgd2hpY2ggY2FsbHMgdG8gdGhlIGNvbW1vbiBwYXJzZXIuXG4gICAqIFVzZXIgY2FuIG92ZXJ3cml0ZSB0aGUgY2hvc2VuIG1ldGhvZHMgcGFyc2VycyBvciB0aGUgY29tbW9uIHBhcnNlclxuICAgKi9cbiAgcHJvdGVjdGVkIHBhcnNlU3VjY2Vzc2Z1bFJlc3BvbnNlKHJlc3A6IFQsIG9ic2VydmVyOiBTdWJzY3JpYmVyPFQ+KSB7XG4gICAgdGhpcy5yZXNwb25zZVBhcnNlci5wYXJzZVN1Y2Nlc3NmdWxSZXNwb25zZShyZXNwLCBvYnNlcnZlciwgdGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VTdWNjZXNzZnVsUXVlcnlSZXNwb25zZShyZXNwOiBULCBvYnNlcnZlcjogU3Vic2NyaWJlcjxUPikge1xuICAgIHRoaXMucGFyc2VTdWNjZXNzZnVsUmVzcG9uc2UocmVzcCwgb2JzZXJ2ZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlU3VjY2Vzc2Z1bEFkdmFuY2VkUXVlcnlSZXNwb25zZShyZXNwOiBULCBvYnNlcnZlcjogU3Vic2NyaWJlcjxUPikge1xuICAgIHRoaXMucGFyc2VTdWNjZXNzZnVsUmVzcG9uc2UocmVzcCwgb2JzZXJ2ZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlU3VjY2Vzc2Z1bEluc2VydFJlc3BvbnNlKHJlc3A6IFQsIG9ic2VydmVyOiBTdWJzY3JpYmVyPFQ+KSB7XG4gICAgdGhpcy5wYXJzZVN1Y2Nlc3NmdWxSZXNwb25zZShyZXNwLCBvYnNlcnZlcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VTdWNjZXNzZnVsVXBkYXRlUmVzcG9uc2UocmVzcDogVCwgb2JzZXJ2ZXI6IFN1YnNjcmliZXI8VD4pIHtcbiAgICB0aGlzLnBhcnNlU3VjY2Vzc2Z1bFJlc3BvbnNlKHJlc3AsIG9ic2VydmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZVN1Y2Nlc3NmdWxEZWxldGVSZXNwb25zZShyZXNwOiBULCBvYnNlcnZlcjogU3Vic2NyaWJlcjxUPikge1xuICAgIHRoaXMucGFyc2VTdWNjZXNzZnVsUmVzcG9uc2UocmVzcCwgb2JzZXJ2ZXIpO1xuICB9XG5cbiAgLypcbiAgICogVW5zdWNjZXNzZnVsIHJlc3BvbnNlIHBhcnNlcnMsIHRoZXJlIGlzIG9uZSBwYXJzZXIgZm9yIGVhY2ggQ1JVRCBtZXRob2Qgd2hpY2ggY2FsbHMgdG8gdGhlIGNvbW1vbiBwYXJzZXIuXG4gICAqIFVzZXIgY2FuIG92ZXJ3cml0ZSB0aGUgY2hvc2VuIG1ldGhvZHMgcGFyc2VycyBvciB0aGUgY29tbW9uIHBhcnNlclxuICAgKi9cbiAgcHJvdGVjdGVkIHBhcnNlVW5zdWNjZXNzZnVsUmVzcG9uc2UoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlLCBvYnNlcnZlcjogU3Vic2NyaWJlcjxUPikge1xuICAgIGlmICh0aGlzLmFkYXB0ZXI/LmFkYXB0RXJyb3IpIHtcbiAgICAgIGNvbnN0IGFkYXB0ZWRFcnJvciA9IHRoaXMuYWRhcHRlci5hZGFwdEVycm9yKGVycm9yKTtcbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChhZGFwdGVkRXJyb3IpKSB7XG4gICAgICAgIGVycm9yID0gYWRhcHRlZEVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlc3BvbnNlUGFyc2VyLnBhcnNlVW5zdWNjZXNzZnVsUmVzcG9uc2UoZXJyb3IsIG9ic2VydmVyLCB0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZVVuc3VjY2Vzc2Z1bFF1ZXJ5UmVzcG9uc2UocmVzcDogSHR0cEVycm9yUmVzcG9uc2UsIG9ic2VydmVyOiBTdWJzY3JpYmVyPFQ+KSB7XG4gICAgdGhpcy5wYXJzZVVuc3VjY2Vzc2Z1bFJlc3BvbnNlKHJlc3AsIG9ic2VydmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZVVuc3VjY2Vzc2Z1bEFkdmFuY2VkUXVlcnlSZXNwb25zZShyZXNwOiBIdHRwRXJyb3JSZXNwb25zZSwgb2JzZXJ2ZXI6IFN1YnNjcmliZXI8VD4pIHtcbiAgICB0aGlzLnBhcnNlVW5zdWNjZXNzZnVsUmVzcG9uc2UocmVzcCwgb2JzZXJ2ZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlVW5zdWNjZXNzZnVsSW5zZXJ0UmVzcG9uc2UocmVzcDogSHR0cEVycm9yUmVzcG9uc2UsIG9ic2VydmVyOiBTdWJzY3JpYmVyPFQ+KSB7XG4gICAgdGhpcy5wYXJzZVVuc3VjY2Vzc2Z1bFJlc3BvbnNlKHJlc3AsIG9ic2VydmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZVVuc3VjY2Vzc2Z1bFVwZGF0ZVJlc3BvbnNlKHJlc3A6IEh0dHBFcnJvclJlc3BvbnNlLCBvYnNlcnZlcjogU3Vic2NyaWJlcjxUPikge1xuICAgIHRoaXMucGFyc2VVbnN1Y2Nlc3NmdWxSZXNwb25zZShyZXNwLCBvYnNlcnZlcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VVbnN1Y2Nlc3NmdWxEZWxldGVSZXNwb25zZShyZXNwOiBIdHRwRXJyb3JSZXNwb25zZSwgb2JzZXJ2ZXI6IFN1YnNjcmliZXI8VD4pIHtcbiAgICB0aGlzLnBhcnNlVW5zdWNjZXNzZnVsUmVzcG9uc2UocmVzcCwgb2JzZXJ2ZXIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZnJlc2hBdXRoVG9rZW4ocmVzOiBIdHRwUmVzcG9uc2U8YW55Pikge1xuICAgIGNvbnN0IGF1dGhUb2tlbiA9IHJlcy5oZWFkZXJzLmdldCgnWC1BdXRoLVRva2VuJyk7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGF1dGhUb2tlbikpIHtcbiAgICAgIHRoaXMubG9naW5TdG9yYWdlU2VydmljZS51cGRhdGVTZXNzaW9uSWQoYXV0aFRva2VuKTtcbiAgICB9XG4gIH1cblxuICBzZXRQYWdpbmF0aW9uQ29udGV4dChjb250ZXh0OiBQYWdpbmF0aW9uQ29udGV4dCk6IHZvaWQge1xuICAgIHRoaXMucGFnaW5hdGlvbkNvbnRleHRTZXJ2aWNlLnNldENvbnRleHQoeyAuLi50aGlzLmdldFBhZ2luYXRpb25Db250ZXh0KCksIC4uLmNvbnRleHQgfSk7XG4gIH1cblxuICBnZXRQYWdpbmF0aW9uQ29udGV4dCgpOiBQYWdpbmF0aW9uQ29udGV4dCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnBhZ2luYXRpb25Db250ZXh0U2VydmljZS5nZXRDb250ZXh0KCk7XG4gIH1cblxuICByZWluaXRpYWxpemVQYWdpbmF0aW9uQ29udGV4dChwYWdlU2l6ZT86IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucGFnaW5hdGlvbkNvbnRleHRTZXJ2aWNlLnJlaW5pdGlhbGl6ZUNvbnRleHQocGFnZVNpemUpO1xuICB9XG5cbn1cbiJdfQ==