UNPKG

@formio-tmt/angular

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.1.4.

208 lines 27.3 kB
import { EventEmitter, Injectable, Optional } from '@angular/core'; import { FormioPromiseService } from '@formio-tmt/angular'; import { FormioAlerts } from '@formio-tmt/angular'; import Promise from 'native-promise-only'; import { Formio, Utils } from '@formio-tmt/js'; import _ from 'lodash'; import * as i0 from "@angular/core"; import * as i1 from "@formio-tmt/angular"; import * as i2 from "./resource.config"; import * as i3 from "./resources.service"; class FormioResourceService { appConfig; config; resourcesService; appRef; initialized = false; form; alerts; resource; resourceUrl; formUrl; formFormio; formio; refresh; resourceLoading; resourceLoaded; resourceId; resources; formLoading; formLoaded; formResolve; formReject; isLoading; constructor(appConfig, config, resourcesService, appRef) { this.appConfig = appConfig; this.config = config; this.resourcesService = resourcesService; this.appRef = appRef; this.isLoading = true; this.alerts = new FormioAlerts(); this.refresh = new EventEmitter(); this.formLoaded = new Promise((resolve, reject) => { this.formResolve = resolve; this.formReject = reject; }); this.init(); } initialize() { console.warn('FormioResourceService.initialize() has been deprecated.'); } init() { if (this.initialized) { return; } this.initialized = true; if (this.appConfig && this.appConfig.appUrl) { Formio.setBaseUrl(this.appConfig.apiUrl); Formio.setProjectUrl(this.appConfig.appUrl); Formio.formOnly = this.appConfig.formOnly; } else { console.error('You must provide an AppConfig within your application!'); } // Create the form url and load the resources. this.formUrl = this.appConfig.appUrl + '/' + this.config.form; this.resource = { data: {} }; // Add this resource service to the list of all resources in context. if (this.resourcesService) { this.resources = this.resourcesService.resources; this.resources[this.config.name] = this; } return this.loadForm(); } onError(error) { this.alerts.setAlert({ type: 'danger', message: error.message || error }); if (this.resourcesService) { this.resourcesService.error.emit(error); } throw error; } onFormError(err) { this.formReject(err); this.onError(err); } setContext(route) { this.resourceId = route.snapshot.params['id']; this.resource = { data: {} }; this.resourceUrl = this.appConfig.appUrl + '/' + this.config.form; if (this.resourceId) { this.resourceUrl += '/submission/' + this.resourceId; } this.formio = new FormioPromiseService(this.resourceUrl); if (this.resourcesService) { this.resources[this.config.name] = this; } this.loadParents(); } loadForm() { this.formFormio = new FormioPromiseService(this.formUrl); this.isLoading = true; this.formLoading = this.formFormio .loadForm() .then((form) => { this.form = form; this.formResolve(form); this.isLoading = false; this.loadParents(); return form; }, (err) => this.onFormError(err)) .catch((err) => this.onFormError(err)); return this.formLoading; } loadParents() { if (!this.config.parents || !this.config.parents.length) { return Promise.resolve([]); } if (!this.resourcesService) { console.warn('You must provide the FormioResources within your application to use nested resources.'); return Promise.resolve([]); } return this.formLoading.then((form) => { // Iterate through the list of parents. const _parentsLoaded = []; this.config.parents.forEach((parent) => { const resourceName = parent.resource || parent; const resourceField = parent.field || parent; const filterResource = parent.hasOwnProperty('filter') ? parent.filter : true; if (this.resources.hasOwnProperty(resourceName) && this.resources[resourceName].resourceLoaded) { _parentsLoaded.push(this.resources[resourceName].resourceLoaded.then((resource) => { let parentPath = ''; Utils.eachComponent(form.components, (component, path) => { if (component.key === resourceField) { component.hidden = true; component.clearOnHide = false; _.set(this.resource.data, path, resource); parentPath = path; return true; } }); return { name: parentPath, filter: filterResource, resource }; })); } }); // When all the parents have loaded, emit that to the onParents emitter. return Promise.all(_parentsLoaded).then((parents) => { this.refresh.emit({ form: form, submission: this.resource }); return parents; }); }); } onSubmissionError(err) { this.onError(err); } loadResource(route) { this.setContext(route); this.isLoading = true; this.resourceLoading = this.resourceLoaded = this.formio .loadSubmission(null, { ignoreCache: true }) .then((resource) => { this.resource = resource; this.isLoading = false; this.refresh.emit({ property: 'submission', value: this.resource }); return resource; }, (err) => this.onSubmissionError(err)) .catch((err) => this.onSubmissionError(err)); return this.resourceLoading; } save(resource) { const formio = resource._id ? this.formio : this.formFormio; return formio .saveSubmission(resource) .then((saved) => { this.resource = saved; return saved; }, (err) => this.onError(err)) .catch((err) => this.onError(err)); } remove() { return this.formio .deleteSubmission() .then(() => { this.resource = null; }, (err) => this.onError(err)) .catch((err) => this.onError(err)); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: FormioResourceService, deps: [{ token: i1.FormioAppConfig }, { token: i2.FormioResourceConfig }, { token: i3.FormioResources, optional: true }, { token: i0.ApplicationRef }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: FormioResourceService }); } export { FormioResourceService }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: FormioResourceService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.FormioAppConfig }, { type: i2.FormioResourceConfig }, { type: i3.FormioResources, decorators: [{ type: Optional }] }, { type: i0.ApplicationRef }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItZm9ybWlvL3Jlc291cmNlL3NyYy9yZXNvdXJjZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBa0IsWUFBWSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJbkYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR25ELE9BQU8sT0FBTyxNQUFNLHFCQUFxQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0MsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDOzs7OztBQUV2QixNQUNhLHFCQUFxQjtJQXVCdkI7SUFDQTtJQUNZO0lBQ1o7SUF6QkYsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUNwQixJQUFJLENBQU07SUFDVixNQUFNLENBQWU7SUFDckIsUUFBUSxDQUFNO0lBQ2QsV0FBVyxDQUFVO0lBQ3JCLE9BQU8sQ0FBUztJQUNoQixVQUFVLENBQXVCO0lBQ2pDLE1BQU0sQ0FBdUI7SUFDN0IsT0FBTyxDQUFtQztJQUUxQyxlQUFlLENBQWdCO0lBQy9CLGNBQWMsQ0FBZ0I7SUFDOUIsVUFBVSxDQUFVO0lBQ3BCLFNBQVMsQ0FBTTtJQUVmLFdBQVcsQ0FBZ0I7SUFDM0IsVUFBVSxDQUFlO0lBQ3pCLFdBQVcsQ0FBTTtJQUNqQixVQUFVLENBQU07SUFDaEIsU0FBUyxDQUFVO0lBRTFCLFlBQ1MsU0FBMEIsRUFDMUIsTUFBNEIsRUFDaEIsZ0JBQWlDLEVBQzdDLE1BQXNCO1FBSHRCLGNBQVMsR0FBVCxTQUFTLENBQWlCO1FBQzFCLFdBQU0sR0FBTixNQUFNLENBQXNCO1FBQ2hCLHFCQUFnQixHQUFo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LENBQUMsR0FBRyxDQUFDLENBQ2hDO2FBQ0EsS0FBSyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxNQUFNO2FBQ2YsZ0JBQWdCLEVBQUU7YUFDbEIsSUFBSSxDQUNILEdBQUcsRUFBRTtZQUNILElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLENBQUMsRUFDRCxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FDaEM7YUFDQSxLQUFLLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM1QyxDQUFDO3VHQXpOVSxxQkFBcUI7MkdBQXJCLHFCQUFxQjs7U0FBckIscUJBQXFCOzJGQUFyQixxQkFBcUI7a0JBRGpDLFVBQVU7OzBCQTBCTixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBwbGljYXRpb25SZWYsIEV2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBGb3JtaW9SZXNvdXJjZUNvbmZpZyB9IGZyb20gJy4vcmVzb3VyY2UuY29uZmlnJztcclxuaW1wb3J0IHsgRm9ybWlvUmVzb3VyY2VzIH0gZnJvbSAnLi9yZXNvdXJjZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IEZvcm1pb1Byb21pc2VTZXJ2aWNlIH0gZnJvbSAnQGZvcm1pby10bXQvYW5ndWxhcic7XHJcbmltcG9ydCB7IEZvcm1pb0FsZXJ0cyB9IGZyb20gJ0Bmb3JtaW8tdG10L2FuZ3VsYXInO1xyXG5pbXBvcnQgeyBGb3JtaW9BcHBDb25maWcgfSBmcm9tICdAZm9ybWlvLXRtdC9hbmd1bGFyJztcclxuaW1wb3J0IHsgRm9ybWlvUmVmcmVzaFZhbHVlIH0gZnJvbSAnQGZvcm1pby10bXQvYW5ndWxhcic7XHJcbmltcG9ydCBQcm9taXNlIGZyb20gJ25hdGl2ZS1wcm9taXNlLW9ubHknO1xyXG5pbXBvcnQgeyBGb3JtaW8sIFV0aWxzIH0gZnJvbSAnQGZvcm1pby10bXQvanMnO1xyXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgRm9ybWlvUmVzb3VyY2VTZXJ2aWNlIHtcclxuICBwdWJsaWMgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICBwdWJsaWMgZm9ybTogYW55O1xyXG4gIHB1YmxpYyBhbGVydHM6IEZvcm1pb0FsZXJ0cztcclxuICBwdWJsaWMgcmVzb3VyY2U6IGFueTtcclxuICBwdWJsaWMgcmVzb3VyY2VVcmw/OiBzdHJpbmc7XHJcbiAgcHVibGljIGZvcm1Vcmw6IHN0cmluZztcclxuICBwdWJsaWMgZm9ybUZvcm1pbzogRm9ybWlvUHJvbWlzZVNlcnZpY2U7XHJcbiAgcHVibGljIGZvcm1pbzogRm9ybWlvUHJvbWlzZVNlcnZpY2U7XHJcbiAgcHVibGljIHJlZnJlc2g6IEV2ZW50RW1pdHRlcjxGb3JtaW9SZWZyZXNoVmFsdWU+O1xyXG5cclxuICBwdWJsaWMgcmVzb3VyY2VMb2FkaW5nPzogUHJvbWlzZTxhbnk+O1xyXG4gIHB1YmxpYyByZXNvdXJjZUxvYWRlZD86IFByb21pc2U8YW55PjtcclxuICBwdWJsaWMgcmVzb3VyY2VJZD86IHN0cmluZztcclxuICBwdWJsaWMgcmVzb3VyY2VzOiBhbnk7XHJcblxyXG4gIHB1YmxpYyBmb3JtTG9hZGluZz86IFByb21pc2U8YW55PjtcclxuICBwdWJsaWMgZm9ybUxvYWRlZDogUHJvbWlzZTxhbnk+O1xyXG4gIHB1YmxpYyBmb3JtUmVzb2x2ZTogYW55O1xyXG4gIHB1YmxpYyBmb3JtUmVqZWN0OiBhbnk7XHJcbiAgcHVibGljIGlzTG9hZGluZzogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgYXBwQ29uZmlnOiBGb3JtaW9BcHBDb25maWcsXHJcbiAgICBwdWJsaWMgY29uZmlnOiBGb3JtaW9SZXNvdXJjZUNvbmZpZyxcclxuICAgIEBPcHRpb25hbCgpIHB1YmxpYyByZXNvdXJjZXNTZXJ2aWNlOiBGb3JtaW9SZXNvdXJjZXMsXHJcbiAgICBwdWJsaWMgYXBwUmVmOiBBcHBsaWNhdGlvblJlZixcclxuICApIHtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuYWxlcnRzID0gbmV3IEZvcm1pb0FsZXJ0cygpO1xyXG4gICAgdGhpcy5yZWZyZXNoID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5mb3JtTG9hZGVkID0gbmV3IFByb21pc2UoKHJlc29sdmU6IGFueSwgcmVqZWN0OiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5mb3JtUmVzb2x2ZSA9IHJlc29sdmU7XHJcbiAgICAgIHRoaXMuZm9ybVJlamVjdCA9IHJlamVjdDtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5pbml0KCk7XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplKCkge1xyXG4gICAgY29uc29sZS53YXJuKCdGb3JtaW9SZXNvdXJjZVNlcnZpY2UuaW5pdGlhbGl6ZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuJyk7XHJcbiAgfVxyXG5cclxuICBpbml0KCkge1xyXG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5hcHBDb25maWcgJiYgdGhpcy5hcHBDb25maWcuYXBwVXJsKSB7XHJcbiAgICAgIEZvcm1pby5zZXRCYXNlVXJsKHRoaXMuYXBwQ29uZmlnLmFwaVVybCk7XHJcbiAgICAgIEZvcm1pby5zZXRQcm9qZWN0VXJsKHRoaXMuYXBwQ29uZmlnLmFwcFVybCk7XHJcbiAgICAgIEZvcm1pby5mb3JtT25seSA9IHRoaXMuYXBwQ29uZmlnLmZvcm1Pbmx5O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcignWW91IG11c3QgcHJvdmlkZSBhbiBBcHBDb25maWcgd2l0aGluIHlvdXIgYXBwbGljYXRpb24hJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ3JlYXRlIHRoZSBmb3JtIHVybCBhbmQgbG9hZCB0aGUgcmVzb3VyY2VzLlxyXG4gICAgdGhpcy5mb3JtVXJsID0gdGhpcy5hcHBDb25maWcuYXBwVXJsICsgJy8nICsgdGhpcy5jb25maWcuZm9ybTtcclxuICAgIHRoaXMucmVzb3VyY2UgPSB7IGRhdGE6IHt9IH07XHJcblxyXG4gICAgLy8gQWRkIHRoaXMgcmVzb3VyY2Ugc2VydmljZSB0byB0aGUgbGlzdCBvZiBhbGwgcmVzb3VyY2VzIGluIGNvbnRleHQuXHJcbiAgICBpZiAodGhpcy5yZXNvdXJjZXNTZXJ2aWNlKSB7XHJcbiAgICAgIHRoaXMucmVzb3VyY2VzID0gdGhpcy5yZXNvdXJjZXNTZXJ2aWNlLnJlc291cmNlcztcclxuICAgICAgdGhpcy5yZXNvdXJjZXNbdGhpcy5jb25maWcubmFtZV0gPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmxvYWRGb3JtKCk7XHJcbiAgfVxyXG5cclxuICBvbkVycm9yKGVycm9yOiBhbnkpIHtcclxuICAgIHRoaXMuYWxlcnRzLnNldEFsZXJ0KHtcclxuICAgICAgdHlwZTogJ2RhbmdlcicsXHJcbiAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfHwgZXJyb3JcclxuICAgIH0pO1xyXG4gICAgaWYgKHRoaXMucmVzb3VyY2VzU2VydmljZSkge1xyXG4gICAgICB0aGlzLnJlc291cmNlc1NlcnZpY2UuZXJyb3IuZW1pdChlcnJvcik7XHJcbiAgICB9XHJcbiAgICB0aHJvdyBlcnJvcjtcclxuICB9XHJcblxyXG4gIG9uRm9ybUVycm9yKGVycjogYW55KSB7XHJcbiAgICB0aGlzLmZvcm1SZWplY3QoZXJyKTtcclxuICAgIHRoaXMub25FcnJvcihlcnIpO1xyXG4gIH1cclxuXHJcbiAgc2V0Q29udGV4dChyb3V0ZTogQWN0aXZhdGVkUm91dGUpIHtcclxuICAgIHRoaXMucmVzb3VyY2VJZCA9IHJvdXRlLnNuYXBzaG90LnBhcmFtc1snaWQnXTtcclxuICAgIHRoaXMucmVzb3VyY2UgPSB7IGRhdGE6IHt9IH07XHJcbiAgICB0aGlzLnJlc291cmNlVXJsID0gdGhpcy5hcHBDb25maWcuYXBwVXJsICsgJy8nICsgdGhpcy5jb25maWcuZm9ybTtcclxuICAgIGlmICh0aGlzLnJlc291cmNlSWQpIHtcclxuICAgICAgdGhpcy5yZXNvdXJjZVVybCArPSAnL3N1Ym1pc3Npb24vJyArIHRoaXMucmVzb3VyY2VJZDtcclxuICAgIH1cclxuICAgIHRoaXMuZm9ybWlvID0gbmV3IEZvcm1pb1Byb21pc2VTZXJ2aWNlKHRoaXMucmVzb3VyY2VVcmwpO1xyXG4gICAgaWYgKHRoaXMucmVzb3VyY2VzU2VydmljZSkge1xyXG4gICAgICB0aGlzLnJlc291cmNlc1t0aGlzLmNvbmZpZy5uYW1lXSA9IHRoaXM7XHJcbiAgICB9XHJcbiAgICB0aGlzLmxvYWRQYXJlbnRzKCk7XHJcbiAgfVxyXG5cclxuICBsb2FkRm9ybSgpIHtcclxuICAgIHRoaXMuZm9ybUZvcm1pbyA9IG5ldyBGb3JtaW9Qcm9taXNlU2VydmljZSh0aGlzLmZvcm1VcmwpO1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5mb3JtTG9hZGluZyA9IHRoaXMuZm9ybUZvcm1pb1xyXG4gICAgICAubG9hZEZvcm0oKVxyXG4gICAgICAudGhlbihcclxuICAgICAgICAoZm9ybTogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmZvcm0gPSBmb3JtO1xyXG4gICAgICAgICAgdGhpcy5mb3JtUmVzb2x2ZShmb3JtKTtcclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmxvYWRQYXJlbnRzKCk7XHJcbiAgICAgICAgICByZXR1cm4gZm9ybTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIChlcnI6IGFueSkgPT4gdGhpcy5vbkZvcm1FcnJvcihlcnIpXHJcbiAgICAgIClcclxuICAgICAgLmNhdGNoKChlcnI6IGFueSkgPT4gdGhpcy5vbkZvcm1FcnJvcihlcnIpKTtcclxuICAgIHJldHVybiB0aGlzLmZvcm1Mb2FkaW5nO1xyXG4gIH1cclxuXHJcbiAgbG9hZFBhcmVudHMoKSB7XHJcbiAgICBpZiAoIXRoaXMuY29uZmlnLnBhcmVudHMgfHwgIXRoaXMuY29uZmlnLnBhcmVudHMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnJlc291cmNlc1NlcnZpY2UpIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgICdZb3UgbXVzdCBwcm92aWRlIHRoZSBGb3JtaW9SZXNvdXJjZXMgd2l0aGluIHlvdXIgYXBwbGljYXRpb24gdG8gdXNlIG5lc3RlZCByZXNvdXJjZXMuJ1xyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmZvcm1Mb2FkaW5nLnRoZW4oKGZvcm0pID0+IHtcclxuICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBsaXN0IG9mIHBhcmVudHMuXHJcbiAgICAgIGNvbnN0IF9wYXJlbnRzTG9hZGVkOiBBcnJheTxQcm9taXNlPGFueT4+ID0gW107XHJcbiAgICAgIHRoaXMuY29uZmlnLnBhcmVudHMuZm9yRWFjaCgocGFyZW50OiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCByZXNvdXJjZU5hbWUgPSBwYXJlbnQucmVzb3VyY2UgfHwgcGFyZW50O1xyXG4gICAgICAgIGNvbnN0IHJlc291cmNlRmllbGQgPSBwYXJlbnQuZmllbGQgfHwgcGFyZW50O1xyXG4gICAgICAgIGNvbnN0IGZpbHRlclJlc291cmNlID0gcGFyZW50Lmhhc093blByb3BlcnR5KCdmaWx0ZXInKSA/IHBhcmVudC5maWx0ZXIgOiB0cnVlO1xyXG4gICAgICAgIGlmICh0aGlzLnJlc291cmNlcy5oYXNPd25Qcm9wZXJ0eShyZXNvdXJjZU5hbWUpICYmIHRoaXMucmVzb3VyY2VzW3Jlc291cmNlTmFtZV0ucmVzb3VyY2VMb2FkZWQpIHtcclxuICAgICAgICAgIF9wYXJlbnRzTG9hZGVkLnB1c2goXHJcbiAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzW3Jlc291cmNlTmFtZV0ucmVzb3VyY2VMb2FkZWQudGhlbigocmVzb3VyY2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGxldCBwYXJlbnRQYXRoID0gJyc7XHJcbiAgICAgICAgICAgICAgVXRpbHMuZWFjaENvbXBvbmVudChmb3JtLmNvbXBvbmVudHMsIChjb21wb25lbnQsIHBhdGgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQua2V5ID09PSByZXNvdXJjZUZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5oaWRkZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICBjb21wb25lbnQuY2xlYXJPbkhpZGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgXy5zZXQodGhpcy5yZXNvdXJjZS5kYXRhLCBwYXRoLCByZXNvdXJjZSk7XHJcbiAgICAgICAgICAgICAgICAgIHBhcmVudFBhdGggPSBwYXRoO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogcGFyZW50UGF0aCxcclxuICAgICAgICAgICAgICAgIGZpbHRlcjogZmlsdGVyUmVzb3VyY2UsXHJcbiAgICAgICAgICAgICAgICByZXNvdXJjZVxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBXaGVuIGFsbCB0aGUgcGFyZW50cyBoYXZlIGxvYWRlZCwgZW1pdCB0aGF0IHRvIHRoZSBvblBhcmVudHMgZW1pdHRlci5cclxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKF9wYXJlbnRzTG9hZGVkKS50aGVuKChwYXJlbnRzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnJlZnJlc2guZW1pdCh7XHJcbiAgICAgICAgICBmb3JtOiBmb3JtLFxyXG4gICAgICAgICAgc3VibWlzc2lvbjogdGhpcy5yZXNvdXJjZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBwYXJlbnRzO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25TdWJtaXNzaW9uRXJyb3IoZXJyOiBhbnkpIHtcclxuICAgIHRoaXMub25FcnJvcihlcnIpO1xyXG4gIH1cclxuXHJcbiAgbG9hZFJlc291cmNlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSkge1xyXG4gICAgdGhpcy5zZXRDb250ZXh0KHJvdXRlKTtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMucmVzb3VyY2VMb2FkaW5nID0gdGhpcy5yZXNvdXJjZUxvYWRlZCA9IHRoaXMuZm9ybWlvXHJcbiAgICAgIC5sb2FkU3VibWlzc2lvbihudWxsLCB7aWdub3JlQ2FjaGU6IHRydWV9KVxyXG4gICAgICAudGhlbihcclxuICAgICAgICAocmVzb3VyY2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlO1xyXG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMucmVmcmVzaC5lbWl0KHtcclxuICAgICAgICAgICAgcHJvcGVydHk6ICdzdWJtaXNzaW9uJyxcclxuICAgICAgICAgICAgdmFsdWU6IHRoaXMucmVzb3VyY2VcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgcmV0dXJuIHJlc291cmNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKGVycjogYW55KSA9PiB0aGlzLm9uU3VibWlzc2lvbkVycm9yKGVycilcclxuICAgICAgKVxyXG4gICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB0aGlzLm9uU3VibWlzc2lvbkVycm9yKGVycikpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VMb2FkaW5nO1xyXG4gIH1cclxuXHJcbiAgc2F2ZShyZXNvdXJjZTogYW55KSB7XHJcbiAgICBjb25zdCBmb3JtaW8gPSByZXNvdXJjZS5faWQgPyB0aGlzLmZvcm1pbyA6IHRoaXMuZm9ybUZvcm1pbztcclxuICAgIHJldHVybiBmb3JtaW9cclxuICAgICAgLnNhdmVTdWJtaXNzaW9uKHJlc291cmNlKVxyXG4gICAgICAudGhlbihcclxuICAgICAgICAoc2F2ZWQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHNhdmVkO1xyXG4gICAgICAgICAgcmV0dXJuIHNhdmVkO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKGVycjogYW55KSA9PiB0aGlzLm9uRXJyb3IoZXJyKVxyXG4gICAgICApXHJcbiAgICAgIC5jYXRjaCgoZXJyOiBhbnkpID0+IHRoaXMub25FcnJvcihlcnIpKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1pb1xyXG4gICAgICAuZGVsZXRlU3VibWlzc2lvbigpXHJcbiAgICAgIC50aGVuKFxyXG4gICAgICAgICgpID0+IHtcclxuICAgICAgICAgIHRoaXMucmVzb3VyY2UgPSBudWxsO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKGVycjogYW55KSA9PiB0aGlzLm9uRXJyb3IoZXJyKVxyXG4gICAgICApXHJcbiAgICAgIC5jYXRjaCgoZXJyOiBhbnkpID0+IHRoaXMub25FcnJvcihlcnIpKTtcclxuICB9XHJcbn1cclxuIl19