angular-dynamic-forms-lite
Version:
Efficient dynamic and customizable Angular 7+ forms.
131 lines • 14.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable, ComponentFactoryResolver, Injector, Inject, Optional } from "@angular/core";
import { FormBuilder } from "@angular/forms";
import { ParentFieldFactory } from "../form-field/field-factory";
import { GroupFieldFactory } from "../form-field/group/group-field-factory";
import { ArrayFieldFactory } from "../form-field/array/array-field-factory";
import { SingleFieldFactory } from "../form-field/single/single-field-factory";
import { createFormFieldSettings, ROOT_ID, ensureDefaultFormComponents } from "../form-settings/form-field-settings";
import { DEFAULT_FORM_COMPONENTS, DynamicFormType } from "../form-field/form-field-type";
import { InlineFormFactory } from "./inline/inline-form-factory";
import { HiddenFieldFactory } from "../form-field/hidden/hidden-field-factory";
import * as i0 from "@angular/core";
import * as i1 from "../form-field/form-field-type";
/**
* A service for creating and rendering dynamic forms. For usage informations refer to
* https://github.com/tom-schoener/angular-dynamic-forms-lite
*/
export class DynamicFormsLiteService {
/**
* @param {?} componentFactoryResolver
* @param {?} injector
* @param {?=} defaultFormComponents
*/
constructor(componentFactoryResolver, injector, defaultFormComponents) {
this.componentFactoryResolver = componentFactoryResolver;
this.injector = injector;
this.defaultFormComponents = defaultFormComponents;
}
/**
* Creates a form context from a seperated model and form settings. This is useful for advanced
* forms, where the model is fetched from a server.
*
* @template M
* @param {?} formModel form model
* @param {?} formFieldSettings settings for the form model
* @param {?=} rootSetting settings for the root of the form
* @return {?}
*/
create(formModel, formFieldSettings, rootSetting = this.createRootSetting()) {
/** @type {?} */
const settings = createFormFieldSettings(rootSetting, formFieldSettings, this.defaultFormComponents);
return (/** @type {?} */ (this.createParentFieldFactory(settings).create({
initialValue: formModel,
setting: settings.get(ROOT_ID),
settings
})));
}
/**
* Creates a dynamic form context which can be used to render a form. This is useful for simple forms, where
* the model is basically empty. For an advanced usecase with a seperate model and form settings see 'create'.
*
* @param {?} inlineForm form, where the model and settings are combined
* @param {?=} rootSetting settings for the root of the form
* @return {?}
*/
createInline(inlineForm, rootSetting = this.createRootSetting()) {
/** @type {?} */
const inlineFormFactory = new InlineFormFactory(this.defaultFormComponents);
/** @type {?} */
const settings = inlineFormFactory.resolveSettings(inlineForm);
/** @type {?} */
const formModel = inlineFormFactory.resolveModel(inlineForm);
return this.create(formModel, settings, rootSetting);
}
/**
* Renders the form at the specified form root recursively.
*
* @param {?} formRoot root element (directive) to insert the form into
* @param {?} formContext form context
* @return {?}
*/
render(formRoot, formContext) {
this.createParentFieldFactory(formContext.settings).render(formRoot, formContext);
}
/**
* @private
* @return {?}
*/
createRootSetting() {
return {
component: (/** @type {?} */ (ensureDefaultFormComponents(this.defaultFormComponents, "root", DynamicFormType.GROUP))),
metadata: null
};
}
/**
* @private
* @param {?} settings
* @return {?}
*/
createParentFieldFactory(settings) {
return new ParentFieldFactory({
[DynamicFormType.GROUP]: GroupFieldFactory,
[DynamicFormType.ARRAY]: ArrayFieldFactory,
[DynamicFormType.SINGLE]: SingleFieldFactory,
[DynamicFormType.HIDDEN]: HiddenFieldFactory
}, this.componentFactoryResolver, this.injector, new FormBuilder(), settings);
}
}
DynamicFormsLiteService.decorators = [
{ type: Injectable, args: [{
providedIn: "root"
},] }
];
/** @nocollapse */
DynamicFormsLiteService.ctorParameters = () => [
{ type: ComponentFactoryResolver },
{ type: Injector },
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DEFAULT_FORM_COMPONENTS,] }] }
];
/** @nocollapse */ DynamicFormsLiteService.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function DynamicFormsLiteService_Factory() { return new DynamicFormsLiteService(i0.ɵɵinject(i0.ComponentFactoryResolver), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(i1.DEFAULT_FORM_COMPONENTS, 8)); }, token: DynamicFormsLiteService, providedIn: "root" });
if (false) {
/**
* @type {?}
* @private
*/
DynamicFormsLiteService.prototype.componentFactoryResolver;
/**
* @type {?}
* @private
*/
DynamicFormsLiteService.prototype.injector;
/**
* @type {?}
* @private
*/
DynamicFormsLiteService.prototype.defaultFormComponents;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3Jtcy1saXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLWR5bmFtaWMtZm9ybXMtbGl0ZS8iLCJzb3VyY2VzIjpbImxpYi9mb3JtL2R5bmFtaWMtZm9ybXMtbGl0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLHdCQUF3QixFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQVEsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZHLE9BQU8sRUFBYSxXQUFXLEVBQThCLE1BQU0sZ0JBQWdCLENBQUM7QUFLcEYsT0FBTyxFQUFnQixrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBRS9FLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsT0FBTyxFQUNQLDJCQUEyQixFQUM1QixNQUFNLHNDQUFzQyxDQUFDO0FBQzlDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxlQUFlLEVBQXdCLE1BQU0sK0JBQStCLENBQUM7QUFFL0csT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7Ozs7Ozs7QUFTL0UsTUFBTSxPQUFPLHVCQUF1Qjs7Ozs7O0lBQ2xDLFlBQ1Usd0JBQWtELEVBQ2xELFFBQWtCLEVBR2xCLHFCQUE0QztRQUo1Qyw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBQ2xELGFBQVEsR0FBUixRQUFRLENBQVU7UUFHbEIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtJQUNuRCxDQUFDOzs7Ozs7Ozs7OztJQVVHLE1BQU0sQ0FDWCxTQUFvQixFQUNwQixpQkFBb0MsRUFDcEMsY0FBMkIsSUFBSSxDQUFDLGlCQUFpQixFQUFFOztjQUU3QyxRQUFRLEdBQUcsdUJBQXVCLENBQUMsV0FBVyxFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztRQUVwRyxPQUFPLG1CQUFBLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUk7WUFDdkQsWUFBWSxFQUFFLFNBQVM7WUFDdkIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO1lBQzlCLFFBQVE7U0FDVCxDQUFDLEVBQTZCLENBQUM7SUFDbEMsQ0FBQzs7Ozs7Ozs7O0lBU00sWUFBWSxDQUNqQixVQUFzQixFQUN0QixjQUEyQixJQUFJLENBQUMsaUJBQWlCLEVBQUU7O2NBRTdDLGlCQUFpQixHQUFzQixJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQzs7Y0FDeEYsUUFBUSxHQUFzQixpQkFBaUIsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDOztjQUMzRSxTQUFTLEdBQWMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQztRQUV2RSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN2RCxDQUFDOzs7Ozs7OztJQVFNLE1BQU0sQ0FBQyxRQUEyQixFQUFFLFdBQW9EO1FBQzdGLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNwRixDQUFDOzs7OztJQUVPLGlCQUFpQjtRQUN2QixPQUFPO1lBQ0wsU0FBUyxFQUFFLG1CQUFBLDJCQUEyQixDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUVoRztZQUNELFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQztJQUNKLENBQUM7Ozs7OztJQUVPLHdCQUF3QixDQUFDLFFBQTJCO1FBQzFELE9BQU8sSUFBSSxrQkFBa0IsQ0FDM0I7WUFDRSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxpQkFBaUI7WUFDMUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUUsaUJBQWlCO1lBQzFDLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLGtCQUFrQjtZQUM1QyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxrQkFBa0I7U0FDN0MsRUFDRCxJQUFJLENBQUMsd0JBQXdCLEVBQzdCLElBQUksQ0FBQyxRQUFRLEVBQ2IsSUFBSSxXQUFXLEVBQUUsRUFDakIsUUFBUSxDQUNULENBQUM7SUFDSixDQUFDOzs7WUFwRkYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7O1lBNUJvQix3QkFBd0I7WUFBRSxRQUFROzRDQWlDbEQsUUFBUSxZQUNSLE1BQU0sU0FBQyx1QkFBdUI7Ozs7Ozs7O0lBSC9CLDJEQUEwRDs7Ozs7SUFDMUQsMkNBQTBCOzs7OztJQUMxQix3REFFb0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIEluamVjdG9yLCBJbmplY3QsIFR5cGUsIE9wdGlvbmFsIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIsIEFic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5IH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBGb3JtRmllbGRTZXR0aW5nLCBSb290U2V0dGluZyB9IGZyb20gXCIuLi9mb3JtLXNldHRpbmdzL2Zvcm0tZmllbGQtc2V0dGluZ1wiO1xuaW1wb3J0IHsgRm9ybU1vZGVsIH0gZnJvbSBcIi4vZm9ybS1tb2RlbFwiO1xuaW1wb3J0IHsgRm9ybUNvbnRleHQgfSBmcm9tIFwiLi9mb3JtLWNvbnRleHRcIjtcbmltcG9ydCB7IEZvcm1Sb290RGlyZWN0aXZlIH0gZnJvbSBcIi4vZm9ybS1yb290LmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgRmllbGRGYWN0b3J5LCBQYXJlbnRGaWVsZEZhY3RvcnkgfSBmcm9tIFwiLi4vZm9ybS1maWVsZC9maWVsZC1mYWN0b3J5XCI7XG5pbXBvcnQgeyBHcm91cEZpZWxkRmFjdG9yeSB9IGZyb20gXCIuLi9mb3JtLWZpZWxkL2dyb3VwL2dyb3VwLWZpZWxkLWZhY3RvcnlcIjtcbmltcG9ydCB7IEFycmF5RmllbGRGYWN0b3J5IH0gZnJvbSBcIi4uL2Zvcm0tZmllbGQvYXJyYXkvYXJyYXktZmllbGQtZmFjdG9yeVwiO1xuaW1wb3J0IHsgU2luZ2xlRmllbGRGYWN0b3J5IH0gZnJvbSBcIi4uL2Zvcm0tZmllbGQvc2luZ2xlL3NpbmdsZS1maWVsZC1mYWN0b3J5XCI7XG5pbXBvcnQgeyBJbmxpbmVGb3JtIH0gZnJvbSBcIi4vaW5saW5lL2lubGluZS1mb3JtXCI7XG5pbXBvcnQge1xuICBjcmVhdGVGb3JtRmllbGRTZXR0aW5ncyxcbiAgRm9ybUZpZWxkU2V0dGluZ3MsXG4gIFJPT1RfSUQsXG4gIGVuc3VyZURlZmF1bHRGb3JtQ29tcG9uZW50c1xufSBmcm9tIFwiLi4vZm9ybS1zZXR0aW5ncy9mb3JtLWZpZWxkLXNldHRpbmdzXCI7XG5pbXBvcnQgeyBERUZBVUxUX0ZPUk1fQ09NUE9ORU5UUywgRHluYW1pY0Zvcm1UeXBlLCBGb3JtQ29tcG9uZW50c0J5VHlwZSB9IGZyb20gXCIuLi9mb3JtLWZpZWxkL2Zvcm0tZmllbGQtdHlwZVwiO1xuaW1wb3J0IHsgRm9ybUZpZWxkR3JvdXBDb21wb25lbnQgfSBmcm9tIFwiLi4vZm9ybS1maWVsZC9ncm91cC9mb3JtLWZpZWxkLWdyb3VwLWNvbXBvbmVudFwiO1xuaW1wb3J0IHsgSW5saW5lRm9ybUZhY3RvcnkgfSBmcm9tIFwiLi9pbmxpbmUvaW5saW5lLWZvcm0tZmFjdG9yeVwiO1xuaW1wb3J0IHsgSGlkZGVuRmllbGRGYWN0b3J5IH0gZnJvbSBcIi4uL2Zvcm0tZmllbGQvaGlkZGVuL2hpZGRlbi1maWVsZC1mYWN0b3J5XCI7XG5cbi8qKlxuICogQSBzZXJ2aWNlIGZvciBjcmVhdGluZyBhbmQgcmVuZGVyaW5nIGR5bmFtaWMgZm9ybXMuIEZvciB1c2FnZSBpbmZvcm1hdGlvbnMgcmVmZXIgdG9cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS90b20tc2Nob2VuZXIvYW5ndWxhci1keW5hbWljLWZvcm1zLWxpdGVcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiBcInJvb3RcIlxufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljRm9ybXNMaXRlU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KERFRkFVTFRfRk9STV9DT01QT05FTlRTKVxuICAgIHByaXZhdGUgZGVmYXVsdEZvcm1Db21wb25lbnRzPzogRm9ybUNvbXBvbmVudHNCeVR5cGVcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZm9ybSBjb250ZXh0IGZyb20gYSBzZXBlcmF0ZWQgbW9kZWwgYW5kIGZvcm0gc2V0dGluZ3MuIFRoaXMgaXMgdXNlZnVsIGZvciBhZHZhbmNlZFxuICAgKiBmb3Jtcywgd2hlcmUgdGhlIG1vZGVsIGlzIGZldGNoZWQgZnJvbSBhIHNlcnZlci5cbiAgICpcbiAgICogQHBhcmFtIGZvcm1Nb2RlbCBmb3JtIG1vZGVsXG4gICAqIEBwYXJhbSBmb3JtRmllbGRTZXR0aW5ncyBzZXR0aW5ncyBmb3IgdGhlIGZvcm0gbW9kZWxcbiAgICogQHBhcmFtIHJvb3RTZXR0aW5nIHNldHRpbmdzIGZvciB0aGUgcm9vdCBvZiB0aGUgZm9ybVxuICAgKi9cbiAgcHVibGljIGNyZWF0ZTxNID0gYW55PihcbiAgICBmb3JtTW9kZWw6IEZvcm1Nb2RlbCxcbiAgICBmb3JtRmllbGRTZXR0aW5nczogRm9ybUZpZWxkU2V0dGluZ3MsXG4gICAgcm9vdFNldHRpbmc6IFJvb3RTZXR0aW5nID0gdGhpcy5jcmVhdGVSb290U2V0dGluZygpXG4gICk6IEZvcm1Db250ZXh0PE0sIEZvcm1Hcm91cD4ge1xuICAgIGNvbnN0IHNldHRpbmdzID0gY3JlYXRlRm9ybUZpZWxkU2V0dGluZ3Mocm9vdFNldHRpbmcsIGZvcm1GaWVsZFNldHRpbmdzLCB0aGlzLmRlZmF1bHRGb3JtQ29tcG9uZW50cyk7XG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJlbnRGaWVsZEZhY3Rvcnkoc2V0dGluZ3MpLmNyZWF0ZTxNPih7XG4gICAgICBpbml0aWFsVmFsdWU6IGZvcm1Nb2RlbCxcbiAgICAgIHNldHRpbmc6IHNldHRpbmdzLmdldChST09UX0lEKSxcbiAgICAgIHNldHRpbmdzXG4gICAgfSkgYXMgRm9ybUNvbnRleHQ8TSwgRm9ybUdyb3VwPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZHluYW1pYyBmb3JtIGNvbnRleHQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVuZGVyIGEgZm9ybS4gVGhpcyBpcyB1c2VmdWwgZm9yIHNpbXBsZSBmb3Jtcywgd2hlcmVcbiAgICogdGhlIG1vZGVsIGlzIGJhc2ljYWxseSBlbXB0eS4gRm9yIGFuIGFkdmFuY2VkIHVzZWNhc2Ugd2l0aCBhIHNlcGVyYXRlIG1vZGVsIGFuZCBmb3JtIHNldHRpbmdzIHNlZSAnY3JlYXRlJy5cbiAgICpcbiAgICogQHBhcmFtIGlubGluZUZvcm0gZm9ybSwgd2hlcmUgdGhlIG1vZGVsIGFuZCBzZXR0aW5ncyBhcmUgY29tYmluZWRcbiAgICogQHBhcmFtIHJvb3RTZXR0aW5nIHNldHRpbmdzIGZvciB0aGUgcm9vdCBvZiB0aGUgZm9ybVxuICAgKi9cbiAgcHVibGljIGNyZWF0ZUlubGluZShcbiAgICBpbmxpbmVGb3JtOiBJbmxpbmVGb3JtLFxuICAgIHJvb3RTZXR0aW5nOiBSb290U2V0dGluZyA9IHRoaXMuY3JlYXRlUm9vdFNldHRpbmcoKVxuICApOiBGb3JtQ29udGV4dDxhbnksIEZvcm1Hcm91cD4ge1xuICAgIGNvbnN0IGlubGluZUZvcm1GYWN0b3J5OiBJbmxpbmVGb3JtRmFjdG9yeSA9IG5ldyBJbmxpbmVGb3JtRmFjdG9yeSh0aGlzLmRlZmF1bHRGb3JtQ29tcG9uZW50cyk7XG4gICAgY29uc3Qgc2V0dGluZ3M6IEZvcm1GaWVsZFNldHRpbmdzID0gaW5saW5lRm9ybUZhY3RvcnkucmVzb2x2ZVNldHRpbmdzKGlubGluZUZvcm0pO1xuICAgIGNvbnN0IGZvcm1Nb2RlbDogRm9ybU1vZGVsID0gaW5saW5lRm9ybUZhY3RvcnkucmVzb2x2ZU1vZGVsKGlubGluZUZvcm0pO1xuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKGZvcm1Nb2RlbCwgc2V0dGluZ3MsIHJvb3RTZXR0aW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBmb3JtIGF0IHRoZSBzcGVjaWZpZWQgZm9ybSByb290IHJlY3Vyc2l2ZWx5LlxuICAgKlxuICAgKiBAcGFyYW0gZm9ybVJvb3Qgcm9vdCBlbGVtZW50IChkaXJlY3RpdmUpIHRvIGluc2VydCB0aGUgZm9ybSBpbnRvXG4gICAqIEBwYXJhbSBmb3JtQ29udGV4dCBmb3JtIGNvbnRleHRcbiAgICovXG4gIHB1YmxpYyByZW5kZXIoZm9ybVJvb3Q6IEZvcm1Sb290RGlyZWN0aXZlLCBmb3JtQ29udGV4dDogRm9ybUNvbnRleHQ8YW55LCBGb3JtR3JvdXAgfCBGb3JtQXJyYXk+KTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVQYXJlbnRGaWVsZEZhY3RvcnkoZm9ybUNvbnRleHQuc2V0dGluZ3MpLnJlbmRlcihmb3JtUm9vdCwgZm9ybUNvbnRleHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVSb290U2V0dGluZygpOiBSb290U2V0dGluZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXBvbmVudDogZW5zdXJlRGVmYXVsdEZvcm1Db21wb25lbnRzKHRoaXMuZGVmYXVsdEZvcm1Db21wb25lbnRzLCBcInJvb3RcIiwgRHluYW1pY0Zvcm1UeXBlLkdST1VQKSBhcyBUeXBlPFxuICAgICAgICBGb3JtRmllbGRHcm91cENvbXBvbmVudFxuICAgICAgPixcbiAgICAgIG1ldGFkYXRhOiBudWxsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUGFyZW50RmllbGRGYWN0b3J5KHNldHRpbmdzOiBGb3JtRmllbGRTZXR0aW5ncyk6IEZpZWxkRmFjdG9yeTxBYnN0cmFjdENvbnRyb2wsIEZvcm1GaWVsZFNldHRpbmc8YW55Pj4ge1xuICAgIHJldHVybiBuZXcgUGFyZW50RmllbGRGYWN0b3J5KFxuICAgICAge1xuICAgICAgICBbRHluYW1pY0Zvcm1UeXBlLkdST1VQXTogR3JvdXBGaWVsZEZhY3RvcnksXG4gICAgICAgIFtEeW5hbWljRm9ybVR5cGUuQVJSQVldOiBBcnJheUZpZWxkRmFjdG9yeSxcbiAgICAgICAgW0R5bmFtaWNGb3JtVHlwZS5TSU5HTEVdOiBTaW5nbGVGaWVsZEZhY3RvcnksXG4gICAgICAgIFtEeW5hbWljRm9ybVR5cGUuSElEREVOXTogSGlkZGVuRmllbGRGYWN0b3J5XG4gICAgICB9LFxuICAgICAgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICB0aGlzLmluamVjdG9yLFxuICAgICAgbmV3IEZvcm1CdWlsZGVyKCksXG4gICAgICBzZXR0aW5nc1xuICAgICk7XG4gIH1cbn1cbiJdfQ==