@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
JavaScript
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