@seniorsistemas/angular-components 18.0.4 → 18.1.0-feature-sds-276-640ecaac

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/esm2022/form-dynamic/components/form-dynamic/form-dynamic.component.mjs +53 -0
  2. package/esm2022/form-dynamic/core/registry.mjs +10 -0
  3. package/esm2022/form-dynamic/fields-basic/boolean-field/boolean-field.component.mjs +15 -0
  4. package/esm2022/form-dynamic/fields-basic/string-field/string-field.component.mjs +15 -0
  5. package/esm2022/form-dynamic/lib/optional-fields/editor/editor-field/editor-field.component.mjs +30 -0
  6. package/esm2022/form-dynamic/lib/optional-fields/editor/editor-types.mjs +3 -0
  7. package/esm2022/form-dynamic/lib/optional-fields/editor/public-api.mjs +8 -0
  8. package/esm2022/form-dynamic/lib/optional-fields/editor/seniorsistemas-angular-components-form-dynamic-lib-optional-fields-editor.mjs +5 -0
  9. package/esm2022/form-dynamic/public-api.mjs +10 -0
  10. package/esm2022/form-dynamic/schemas/field-dynamic.mjs +2 -0
  11. package/esm2022/form-dynamic/schemas/form-dynamic-schema.mjs +2 -0
  12. package/esm2022/form-dynamic/seniorsistemas-angular-components-form-dynamic.mjs +5 -0
  13. package/esm2022/numeric-mask/lib/numeric-mask/numeric-mask.directive.mjs +10 -14
  14. package/esm2022/pin-code-field/lib/pin-code-field/pin-code-field.component.mjs +460 -0
  15. package/esm2022/pin-code-field/lib/pin-code-field.module.mjs +16 -0
  16. package/esm2022/pin-code-field/public-api.mjs +3 -0
  17. package/esm2022/pin-code-field/seniorsistemas-angular-components-pin-code-field.mjs +5 -0
  18. package/fesm2022/seniorsistemas-angular-components-form-dynamic-lib-optional-fields-editor.mjs +44 -0
  19. package/fesm2022/seniorsistemas-angular-components-form-dynamic-lib-optional-fields-editor.mjs.map +1 -0
  20. package/fesm2022/seniorsistemas-angular-components-form-dynamic.mjs +94 -0
  21. package/fesm2022/seniorsistemas-angular-components-form-dynamic.mjs.map +1 -0
  22. package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs +9 -13
  23. package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs.map +1 -1
  24. package/fesm2022/seniorsistemas-angular-components-pin-code-field.mjs +480 -0
  25. package/fesm2022/seniorsistemas-angular-components-pin-code-field.mjs.map +1 -0
  26. package/form-dynamic/components/form-dynamic/form-dynamic.component.d.ts +15 -0
  27. package/form-dynamic/core/registry.d.ts +7 -0
  28. package/form-dynamic/fields-basic/boolean-field/boolean-field.component.d.ts +9 -0
  29. package/form-dynamic/fields-basic/string-field/string-field.component.d.ts +9 -0
  30. package/form-dynamic/index.d.ts +5 -0
  31. package/form-dynamic/lib/optional-fields/editor/editor-field/editor-field.component.d.ts +15 -0
  32. package/form-dynamic/lib/optional-fields/editor/editor-types.d.ts +13 -0
  33. package/form-dynamic/lib/optional-fields/editor/index.d.ts +5 -0
  34. package/form-dynamic/lib/optional-fields/editor/public-api.d.ts +2 -0
  35. package/form-dynamic/public-api.d.ts +4 -0
  36. package/form-dynamic/schemas/field-dynamic.d.ts +20 -0
  37. package/form-dynamic/schemas/form-dynamic-schema.d.ts +4 -0
  38. package/numeric-mask/README.md +182 -154
  39. package/numeric-mask/lib/numeric-mask/numeric-mask.directive.d.ts +2 -7
  40. package/package.json +32 -14
  41. package/pin-code-field/README.md +366 -0
  42. package/pin-code-field/index.d.ts +5 -0
  43. package/pin-code-field/lib/pin-code-field/pin-code-field.component.d.ts +284 -0
  44. package/pin-code-field/lib/pin-code-field.module.d.ts +7 -0
  45. package/pin-code-field/public-api.d.ts +2 -0
@@ -0,0 +1,53 @@
1
+ import { Component, effect, input, viewChildren, ViewContainerRef } from '@angular/core';
2
+ import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
3
+ import { FormDynamicRegistry } from '../../core/registry';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/forms";
6
+ export class FormDynamicComponent {
7
+ form = new FormGroup({});
8
+ schema = input.required();
9
+ // @ViewChildren('host', { read: ViewContainerRef })
10
+ // hosts!: QueryList<ViewContainerRef>;
11
+ hosts = viewChildren('host', { read: ViewContainerRef });
12
+ schemaEffect = effect(() => {
13
+ this.buildForm();
14
+ });
15
+ hostsEffect = effect(() => {
16
+ this.buildFields();
17
+ });
18
+ buildForm() {
19
+ const schema = this.schema();
20
+ if (!schema || !schema.fields)
21
+ return;
22
+ const group = {};
23
+ schema.fields.forEach((field) => {
24
+ group[field.key] = new FormControl(null);
25
+ });
26
+ this.form = new FormGroup(group);
27
+ }
28
+ buildFields() {
29
+ const hosts = this.hosts();
30
+ if (!hosts?.length)
31
+ return;
32
+ this.schema().fields.forEach((field, index) => {
33
+ const container = hosts[index];
34
+ container.clear();
35
+ const component = FormDynamicRegistry.resolveField(field.type);
36
+ if (!component)
37
+ return;
38
+ const ref = container.createComponent(component);
39
+ ref.setInput('field', field);
40
+ ref.setInput('control', this.form.get(field.key));
41
+ });
42
+ }
43
+ emit() {
44
+ console.log('FORM ->', this.form.value);
45
+ }
46
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormDynamicComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
47
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FormDynamicComponent, isStandalone: true, selector: "s-form-dynamic", inputs: { schema: { classPropertyName: "schema", publicName: "schema", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "hosts", predicate: ["host"], descendants: true, read: ViewContainerRef, isSignal: true }], ngImport: i0, template: "<form [formGroup]=\"form\">\n\n @for (field of schema().fields; track field.key; let i = $index) {\n <ng-container #host></ng-container>\n }\n\n <button type=\"submit\" (click)=\"emit()\">Enviar</button>\n </form>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] });
48
+ }
49
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormDynamicComponent, decorators: [{
50
+ type: Component,
51
+ args: [{ selector: 's-form-dynamic', standalone: true, imports: [ReactiveFormsModule], template: "<form [formGroup]=\"form\">\n\n @for (field of schema().fields; track field.key; let i = $index) {\n <ng-container #host></ng-container>\n }\n\n <button type=\"submit\" (click)=\"emit()\">Enviar</button>\n </form>\n" }]
52
+ }] });
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1keW5hbWljLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9mb3JtLWR5bmFtaWMvbGliL2NvbXBvbmVudHMvZm9ybS1keW5hbWljL2Zvcm0tZHluYW1pYy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZm9ybS1keW5hbWljL2xpYi9jb21wb25lbnRzL2Zvcm0tZHluYW1pYy9mb3JtLWR5bmFtaWMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RixPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7QUFTMUQsTUFBTSxPQUFPLG9CQUFvQjtJQUNuQixJQUFJLEdBQUcsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbkMsTUFBTSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQXFCLENBQUM7SUFFN0Msb0RBQW9EO0lBQ3BELHVDQUF1QztJQUV0QixLQUFLLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7SUFFekQsWUFBWSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUU7UUFDeEMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBRWMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUU7UUFDdkMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZCLENBQUMsQ0FBQyxDQUFDO0lBRUssU0FBUztRQUNiLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBRXRDLE1BQU0sS0FBSyxHQUFRLEVBQUUsQ0FBQztRQUV0QixNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzVCLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTyxXQUFXO1FBQ2YsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTTtZQUFFLE9BQU87UUFFM0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDMUMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9CLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUVsQixNQUFNLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxTQUFTO2dCQUFFLE9BQU87WUFFdkIsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUVqRCxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM3QixHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFFLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxJQUFJO1FBQ0EsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QyxDQUFDO3dHQWxEUSxvQkFBb0I7NEZBQXBCLG9CQUFvQiw2UUFPeUIsZ0JBQWdCLDZDQ2xCMUUsa1BBUUEsMkNEQWMsbUJBQW1COzs0RkFHcEIsb0JBQW9CO2tCQU5oQyxTQUFTOytCQUNJLGdCQUFnQixjQUNkLElBQUksV0FDUCxDQUFDLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBlZmZlY3QsIGlucHV0LCB2aWV3Q2hpbGRyZW4sIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGb3JtRHluYW1pY1JlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vY29yZS9yZWdpc3RyeSc7XG5pbXBvcnQgeyBGb3JtRHluYW1pY1NjaGVtYSB9IGZyb20gJy4uLy4uL3NjaGVtYXMvZm9ybS1keW5hbWljLXNjaGVtYSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncy1mb3JtLWR5bmFtaWMnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1JlYWN0aXZlRm9ybXNNb2R1bGVdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9mb3JtLWR5bmFtaWMuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtRHluYW1pY0NvbXBvbmVudCB7XG4gICAgcHJvdGVjdGVkIGZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcbiAgICBzY2hlbWEgPSBpbnB1dC5yZXF1aXJlZDxGb3JtRHluYW1pY1NjaGVtYT4oKTtcblxuICAgIC8vIEBWaWV3Q2hpbGRyZW4oJ2hvc3QnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgICAvLyBob3N0cyE6IFF1ZXJ5TGlzdDxWaWV3Q29udGFpbmVyUmVmPjtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgaG9zdHMgPSB2aWV3Q2hpbGRyZW4oJ2hvc3QnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHNjaGVtYUVmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHRoaXMuYnVpbGRGb3JtKCk7XG4gICAgfSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3RzRWZmZWN0ID0gZWZmZWN0KCgpID0+IHtcbiAgICAgICAgdGhpcy5idWlsZEZpZWxkcygpO1xuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSBidWlsZEZvcm0oKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuc2NoZW1hKCk7XG4gICAgICAgIGlmICghc2NoZW1hIHx8ICFzY2hlbWEuZmllbGRzKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuXG4gICAgICAgIHNjaGVtYS5maWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgICAgIGdyb3VwW2ZpZWxkLmtleV0gPSBuZXcgRm9ybUNvbnRyb2wobnVsbCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZm9ybSA9IG5ldyBGb3JtR3JvdXAoZ3JvdXApO1xuICAgIH1cblxuICAgIHByaXZhdGUgYnVpbGRGaWVsZHMoKSB7XG4gICAgICAgIGNvbnN0IGhvc3RzID0gdGhpcy5ob3N0cygpO1xuICAgICAgICBpZiAoIWhvc3RzPy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICB0aGlzLnNjaGVtYSgpLmZpZWxkcy5mb3JFYWNoKChmaWVsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGhvc3RzW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5jbGVhcigpO1xuXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBGb3JtRHluYW1pY1JlZ2lzdHJ5LnJlc29sdmVGaWVsZChmaWVsZC50eXBlKTtcbiAgICAgICAgICAgIGlmICghY29tcG9uZW50KSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IGNvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50KTtcblxuICAgICAgICAgICAgcmVmLnNldElucHV0KCdmaWVsZCcsIGZpZWxkKTtcbiAgICAgICAgICAgIHJlZi5zZXRJbnB1dCgnY29udHJvbCcsIHRoaXMuZm9ybS5nZXQoZmllbGQua2V5KSEpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBlbWl0KCkge1xuICAgICAgICBjb25zb2xlLmxvZygnRk9STSAtPicsIHRoaXMuZm9ybS52YWx1ZSk7XG4gICAgfVxufVxuXG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIj5cblxuICAgICAgQGZvciAoZmllbGQgb2Ygc2NoZW1hKCkuZmllbGRzOyB0cmFjayBmaWVsZC5rZXk7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgIDxuZy1jb250YWluZXIgI2hvc3Q+PC9uZy1jb250YWluZXI+XG4gICAgICB9XG5cbiAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIChjbGljayk9XCJlbWl0KClcIj5FbnZpYXI8L2J1dHRvbj5cbiAgICA8L2Zvcm0+XG4iXX0=
@@ -0,0 +1,10 @@
1
+ export class FormDynamicRegistry {
2
+ static fields = new Map();
3
+ static registerField(type, component) {
4
+ this.fields.set(type, component);
5
+ }
6
+ static resolveField(type) {
7
+ return this.fields.get(type);
8
+ }
9
+ }
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZm9ybS1keW5hbWljL2xpYi9jb3JlL3JlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sT0FBTyxtQkFBbUI7SUFDcEIsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUV4RCxNQUFNLENBQUMsYUFBYSxDQUFDLElBQWUsRUFBRSxTQUFvQjtRQUN0RCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBZTtRQUMvQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUeXBlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZpZWxkVHlwZSB9IGZyb20gXCIuLi9zY2hlbWFzL2ZpZWxkLWR5bmFtaWNcIjtcblxuZXhwb3J0IGNsYXNzIEZvcm1EeW5hbWljUmVnaXN0cnkge1xuICAgIHByaXZhdGUgc3RhdGljIGZpZWxkcyA9IG5ldyBNYXA8RmllbGRUeXBlLCBUeXBlPGFueT4+KCk7XG5cbiAgICBzdGF0aWMgcmVnaXN0ZXJGaWVsZCh0eXBlOiBGaWVsZFR5cGUsIGNvbXBvbmVudDogVHlwZTxhbnk+KSB7XG4gICAgICAgIHRoaXMuZmllbGRzLnNldCh0eXBlLCBjb21wb25lbnQpO1xuICAgIH1cblxuICAgIHN0YXRpYyByZXNvbHZlRmllbGQodHlwZTogRmllbGRUeXBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpZWxkcy5nZXQodHlwZSk7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,15 @@
1
+ import { Component, input } from '@angular/core';
2
+ import { ReactiveFormsModule } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/forms";
5
+ export class BooleanFieldComponent {
6
+ field = input.required();
7
+ control = input.required();
8
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BooleanFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: BooleanFieldComponent, isStandalone: true, selector: "s-boolean-field", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<label>\n <input type=\"checkbox\" [formControl]=\"control()\" [name]=\"field().key\" />\n {{ field().label }}\n</label>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] });
10
+ }
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BooleanFieldComponent, decorators: [{
12
+ type: Component,
13
+ args: [{ selector: 's-boolean-field', standalone: true, imports: [ReactiveFormsModule], template: "<label>\n <input type=\"checkbox\" [formControl]=\"control()\" [name]=\"field().key\" />\n {{ field().label }}\n</label>\n" }]
14
+ }] });
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vbGVhbi1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZm9ybS1keW5hbWljL2xpYi9maWVsZHMtYmFzaWMvYm9vbGVhbi1maWVsZC9ib29sZWFuLWZpZWxkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9mb3JtLWR5bmFtaWMvbGliL2ZpZWxkcy1iYXNpYy9ib29sZWFuLWZpZWxkL2Jvb2xlYW4tZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFakQsT0FBTyxFQUFlLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQVNsRSxNQUFNLE9BQU8scUJBQXFCO0lBQzlCLEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFnQixDQUFDO0lBQ3ZDLE9BQU8sR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFlLENBQUM7d0dBRi9CLHFCQUFxQjs0RkFBckIscUJBQXFCLDJVQ1hsQyw4SEFJQSx5RERHYyxtQkFBbUI7OzRGQUlwQixxQkFBcUI7a0JBUGpDLFNBQVM7K0JBQ0ksaUJBQWlCLGNBQ2YsSUFBSSxXQUNQLENBQUMsbUJBQW1CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCb29sZWFuRmllbGQgfSBmcm9tICcuLi8uLi9zY2hlbWFzL2ZpZWxkLWR5bmFtaWMnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncy1ib29sZWFuLWZpZWxkJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vYm9vbGVhbi1maWVsZC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmw6ICcuL2Jvb2xlYW4tZmllbGQuY29tcG9uZW50LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIEJvb2xlYW5GaWVsZENvbXBvbmVudCB7XG4gICAgZmllbGQgPSBpbnB1dC5yZXF1aXJlZDxCb29sZWFuRmllbGQ+KCk7XG4gICAgY29udHJvbCA9IGlucHV0LnJlcXVpcmVkPEZvcm1Db250cm9sPigpO1xufVxuXG4iLCI8bGFiZWw+XG4gIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbZm9ybUNvbnRyb2xdPVwiY29udHJvbCgpXCIgW25hbWVdPVwiZmllbGQoKS5rZXlcIiAvPlxuICB7eyBmaWVsZCgpLmxhYmVsIH19XG48L2xhYmVsPlxuIl19
@@ -0,0 +1,15 @@
1
+ import { Component, input } from '@angular/core';
2
+ import { ReactiveFormsModule } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/forms";
5
+ export class StringFieldComponent {
6
+ field = input.required();
7
+ control = input.required();
8
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StringFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: StringFieldComponent, isStandalone: true, selector: "s-string-field", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: " <label>{{ field().label }}</label>\n <input type=\"text\" [formControl]=\"control()\" [name]=\"field().key\" />\n", styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] });
10
+ }
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StringFieldComponent, decorators: [{
12
+ type: Component,
13
+ args: [{ selector: 's-string-field', standalone: true, imports: [ReactiveFormsModule], template: " <label>{{ field().label }}</label>\n <input type=\"text\" [formControl]=\"control()\" [name]=\"field().key\" />\n" }]
14
+ }] });
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9mb3JtLWR5bmFtaWMvbGliL2ZpZWxkcy1iYXNpYy9zdHJpbmctZmllbGQvc3RyaW5nLWZpZWxkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9mb3JtLWR5bmFtaWMvbGliL2ZpZWxkcy1iYXNpYy9zdHJpbmctZmllbGQvc3RyaW5nLWZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBZSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFVbEUsTUFBTSxPQUFPLG9CQUFvQjtJQUM3QixLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBZSxDQUFDO0lBQ3RDLE9BQU8sR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFlLENBQUM7d0dBRi9CLG9CQUFvQjs0RkFBcEIsb0JBQW9CLDBVQ1hqQyx5SEFFQSx5RERLYyxtQkFBbUI7OzRGQUlwQixvQkFBb0I7a0JBUGhDLFNBQVM7K0JBQ0ksZ0JBQWdCLGNBQ2QsSUFBSSxXQUNQLENBQUMsbUJBQW1CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN0cmluZ0ZpZWxkIH0gZnJvbSAnLi4vLi4vc2NoZW1hcy9maWVsZC1keW5hbWljJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzLXN0cmluZy1maWVsZCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbUmVhY3RpdmVGb3Jtc01vZHVsZV0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL3N0cmluZy1maWVsZC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmw6ICcuL3N0cmluZy1maWVsZC5jb21wb25lbnQuY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgU3RyaW5nRmllbGRDb21wb25lbnQge1xuICAgIGZpZWxkID0gaW5wdXQucmVxdWlyZWQ8U3RyaW5nRmllbGQ+KCk7XG4gICAgY29udHJvbCA9IGlucHV0LnJlcXVpcmVkPEZvcm1Db250cm9sPigpO1xufVxuXG4iLCIgICA8bGFiZWw+e3sgZmllbGQoKS5sYWJlbCB9fTwvbGFiZWw+XG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW2Zvcm1Db250cm9sXT1cImNvbnRyb2woKVwiIFtuYW1lXT1cImZpZWxkKCkua2V5XCIgLz5cbiJdfQ==
@@ -0,0 +1,30 @@
1
+ import { Component, input, viewChild } from '@angular/core';
2
+ import Quill from 'quill';
3
+ import * as i0 from "@angular/core";
4
+ export class EditorFieldComponent {
5
+ id = crypto.randomUUID();
6
+ field = input.required();
7
+ control = input.required();
8
+ editorContainer = viewChild.required('editorContainer');
9
+ quill;
10
+ ngAfterViewInit() {
11
+ this.quill = new Quill(this.editorContainer().nativeElement, {
12
+ theme: this.field().theme ?? 'snow',
13
+ });
14
+ this.quill.on('text-change', () => {
15
+ const html = this.editorContainer().nativeElement.querySelector('.ql-editor')?.innerHTML;
16
+ this.control().setValue(html, { emitEvent: true });
17
+ });
18
+ const initial = this.control().value;
19
+ if (initial) {
20
+ this.quill.root.innerHTML = initial;
21
+ }
22
+ }
23
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EditorFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
24
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.14", type: EditorFieldComponent, isStandalone: true, selector: "s-editor-field", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "editorContainer", first: true, predicate: ["editorContainer"], descendants: true, isSignal: true }], ngImport: i0, template: " <label [for]=\"id\">{{ field().label }}</label>\n\n<div [id]=\"id\" #editorContainer class=\"quill-container\"></div>\n", styles: [""] });
25
+ }
26
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EditorFieldComponent, decorators: [{
27
+ type: Component,
28
+ args: [{ selector: 's-editor-field', standalone: true, imports: [], template: " <label [for]=\"id\">{{ field().label }}</label>\n\n<div [id]=\"id\" #editorContainer class=\"quill-container\"></div>\n" }]
29
+ }] });
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9mb3JtLWR5bmFtaWMvbGliL29wdGlvbmFsLWZpZWxkcy9lZGl0b3IvZWRpdG9yLWZpZWxkL2VkaXRvci1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZm9ybS1keW5hbWljL2xpYi9vcHRpb25hbC1maWVsZHMvZWRpdG9yL2VkaXRvci1maWVsZC9lZGl0b3ItZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQWMsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd2RixPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7O0FBUzFCLE1BQU0sT0FBTyxvQkFBb0I7SUFDN0IsRUFBRSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUV6QixLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBZSxDQUFDO0lBQ3RDLE9BQU8sR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFlLENBQUM7SUFFeEMsZUFBZSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQTBCLGlCQUFpQixDQUFDLENBQUM7SUFFakYsS0FBSyxDQUFTO0lBRWQsZUFBZTtRQUNYLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLGFBQWEsRUFBRTtZQUN6RCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssSUFBSSxNQUFNO1NBQ3RDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUU7WUFDOUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEVBQUUsU0FBUyxDQUFDO1lBQ3pGLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkQsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQ3JDLElBQUksT0FBTyxFQUFFLENBQUM7WUFDVixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO1FBQ3hDLENBQUM7SUFDTCxDQUFDO3dHQXhCUSxvQkFBb0I7NEZBQXBCLG9CQUFvQiw4Y0NaakMsMEhBR0E7OzRGRFNhLG9CQUFvQjtrQkFQaEMsU0FBUzsrQkFDSSxnQkFBZ0IsY0FDZCxJQUFJLFdBQ1AsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgaW5wdXQsIHZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRWRpdG9yRmllbGQgfSBmcm9tICcuLi9lZGl0b3ItdHlwZXMnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgUXVpbGwgZnJvbSAncXVpbGwnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3MtZWRpdG9yLWZpZWxkJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9lZGl0b3ItZmllbGQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9lZGl0b3ItZmllbGQuY29tcG9uZW50LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIEVkaXRvckZpZWxkQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gICAgaWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuXG4gICAgZmllbGQgPSBpbnB1dC5yZXF1aXJlZDxFZGl0b3JGaWVsZD4oKTtcbiAgICBjb250cm9sID0gaW5wdXQucmVxdWlyZWQ8Rm9ybUNvbnRyb2w+KCk7XG5cbiAgICBlZGl0b3JDb250YWluZXIgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KCdlZGl0b3JDb250YWluZXInKTtcblxuICAgIHF1aWxsITogUXVpbGw7XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMucXVpbGwgPSBuZXcgUXVpbGwodGhpcy5lZGl0b3JDb250YWluZXIoKS5uYXRpdmVFbGVtZW50LCB7XG4gICAgICAgICAgICB0aGVtZTogdGhpcy5maWVsZCgpLnRoZW1lID8/ICdzbm93JyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5xdWlsbC5vbigndGV4dC1jaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBodG1sID0gdGhpcy5lZGl0b3JDb250YWluZXIoKS5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5xbC1lZGl0b3InKT8uaW5uZXJIVE1MO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sKCkuc2V0VmFsdWUoaHRtbCwgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGluaXRpYWwgPSB0aGlzLmNvbnRyb2woKS52YWx1ZTtcbiAgICAgICAgaWYgKGluaXRpYWwpIHtcbiAgICAgICAgICAgIHRoaXMucXVpbGwucm9vdC5pbm5lckhUTUwgPSBpbml0aWFsO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4iLCIgPGxhYmVsIFtmb3JdPVwiaWRcIj57eyBmaWVsZCgpLmxhYmVsIH19PC9sYWJlbD5cblxuPGRpdiBbaWRdPVwiaWRcIiAjZWRpdG9yQ29udGFpbmVyIGNsYXNzPVwicXVpbGwtY29udGFpbmVyXCI+PC9kaXY+XG4iXX0=
@@ -0,0 +1,3 @@
1
+ // import { FieldDynamicBase } from "../../schemas/field-dynamic";
2
+ export {};
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL2Zvcm0tZHluYW1pYy9saWIvb3B0aW9uYWwtZmllbGRzL2VkaXRvci9lZGl0b3ItdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0VBQWtFIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IHsgRmllbGREeW5hbWljQmFzZSB9IGZyb20gXCIuLi8uLi9zY2hlbWFzL2ZpZWxkLWR5bmFtaWNcIjtcblxuaW1wb3J0IHsgRmllbGREeW5hbWljQmFzZSB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvZm9ybS1keW5hbWljJztcblxuLy8gaW1wb3J0IHsgRmllbGREeW5hbWljQmFzZSB9IGZyb20gXCJAZS1jb21wb25lbnRzL2Zvcm0tZHluYW1pY1wiO1xuZXhwb3J0IGludGVyZmFjZSBFZGl0b3JGaWVsZCBleHRlbmRzIEZpZWxkRHluYW1pY0Jhc2Uge1xuICAgIHR5cGU6ICdlZGl0b3InO1xuICAgIGtleTogc3RyaW5nO1xuICAgIGxhYmVsPzogc3RyaW5nO1xuICAgIHJlcXVpcmVkPzogYm9vbGVhbjtcblxuICAgIHRoZW1lPzogJ3Nub3cnIHwgJ2J1YmJsZSc7XG59XG5cbi8vIGltcG9ydCB7IEZpZWxkVHlwZU1hcCB9IGZyb20gXCIuLy4uLy4uL3NjaGVtYXMvZmllbGQtZHluYW1pY1wiO1xuXG5kZWNsYXJlIG1vZHVsZSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9mb3JtLWR5bmFtaWMnIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIEZpZWxkVHlwZU1hcCB7XG4gICAgICAgIGVkaXRvcjogRWRpdG9yRmllbGQ7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,8 @@
1
+ // import { FormDynamicRegistry } from '@e-components/form-dynamic';
2
+ // import { FormDynamicRegistry } from '../../core/registry';
3
+ import { FormDynamicRegistry } from '@seniorsistemas/angular-components/form-dynamic';
4
+ import { EditorFieldComponent } from '../editor/editor-field/editor-field.component';
5
+ FormDynamicRegistry.registerField('editor', EditorFieldComponent);
6
+ export * from '../editor/editor-types';
7
+ export { EditorFieldComponent } from '../editor/editor-field/editor-field.component';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9mb3JtLWR5bmFtaWMvbGliL29wdGlvbmFsLWZpZWxkcy9lZGl0b3IvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxvRUFBb0U7QUFDcEUsNkRBQTZEO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBRXJGLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztBQUVsRSxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IHsgRm9ybUR5bmFtaWNSZWdpc3RyeSB9IGZyb20gJ0BlLWNvbXBvbmVudHMvZm9ybS1keW5hbWljJztcbi8vIGltcG9ydCB7IEZvcm1EeW5hbWljUmVnaXN0cnkgfSBmcm9tICcuLi8uLi9jb3JlL3JlZ2lzdHJ5JztcbmltcG9ydCB7IEZvcm1EeW5hbWljUmVnaXN0cnkgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2Zvcm0tZHluYW1pYyc7XG5pbXBvcnQgeyBFZGl0b3JGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2VkaXRvci9lZGl0b3ItZmllbGQvZWRpdG9yLWZpZWxkLmNvbXBvbmVudCc7XG5cbkZvcm1EeW5hbWljUmVnaXN0cnkucmVnaXN0ZXJGaWVsZCgnZWRpdG9yJywgRWRpdG9yRmllbGRDb21wb25lbnQpO1xuXG5leHBvcnQgKiBmcm9tICcuLi9lZGl0b3IvZWRpdG9yLXR5cGVzJztcbmV4cG9ydCB7IEVkaXRvckZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZWRpdG9yL2VkaXRvci1maWVsZC9lZGl0b3ItZmllbGQuY29tcG9uZW50JztcblxuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuaW9yc2lzdGVtYXMtYW5ndWxhci1jb21wb25lbnRzLWZvcm0tZHluYW1pYy1saWItb3B0aW9uYWwtZmllbGRzLWVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9mb3JtLWR5bmFtaWMvbGliL29wdGlvbmFsLWZpZWxkcy9lZGl0b3Ivc2VuaW9yc2lzdGVtYXMtYW5ndWxhci1jb21wb25lbnRzLWZvcm0tZHluYW1pYy1saWItb3B0aW9uYWwtZmllbGRzLWVkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -0,0 +1,10 @@
1
+ import { FormDynamicRegistry } from './core/registry';
2
+ export { FormDynamicRegistry } from './core/registry';
3
+ import { BooleanFieldComponent } from './fields-basic/boolean-field/boolean-field.component';
4
+ import { StringFieldComponent } from './fields-basic/string-field/string-field.component';
5
+ FormDynamicRegistry.registerField('string', StringFieldComponent);
6
+ FormDynamicRegistry.registerField('boolean', BooleanFieldComponent);
7
+ export * from './schemas/field-dynamic';
8
+ export * from './schemas/form-dynamic-schema';
9
+ export { FormDynamicComponent } from './components/form-dynamic/form-dynamic.component';
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9mb3JtLWR5bmFtaWMvbGliL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDN0YsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFFMUYsbUJBQW1CLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0FBQ2xFLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUscUJBQXFCLENBQUMsQ0FBQztBQUdwRSxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0RBQWtELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb3JtRHluYW1pY1JlZ2lzdHJ5IH0gZnJvbSAnLi9jb3JlL3JlZ2lzdHJ5JztcbmV4cG9ydCB7IEZvcm1EeW5hbWljUmVnaXN0cnkgfSBmcm9tICcuL2NvcmUvcmVnaXN0cnknO1xuaW1wb3J0IHsgQm9vbGVhbkZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi9maWVsZHMtYmFzaWMvYm9vbGVhbi1maWVsZC9ib29sZWFuLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdHJpbmdGaWVsZENvbXBvbmVudCB9IGZyb20gJy4vZmllbGRzLWJhc2ljL3N0cmluZy1maWVsZC9zdHJpbmctZmllbGQuY29tcG9uZW50JztcblxuRm9ybUR5bmFtaWNSZWdpc3RyeS5yZWdpc3RlckZpZWxkKCdzdHJpbmcnLCBTdHJpbmdGaWVsZENvbXBvbmVudCk7XG5Gb3JtRHluYW1pY1JlZ2lzdHJ5LnJlZ2lzdGVyRmllbGQoJ2Jvb2xlYW4nLCBCb29sZWFuRmllbGRDb21wb25lbnQpO1xuXG5cbmV4cG9ydCAqIGZyb20gJy4vc2NoZW1hcy9maWVsZC1keW5hbWljJztcbmV4cG9ydCAqIGZyb20gJy4vc2NoZW1hcy9mb3JtLWR5bmFtaWMtc2NoZW1hJztcbmV4cG9ydCB7IEZvcm1EeW5hbWljQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2Zvcm0tZHluYW1pYy9mb3JtLWR5bmFtaWMuY29tcG9uZW50JztcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtZHluYW1pYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9mb3JtLWR5bmFtaWMvbGliL3NjaGVtYXMvZmllbGQtZHluYW1pYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLy9leHBvcnQgaW50ZXJmYWNlIEZpZWxkVHlwZU1hcCB7IH1cbmV4cG9ydCBpbnRlcmZhY2UgRmllbGREeW5hbWljQmFzZSB7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIGtleTogc3RyaW5nO1xuICAgIGxhYmVsPzogc3RyaW5nO1xuICAgIHJlcXVpcmVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHJpbmdGaWVsZCBleHRlbmRzIEZpZWxkRHluYW1pY0Jhc2Uge1xuICAgIHR5cGU6ICdzdHJpbmcnO1xuICAgIG1pbkxlbmd0aD86IG51bWJlcjtcbiAgICBtYXhMZW5ndGg/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm9vbGVhbkZpZWxkIGV4dGVuZHMgRmllbGREeW5hbWljQmFzZSB7XG4gICAgdHlwZTogJ2Jvb2xlYW4nO1xufVxuXG4vLyBleHBvcnQgdHlwZSBCdWlsdEluRmllbGQgPVxuLy8gICAgIHwgU3RyaW5nRmllbGRcbi8vICAgICB8IEJvb2xlYW5GaWVsZDtcblxuXG5cbi8vIFRpcG9zIGJhc2UgY29uaGVjaWRvcyBwZWxvIGNvcmU6XG5leHBvcnQgaW50ZXJmYWNlIEZpZWxkVHlwZU1hcCB7XG4gICAgc3RyaW5nOiBTdHJpbmdGaWVsZDtcbiAgICBib29sZWFuOiBCb29sZWFuRmllbGQ7XG59XG5cbi8vIERlcml2YWRvcyBhdXRvbWF0aWNhbWVudGVcbmV4cG9ydCB0eXBlIEZpZWxkVHlwZSA9IGtleW9mIEZpZWxkVHlwZU1hcDtcbmV4cG9ydCB0eXBlIEZpZWxkRHluYW1pYyA9IEZpZWxkVHlwZU1hcFtrZXlvZiBGaWVsZFR5cGVNYXBdOyJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1keW5hbWljLXNjaGVtYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9mb3JtLWR5bmFtaWMvbGliL3NjaGVtYXMvZm9ybS1keW5hbWljLXNjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmllbGREeW5hbWljIH0gZnJvbSBcIi4vZmllbGQtZHluYW1pY1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1EeW5hbWljU2NoZW1hIHtcbiAgICBmaWVsZHM6IEZpZWxkRHluYW1pY1tdO1xufVxuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuaW9yc2lzdGVtYXMtYW5ndWxhci1jb21wb25lbnRzLWZvcm0tZHluYW1pYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9mb3JtLWR5bmFtaWMvbGliL3NlbmlvcnNpc3RlbWFzLWFuZ3VsYXItY29tcG9uZW50cy1mb3JtLWR5bmFtaWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -49,11 +49,6 @@ export class NumericMaskDirective {
49
49
  * @default true
50
50
  */
51
51
  allowScientificNotation = input(true);
52
- /**
53
- * Text alignment in input
54
- * @default 'right'
55
- */
56
- textAlign = input('right');
57
52
  /**
58
53
  * Minimum value allowed
59
54
  */
@@ -375,21 +370,22 @@ export class NumericMaskDirective {
375
370
  }
376
371
  /**
377
372
  * Formats a numeric value according to the locale
378
- * Truncates (never rounds) to maxDecimalPlaces for display purposes only
373
+ * Truncates (never rounds) to maxDecimalPlaces and pads with zeros to minDecimalPlaces
379
374
  * @private
380
375
  */
381
376
  formatNumeric(numeric) {
382
377
  let bigNumeric = numeric instanceof BigNumber ? numeric : new BigNumber(numeric);
383
378
  const truncatedValue = this.truncateToDecimalPlaces(bigNumeric, this.maxDecimalPlaces());
384
- const valueStr = truncatedValue.toFixed(this.maxDecimalPlaces());
379
+ const valueStr = truncatedValue.toFixed(Math.max(this.minDecimalPlaces(), this.maxDecimalPlaces()));
385
380
  let formattedValue = valueStr.replace('.', this.decimalSeparator);
386
381
  const parts = formattedValue.split(this.decimalSeparator);
387
382
  const integerPart = parts[0];
388
- const decimalPart = parts[1] || '';
383
+ let decimalPart = parts[1] || '';
389
384
  const formattedInteger = new Intl.NumberFormat(this.currentLocale).format(parseInt(integerPart, 10) || 0).split(this.decimalSeparator)[0];
390
- const minDecimal = Math.max(this.minDecimalPlaces(), decimalPart.replace(/0+$/, '').length || 0);
391
- const finalDecimal = decimalPart.padEnd(minDecimal, '0');
392
- return formattedInteger + this.decimalSeparator + finalDecimal;
385
+ const effectiveDecimalPlaces = decimalPart.replace(/0+$/, '').length;
386
+ const decimalPlacesToShow = Math.max(this.minDecimalPlaces(), Math.min(effectiveDecimalPlaces, this.maxDecimalPlaces()));
387
+ decimalPart = decimalPart.substring(0, decimalPlacesToShow).padEnd(decimalPlacesToShow, '0');
388
+ return formattedInteger + this.decimalSeparator + decimalPart;
393
389
  }
394
390
  /**
395
391
  * Formats the value according to the locale
@@ -535,7 +531,7 @@ export class NumericMaskDirective {
535
531
  return null;
536
532
  }
537
533
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NumericMaskDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
538
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: NumericMaskDirective, isStandalone: true, selector: "[sNumericMask]", inputs: { locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, minDecimalPlaces: { classPropertyName: "minDecimalPlaces", publicName: "minDecimalPlaces", isSignal: true, isRequired: false, transformFunction: null }, maxDecimalPlaces: { classPropertyName: "maxDecimalPlaces", publicName: "maxDecimalPlaces", isSignal: true, isRequired: false, transformFunction: null }, allowNegative: { classPropertyName: "allowNegative", publicName: "allowNegative", isSignal: true, isRequired: false, transformFunction: null }, allowScientificNotation: { classPropertyName: "allowScientificNotation", publicName: "allowScientificNotation", isSignal: true, isRequired: false, transformFunction: null }, textAlign: { classPropertyName: "textAlign", publicName: "textAlign", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "input": "onInput($event)", "focus": "onFocus()", "blur": "onBlur()", "paste": "onPaste($event)", "keydown": "onKeyDown($event)", "keypress": "onKeyPress($event)" }, properties: { "style.text-align": "textAlign()" } }, providers: [
534
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: NumericMaskDirective, isStandalone: true, selector: "[sNumericMask]", inputs: { locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, minDecimalPlaces: { classPropertyName: "minDecimalPlaces", publicName: "minDecimalPlaces", isSignal: true, isRequired: false, transformFunction: null }, maxDecimalPlaces: { classPropertyName: "maxDecimalPlaces", publicName: "maxDecimalPlaces", isSignal: true, isRequired: false, transformFunction: null }, allowNegative: { classPropertyName: "allowNegative", publicName: "allowNegative", isSignal: true, isRequired: false, transformFunction: null }, allowScientificNotation: { classPropertyName: "allowScientificNotation", publicName: "allowScientificNotation", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "input": "onInput($event)", "focus": "onFocus()", "blur": "onBlur()", "paste": "onPaste($event)", "keydown": "onKeyDown($event)", "keypress": "onKeyPress($event)" }, properties: { "style.text-align": "\"right\"" } }, providers: [
539
535
  {
540
536
  provide: NG_VALUE_ACCESSOR,
541
537
  useExisting: forwardRef(() => NumericMaskDirective),
@@ -560,7 +556,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
560
556
  '(paste)': 'onPaste($event)',
561
557
  '(keydown)': 'onKeyDown($event)',
562
558
  '(keypress)': 'onKeyPress($event)',
563
- '[style.text-align]': 'textAlign()',
559
+ '[style.text-align]': '"right"',
564
560
  },
565
561
  providers: [
566
562
  {
@@ -576,4 +572,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
576
572
  ],
577
573
  }]
578
574
  }], ctorParameters: () => [] });
579
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy1tYXNrLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9udW1lcmljLW1hc2svc3JjL2xpYi9udW1lcmljLW1hc2svbnVtZXJpYy1tYXNrLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVHLE9BQU8sRUFHSCxhQUFhLEVBQ2IsaUJBQWlCLEdBR3BCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzFFLE9BQU8sU0FBUyxNQUFNLGNBQWMsQ0FBQzs7QUFFckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUEwQkgsTUFBTSxPQUFPLG9CQUFvQjtJQUM3Qjs7O09BR0c7SUFDSSxNQUFNLEdBQUcsS0FBSyxDQUFxQixTQUFTLENBQUMsQ0FBQztJQUVyRDs7O09BR0c7SUFDSSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFbkM7OztPQUdHO0lBQ0ksZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRXBDOzs7T0FHRztJQUNJLGFBQWEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFcEM7OztPQUdHO0lBQ0ksdUJBQXVCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRTdDOzs7T0FHRztJQUNJLFNBQVMsR0FBRyxLQUFLLENBQW1CLE9BQU8sQ0FBQyxDQUFDO0lBRXBEOztPQUVHO0lBQ0ksR0FBRyxHQUFHLEtBQUssQ0FBcUIsU0FBUyxDQUFDLENBQUM7SUFFbEQ7O09BRUc7SUFDSSxHQUFHLEdBQUcsS0FBSyxD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O1lBQ0Q7Z0JBQ0ksT0FBTyxFQUFFLGFBQWE7Z0JBQ3RCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsb0JBQW9CLENBQUM7Z0JBQ25ELEtBQUssRUFBRSxJQUFJO2FBQ2Q7U0FDSjs7NEZBRVEsb0JBQW9CO2tCQXpCaEMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsSUFBSSxFQUFFO3dCQUNGLFNBQVMsRUFBRSxpQkFBaUI7d0JBQzVCLFNBQVMsRUFBRSxXQUFXO3dCQUN0QixRQUFRLEVBQUUsVUFBVTt3QkFDcEIsU0FBUyxFQUFFLGlCQUFpQjt3QkFDNUIsV0FBVyxFQUFFLG1CQUFtQjt3QkFDaEMsWUFBWSxFQUFFLG9CQUFvQjt3QkFDbEMsb0JBQW9CLEVBQUUsYUFBYTtxQkFDdEM7b0JBQ0QsU0FBUyxFQUFFO3dCQUNQOzRCQUNJLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHFCQUFxQixDQUFDOzRCQUNuRCxLQUFLLEVBQUUsSUFBSTt5QkFDZDt3QkFDRDs0QkFDSSxPQUFPLEVBQUUsYUFBYTs0QkFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUscUJBQXFCLENBQUM7NEJBQ25ELEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKO2lCQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBlZmZlY3QsIEVsZW1lbnRSZWYsIGZvcndhcmRSZWYsIGluamVjdCwgaW5wdXQsIE9uSW5pdCwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEFic3RyYWN0Q29udHJvbCxcbiAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBOR19WQUxJREFUT1JTLFxuICAgIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIFZhbGlkYXRpb25FcnJvcnMsXG4gICAgVmFsaWRhdG9yLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IExvY2FsZVNlcnZpY2UgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2xvY2FsZSc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5cbi8qKlxuICogTnVtZXJpYyBtYXNrIGRpcmVjdGl2ZSB3aXRoIGludGVybmF0aW9uYWxpemF0aW9uIHN1cHBvcnQuXG4gKlxuICogRm9ybWF0cyBudW1lcmljIHZhbHVlcyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBsb2NhbGUsIGFwcGx5aW5nXG4gKiBhcHByb3ByaWF0ZSB0aG91c2FuZCBhbmQgZGVjaW1hbCBzZXBhcmF0b3JzLCB3aXRoIHN1cHBvcnQgZm9yIG5lZ2F0aXZlIHZhbHVlcyxcbiAqIG1pbi9tYXggZGVjaW1hbCBwbGFjZXMgY29udHJvbCwgYW5kIHNjaWVudGlmaWMgbm90YXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxpbnB1dFxuICogICB0eXBlPVwidGV4dFwiXG4gKiAgIHNOdW1lcmljTWFza1xuICogICBbbG9jYWxlXT1cIidwdC1CUidcIlxuICogICBbbWluRGVjaW1hbFBsYWNlc109XCIyXCJcbiAqICAgW21heERlY2ltYWxQbGFjZXNdPVwiMlwiXG4gKiAgIFthbGxvd05lZ2F0aXZlXT1cInRydWVcIlxuICogICBbKG5nTW9kZWwpXT1cInZhbHVlXCJcbiAqIC8+XG4gKiBgYGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbc051bWVyaWNNYXNrXScsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBob3N0OiB7XG4gICAgICAgICcoaW5wdXQpJzogJ29uSW5wdXQoJGV2ZW50KScsXG4gICAgICAgICcoZm9jdXMpJzogJ29uRm9jdXMoKScsXG4gICAgICAgICcoYmx1ciknOiAnb25CbHVyKCknLFxuICAgICAgICAnKHBhc3RlKSc6ICdvblBhc3RlKCRldmVudCknLFxuICAgICAgICAnKGtleWRvd24pJzogJ29uS2V5RG93bigkZXZlbnQpJyxcbiAgICAgICAgJyhrZXlwcmVzcyknOiAnb25LZXlQcmVzcygkZXZlbnQpJyxcbiAgICAgICAgJ1tzdHlsZS50ZXh0LWFsaWduXSc6ICd0ZXh0QWxpZ24oKScsXG4gICAgfSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOdW1lcmljTWFza0RpcmVjdGl2ZSksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE51bWVyaWNNYXNrRGlyZWN0aXZlKSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIE51bWVyaWNNYXNrRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yIHtcbiAgICAvKipcbiAgICAgKiBMb2NhbGUgZm9yIGZvcm1hdHRpbmcgKGUuZy4gJ3B0LUJSJywgJ2VuLVVTJywgJ2RlLURFJylcbiAgICAgKiBJZiBub3QgcHJvdmlkZWQsIHVzZXMgdGhlIGxvY2FsZSBmcm9tIExvY2FsZVNlcnZpY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgbG9jYWxlID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gICAgLyoqXG4gICAgICogTWluaW11bSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdG8gZGlzcGxheVxuICAgICAqIEBkZWZhdWx0IDBcbiAgICAgKi9cbiAgICBwdWJsaWMgbWluRGVjaW1hbFBsYWNlcyA9IGlucHV0KDApO1xuXG4gICAgLyoqXG4gICAgICogTWF4aW11bSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgYWxsb3dlZFxuICAgICAqIEBkZWZhdWx0IDEwXG4gICAgICovXG4gICAgcHVibGljIG1heERlY2ltYWxQbGFjZXMgPSBpbnB1dCgxMCk7XG5cbiAgICAvKipcbiAgICAgKiBBbGxvd3MgbmVnYXRpdmUgdmFsdWVzXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgYWxsb3dOZWdhdGl2ZSA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgc2NpZW50aWZpYyBub3RhdGlvbiBzdXBwb3J0XG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBhbGxvd1NjaWVudGlmaWNOb3RhdGlvbiA9IGlucHV0KHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGV4dCBhbGlnbm1lbnQgaW4gaW5wdXRcbiAgICAgKiBAZGVmYXVsdCAncmlnaHQnXG4gICAgICovXG4gICAgcHVibGljIHRleHRBbGlnbiA9IGlucHV0PCdsZWZ0JyB8ICdyaWdodCc+KCdyaWdodCcpO1xuXG4gICAgLyoqXG4gICAgICogTWluaW11bSB2YWx1ZSBhbGxvd2VkXG4gICAgICovXG4gICAgcHVibGljIG1pbiA9IGlucHV0PG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAgIC8qKlxuICAgICAqIE1heGltdW0gdmFsdWUgYWxsb3dlZFxuICAgICAqL1xuICAgIHB1YmxpYyBtYXggPSBpbnB1dDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50Pik7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9jYWxlU2VydmljZSA9IGluamVjdChMb2NhbGVTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gICAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBwcml2YXRlIGRlY2ltYWxTZXBhcmF0b3IgPSAnLCc7XG4gICAgcHJpdmF0ZSB0aG91c2FuZFNlcGFyYXRvciA9ICcuJztcbiAgICBwcml2YXRlIGN1cnJlbnRMb2NhbGUgPSAncHQtQlInO1xuICAgIHByaXZhdGUgbGFzdE1vZGVsVmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dExvY2FsZSA9IHRoaXMubG9jYWxlKCk7XG5cbiAgICAgICAgICAgIGlmIChpbnB1dExvY2FsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudExvY2FsZSA9IGlucHV0TG9jYWxlO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2VwYXJhdG9ycygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm1pbkRlY2ltYWxQbGFjZXMoKSA+IHRoaXMubWF4RGVjaW1hbFBsYWNlcygpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYE51bWVyaWNNYXNrRGlyZWN0aXZlOiBtaW5EZWNpbWFsUGxhY2VzICgke3RoaXMubWluRGVjaW1hbFBsYWNlcygpfSkgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBtYXhEZWNpbWFsUGxhY2VzICgke3RoaXMubWF4RGVjaW1hbFBsYWNlcygpfSlgXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubG9jYWxlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExvY2FsZSA9IHRoaXMubG9jYWxlKCkhO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTZXBhcmF0b3JzKCk7XG4gICAgICAgICAgICB0aGlzLnNldElucHV0TW9kZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubG9jYWxlU2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5sb2NhbGVTZXJ2aWNlLmdldCgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TG9jYWxlID0gdGhpcy5sb2NhbGVTZXJ2aWNlIS5nZXRMb2NhbGVPcHRpb25zKCk/LmxvY2FsZSB8fCAncHQtQlInO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2VwYXJhdG9ycygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SW5wdXRNb2RlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2VwYXJhdG9ycygpO1xuICAgICAgICAgICAgdGhpcy5zZXRJbnB1dE1vZGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3RlbmVyIGZvciBpbnB1dCBldmVudHMgKHR5cGluZylcbiAgICAgKi9cbiAgICBwdWJsaWMgb25JbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgbGV0IHZhbHVlID0gaW5wdXQudmFsdWU7XG4gICAgICAgIHZhbHVlID0gdGhpcy5ub3JtYWxpemVTZXBhcmF0b3JzKHZhbHVlKTtcbiAgICAgICAgdGhpcy5wcm9jZXNzSW5wdXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdGVuZXIgZm9yIGZvY3VzIGV2ZW50cyAoZ2FpbmluZyBmb2N1cylcbiAgICAgKi9cbiAgICBwdWJsaWMgb25Gb2N1cygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gaW5wdXQudmFsdWU7XG5cbiAgICAgICAgaWYgKCFjdXJyZW50VmFsdWUgfHwgY3VycmVudFZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxhc3RNb2RlbFZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSB0aGlzLmxhc3RNb2RlbFZhbHVlLnJlcGxhY2UoJy4nLCB0aGlzLmRlY2ltYWxTZXBhcmF0b3IpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShpbnB1dCwgJ3ZhbHVlJywgZGlzcGxheVZhbHVlKTtcbiAgICAgICAgICAgIGlucHV0LnNlbGVjdCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbW9kZWxWYWx1ZSA9IHRoaXMudG9Nb2RlbFZhbHVlKGN1cnJlbnRWYWx1ZSk7XG5cbiAgICAgICAgaWYgKCFtb2RlbFZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSBtb2RlbFZhbHVlLnJlcGxhY2UoJy4nLCB0aGlzLmRlY2ltYWxTZXBhcmF0b3IpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KGlucHV0LCAndmFsdWUnLCBkaXNwbGF5VmFsdWUpO1xuICAgICAgICBpbnB1dC5zZWxlY3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW5lciBmb3IgYmx1ciBldmVudHMgKGZvY3VzIGxvc3MpXG4gICAgICovXG4gICAgcHVibGljIG9uQmx1cigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcblxuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZTtcblxuICAgICAgICBpZiAoIWN1cnJlbnRWYWx1ZSB8fCBjdXJyZW50VmFsdWUudHJpbSgpID09PSAnJykge1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZShudWxsKTtcbiAgICAgICAgICAgIHRoaXMubGFzdE1vZGVsVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbW9kZWxWYWx1ZSA9IHRoaXMudG9Nb2RlbFZhbHVlKGN1cnJlbnRWYWx1ZSk7XG5cbiAgICAgICAgaWYgKCFtb2RlbFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgICAgICAgdGhpcy5sYXN0TW9kZWxWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxhc3RNb2RlbFZhbHVlID0gbW9kZWxWYWx1ZTtcbiAgICAgICAgY29uc3QgZGlzcGxheVZhbHVlID0gdGhpcy5mcm9tTW9kZWxWYWx1ZShtb2RlbFZhbHVlKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgZGlzcGxheVZhbHVlKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZShtb2RlbFZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW5lciBmb3IgcGFzdGUgZXZlbnRzIChjbGlwYm9hcmQpXG4gICAgICovXG4gICAgcHVibGljIG9uUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGV2ZW50LmNsaXBib2FyZERhdGE/LmdldERhdGEoJ3RleHQnKSB8fCAnJztcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5wYXJzZUNsaXBib2FyZFZhbHVlKHBhc3RlZFRleHQpO1xuXG4gICAgICAgIHRoaXMucHJvY2Vzc0lucHV0VmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3RlbmVyIGZvciBzcGVjaWFsIGtleXMgKCsgYW5kIC0pXG4gICAgICovXG4gICAgcHVibGljIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBrZXkgPSBldmVudC5rZXk7XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJy0nIHx8IGtleSA9PT0gJysnKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnNvclBvc2l0aW9uID0gaW5wdXQuc2VsZWN0aW9uU3RhcnQgfHwgMDtcblxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJy0nICYmIHRoaXMuYWxsb3dTY2llbnRpZmljTm90YXRpb24oKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJCZWZvcmVDdXJzb3IgPSB2YWx1ZVtjdXJzb3JQb3NpdGlvbiAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChjaGFyQmVmb3JlQ3Vyc29yID09PSAnZScgfHwgY2hhckJlZm9yZUN1cnNvciA9PT0gJ0UnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYWxsb3dOZWdhdGl2ZSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVNpZ24odmFsdWUsIGtleSA9PT0gJy0nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3RlbmVyIGZvciBrZXlwcmVzcyB0byBibG9jayBpbnZhbGlkIGNoYXJhY3RlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgb25LZXlQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBrZXkgPSBldmVudC5rZXk7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGN1cnNvclBvc2l0aW9uID0gaW5wdXQuc2VsZWN0aW9uU3RhcnQgfHwgMDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBpbnB1dC52YWx1ZTtcblxuICAgICAgICBpZiAoKGtleSA9PT0gJy0nIHx8IGtleSA9PT0gJysnKSAmJiB0aGlzLmFsbG93U2NpZW50aWZpY05vdGF0aW9uKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYXJCZWZvcmVDdXJzb3IgPSB2YWx1ZVtjdXJzb3JQb3NpdGlvbiAtIDFdO1xuICAgICAgICAgICAgaWYgKGNoYXJCZWZvcmVDdXJzb3IgPT09ICdlJyB8fCBjaGFyQmVmb3JlQ3Vyc29yID09PSAnRScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5ID09PSAnKycgfHwga2V5ID09PSAnLScpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0RpZ2l0ID0gL15bMC05XSQvLnRlc3Qoa2V5KTtcbiAgICAgICAgY29uc3QgaXNMb2NhbGVEZWNpbWFsU2VwYXJhdG9yID0ga2V5ID09PSB0aGlzLmRlY2ltYWxTZXBhcmF0b3I7XG4gICAgICAgIGNvbnN0IGlzT3RoZXJTZXBhcmF0b3IgPSAoa2V5ID09PSAnLCcgfHwga2V5ID09PSAnLicpICYmIGtleSAhPT0gdGhpcy5kZWNpbWFsU2VwYXJhdG9yO1xuICAgICAgICBjb25zdCBpc1NjaWVudGlmaWNOb3RhdGlvbiA9IChrZXkgPT09ICdlJyB8fCBrZXkgPT09ICdFJykgJiYgdGhpcy5hbGxvd1NjaWVudGlmaWNOb3RhdGlvbigpO1xuICAgICAgICBjb25zdCBpc0NvbnRyb2xLZXkgPSBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuYWx0S2V5O1xuICAgICAgICBjb25zdCBpc1NwZWNpYWxLZXkgPSBbXG4gICAgICAgICAgICAnQmFja3NwYWNlJyxcbiAgICAgICAgICAgICdUYWInLFxuICAgICAgICAgICAgJ0VudGVyJyxcbiAgICAgICAgICAgICdFc2NhcGUnLFxuICAgICAgICAgICAgJ0Fycm93TGVmdCcsXG4gICAgICAgICAgICAnQXJyb3dSaWdodCcsXG4gICAgICAgICAgICAnRGVsZXRlJyxcbiAgICAgICAgICAgICdIb21lJyxcbiAgICAgICAgICAgICdFbmQnLFxuICAgICAgICBdLmluY2x1ZGVzKGtleSk7XG5cbiAgICAgICAgaWYgKGlzT3RoZXJTZXBhcmF0b3IpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNTY2llbnRpZmljTm90YXRpb24pIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcygnZScpIHx8IHZhbHVlLmluY2x1ZGVzKCdFJykpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY2hhckJlZm9yZUN1cnNvciA9IHZhbHVlW2N1cnNvclBvc2l0aW9uIC0gMV07XG4gICAgICAgICAgICBpZiAoIWNoYXJCZWZvcmVDdXJzb3IgfHwgIS9eWzAtOV0kLy50ZXN0KGNoYXJCZWZvcmVDdXJzb3IpKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzRGlnaXQgJiYgIWlzTG9jYWxlRGVjaW1hbFNlcGFyYXRvciAmJiAhaXNTY2llbnRpZmljTm90YXRpb24gJiYgIWlzQ29udHJvbEtleSAmJiAhaXNTcGVjaWFsS2V5KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBzZXBhcmF0b3JzIGFjY29yZGluZyB0byB0aGUgbG9jYWxlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHVwZGF0ZVNlcGFyYXRvcnMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IG5ldyBJbnRsLk51bWJlckZvcm1hdCh0aGlzLmN1cnJlbnRMb2NhbGUpLmZvcm1hdCgxMjM0LjUpO1xuXG4gICAgICAgIHRoaXMudGhvdXNhbmRTZXBhcmF0b3IgPSBmb3JtYXR0ZWRbMV07XG4gICAgICAgIHRoaXMuZGVjaW1hbFNlcGFyYXRvciA9IGZvcm1hdHRlZFs1XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgaW5wdXQgdmFsdWUgYW5kIHVwZGF0ZXMgdGhlIGlucHV0IGFuZCBtb2RlbFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBwcm9jZXNzSW5wdXRWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5kZWNpbWFsU2VwYXJhdG9yIHx8ICF0aGlzLnRob3VzYW5kU2VwYXJhdG9yKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNlcGFyYXRvcnMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbHVlKTtcblxuICAgICAgICBjb25zdCBtb2RlbFZhbHVlID0gdGhpcy50b01vZGVsVmFsdWUodmFsdWUpO1xuXG4gICAgICAgIC8vIER1cmluZyB0eXBpbmcsIGNsZWFyIHRoZSBzdG9yZWQgbW9kZWwgdmFsdWUgc28gb25Gb2N1cyB3aWxsIHJlY2FsY3VsYXRlXG4gICAgICAgIHRoaXMubGFzdE1vZGVsVmFsdWUgPSBudWxsO1xuXG4gICAgICAgIHRoaXMub25DaGFuZ2UobW9kZWxWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBpbnB1dG1vZGUgZm9yIG51bWVyaWMga2V5Ym9hcmQgb24gbW9iaWxlIGRldmljZXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0SW5wdXRNb2RlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2lucHV0bW9kZScsICdkZWNpbWFsJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnYXV0b2NvbXBsZXRlJywgJ29mZicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgc2VwYXJhdG9ycyBmcm9tIGEgZm9ybWF0dGVkIHZhbHVlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbW92ZVNlcGFyYXRvcnModmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHRob3VzYW5kUmVnZXggPSBuZXcgUmVnRXhwKGBcXFxcJHt0aGlzLmVzY2FwZVJlZ2V4KHRoaXMudGhvdXNhbmRTZXBhcmF0b3IpfWAsICdnJyk7XG4gICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKHRob3VzYW5kUmVnZXgsICcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdHJpcHMgdW5uZWNlc3NhcnkgdHJhaWxpbmcgemVyb3MgZnJvbSBkZWNpbWFsIHBhcnRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RyaXBUcmFpbGluZ1plcm9zKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHZhbHVlLnNwbGl0KHRoaXMuZGVjaW1hbFNlcGFyYXRvcik7XG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY2ltYWxQYXJ0ID0gcGFydHNbMV0ucmVwbGFjZSgvMCskLywgJycpO1xuICAgICAgICAgICAgcmV0dXJuIGRlY2ltYWxQYXJ0Lmxlbmd0aCA+IDAgPyBwYXJ0c1swXSArIHRoaXMuZGVjaW1hbFNlcGFyYXRvciArIGRlY2ltYWxQYXJ0IDogcGFydHNbMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZXMgc2VwYXJhdG9ycyBkdXJpbmcgdHlwaW5nXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIG5vcm1hbGl6ZVNlcGFyYXRvcnModmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5yZW1vdmVTZXBhcmF0b3JzKHZhbHVlKTtcblxuICAgICAgICBpZiAodGhpcy5kZWNpbWFsU2VwYXJhdG9yID09PSAnLCcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFwuL2csICcsJyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kZWNpbWFsU2VwYXJhdG9yID09PSAnLicpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvLC9nLCAnLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFydHMgPSB2YWx1ZS5zcGxpdCh0aGlzLmRlY2ltYWxTZXBhcmF0b3IpO1xuICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgdmFsdWUgPSBwYXJ0c1swXSArIHRoaXMuZGVjaW1hbFNlcGFyYXRvciArIHBhcnRzLnNsaWNlKDEpLmpvaW4oJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzY2FwZXMgc3BlY2lhbCBjaGFyYWN0ZXJzIGZvciB1c2UgaW4gcmVnZXhcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZXNjYXBlUmVnZXgoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJ1bmNhdGVzIGEgbnVtYmVyIHRvIHRoZSBzcGVjaWZpZWQgZGVjaW1hbCBwbGFjZXMgKG5ldmVyIHJvdW5kcylcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgdHJ1bmNhdGVUb0RlY2ltYWxQbGFjZXMoYmlnTnVtYmVyOiBCaWdOdW1iZXIsIGRlY2ltYWxQbGFjZXM6IG51bWJlcik6IEJpZ051bWJlciB7XG4gICAgICAgIGlmIChkZWNpbWFsUGxhY2VzIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJpZ051bWJlcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtdWx0aXBsaWVyID0gbmV3IEJpZ051bWJlcigxMCkucG93KGRlY2ltYWxQbGFjZXMpO1xuICAgICAgICByZXR1cm4gYmlnTnVtYmVyLm11bHRpcGxpZWRCeShtdWx0aXBsaWVyKS5pbnRlZ2VyVmFsdWUoQmlnTnVtYmVyLlJPVU5EX0RPV04pLmRpdmlkZWRCeShtdWx0aXBsaWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIHZhbHVlIGhhcyBleGNlc3NpdmUgZGVjaW1hbCBwbGFjZXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgaGFzRXhjZXNzaXZlRGVjaW1hbFBsYWNlcyh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gdmFsdWUuc3BsaXQodGhpcy5kZWNpbWFsU2VwYXJhdG9yKTtcblxuICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29uc3QgZGVjaW1hbFBhcnQgPSBwYXJ0c1sxXS5yZXBsYWNlKC9bXjAtOV0vZywgJycpO1xuICAgICAgICAgICAgcmV0dXJuIGRlY2ltYWxQYXJ0Lmxlbmd0aCA+IHRoaXMubWF4RGVjaW1hbFBsYWNlcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgaW5wdXQgYW5kIG5vdGlmaWVzIHRoZSBtb2RlbFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjbGVhcklucHV0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCAnJyk7XG4gICAgICAgIHRoaXMubGFzdE1vZGVsVmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKG51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIHN0cmluZyB2YWx1ZSB0byBpdHMgbnVtZXJpYyByZXByZXNlbnRhdGlvbiwgaGFuZGxpbmcgc2VwYXJhdG9ycyBhbmQgc2lnblxuICAgICAqIFJldHVybnMgQmlnTnVtYmVyIHRvIHByZXNlcnZlIGZ1bGwgcHJlY2lzaW9uIGFuZCBvcHRpb25hbCBudW1iZXIgY29udmVyc2lvblxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYXJzZVN0cmluZ1RvVmFsdWUodmFsdWU6IHN0cmluZyk6IHsgYmlnTnVtYmVyOiBCaWdOdW1iZXI7IG51bWVyaWM6IG51bWJlcjsgaXNOZWdhdGl2ZTogYm9vbGVhbiB9IHtcbiAgICAgICAgY29uc3QgaXNOZWdhdGl2ZSA9IHZhbHVlLnN0YXJ0c1dpdGgoJy0nKTtcbiAgICAgICAgbGV0IG51bWVyaWNTdHIgPSB2YWx1ZVxuICAgICAgICAgICAgLnJlcGxhY2UoL14tLywgJycpXG4gICAgICAgICAgICAucmVwbGFjZShuZXcgUmVnRXhwKGBcXFxcJHt0aGlzLnRob3VzYW5kU2VwYXJhdG9yfWAsICdnJyksICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UobmV3IFJlZ0V4cChgXFxcXCR7dGhpcy5kZWNpbWFsU2VwYXJhdG9yfWAsICdnJyksICcuJyk7XG5cbiAgICAgICAgaWYgKG51bWVyaWNTdHIgPT09ICcuJyB8fCBudW1lcmljU3RyID09PSAnJykge1xuICAgICAgICAgICAgbnVtZXJpY1N0ciA9ICcwJztcbiAgICAgICAgfSBlbHNlIGlmIChudW1lcmljU3RyLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICAgICAgbnVtZXJpY1N0ciA9ICcwJyArIG51bWVyaWNTdHI7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYmlnTnVtYmVyID0gbmV3IEJpZ051bWJlcihudW1lcmljU3RyKTtcbiAgICAgICAgaWYgKGJpZ051bWJlci5pc05hTigpKSB7XG4gICAgICAgICAgICBiaWdOdW1iZXIgPSBuZXcgQmlnTnVtYmVyKDApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzTmVnYXRpdmUgJiYgdGhpcy5hbGxvd05lZ2F0aXZlKCkpIHtcbiAgICAgICAgICAgIGJpZ051bWJlciA9IGJpZ051bWJlci5uZWdhdGVkKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBiaWdOdW1iZXIsIG51bWVyaWM6IGJpZ051bWJlci50b051bWJlcigpLCBpc05lZ2F0aXZlIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9ybWF0cyBhIG51bWVyaWMgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbGVcbiAgICAgKiBUcnVuY2F0ZXMgKG5ldmVyIHJvdW5kcykgdG8gbWF4RGVjaW1hbFBsYWNlcyBmb3IgZGlzcGxheSBwdXJwb3NlcyBvbmx5XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGZvcm1hdE51bWVyaWMobnVtZXJpYzogbnVtYmVyIHwgQmlnTnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGJpZ051bWVyaWMgPSBudW1lcmljIGluc3RhbmNlb2YgQmlnTnVtYmVyID8gbnVtZXJpYyA6IG5ldyBCaWdOdW1iZXIobnVtZXJpYyk7XG4gICAgICAgIGNvbnN0IHRydW5jYXRlZFZhbHVlID0gdGhpcy50cnVuY2F0ZVRvRGVjaW1hbFBsYWNlcyhiaWdOdW1lcmljLCB0aGlzLm1heERlY2ltYWxQbGFjZXMoKSk7XG4gICAgICAgIGNvbnN0IHZhbHVlU3RyID0gdHJ1bmNhdGVkVmFsdWUudG9GaXhlZCh0aGlzLm1heERlY2ltYWxQbGFjZXMoKSk7XG4gICAgICAgIGxldCBmb3JtYXR0ZWRWYWx1ZSA9IHZhbHVlU3RyLnJlcGxhY2UoJy4nLCB0aGlzLmRlY2ltYWxTZXBhcmF0b3IpO1xuICAgICAgICBjb25zdCBwYXJ0cyA9IGZvcm1hdHRlZFZhbHVlLnNwbGl0KHRoaXMuZGVjaW1hbFNlcGFyYXRvcik7XG4gICAgICAgIGNvbnN0IGludGVnZXJQYXJ0ID0gcGFydHNbMF07XG4gICAgICAgIGNvbnN0IGRlY2ltYWxQYXJ0ID0gcGFydHNbMV0gfHwgJyc7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZEludGVnZXIgPSBuZXcgSW50bC5OdW1iZXJGb3JtYXQodGhpcy5jdXJyZW50TG9jYWxlKS5mb3JtYXQoXG4gICAgICAgICAgICBwYXJzZUludChpbnRlZ2VyUGFydCwgMTApIHx8IDBcbiAgICAgICAgKS5zcGxpdCh0aGlzLmRlY2ltYWxTZXBhcmF0b3IpWzBdO1xuICAgICAgICBjb25zdCBtaW5EZWNpbWFsID0gTWF0aC5tYXgodGhpcy5taW5EZWNpbWFsUGxhY2VzKCksIGRlY2ltYWxQYXJ0LnJlcGxhY2UoLzArJC8sICcnKS5sZW5ndGggfHwgMCk7XG4gICAgICAgIGNvbnN0IGZpbmFsRGVjaW1hbCA9IGRlY2ltYWxQYXJ0LnBhZEVuZChtaW5EZWNpbWFsLCAnMCcpO1xuICAgICAgICByZXR1cm4gZm9ybWF0dGVkSW50ZWdlciArIHRoaXMuZGVjaW1hbFNlcGFyYXRvciArIGZpbmFsRGVjaW1hbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXRzIHRoZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIGxvY2FsZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBmb3JtYXRWYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBudW1lcmljIH0gPSB0aGlzLnBhcnNlU3RyaW5nVG9WYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdE51bWVyaWMobnVtZXJpYyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZvcm1hdHRlZCB2YWx1ZSB0byB0aGUgbW9kZWwgZm9ybWF0IChpbnRlcm5hdGlvbmFsIHN0YW5kYXJkIHN0cmluZylcbiAgICAgKiBBbHdheXMgcmV0dXJucyBkZWNpbWFsIG5vdGF0aW9uLCBuZXZlciBzY2llbnRpZmljIG5vdGF0aW9uXG4gICAgICogU3RvcmVzIHRoZSBmdWxsIHByZWNpc2lvbiB2YWx1ZSB3aXRob3V0IHRydW5jYXRpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgdG9Nb2RlbFZhbHVlKGZvcm1hdHRlZFZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKCFmb3JtYXR0ZWRWYWx1ZSB8fCBmb3JtYXR0ZWRWYWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGJpZ051bWJlciB9ID0gdGhpcy5wYXJzZVN0cmluZ1RvVmFsdWUoZm9ybWF0dGVkVmFsdWUpO1xuICAgICAgICByZXR1cm4gYmlnTnVtYmVyLnRvRml4ZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgbW9kZWwgdmFsdWUgdG8gZGlzcGxheSBmb3JtYXRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZnJvbU1vZGVsVmFsdWUobW9kZWxWYWx1ZTogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB7XG4gICAgICAgIGlmIChtb2RlbFZhbHVlID09PSBudWxsIHx8IG1vZGVsVmFsdWUgPT09IHVuZGVmaW5lZCB8fCBtb2RlbFZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJpZ051bWJlciA9IG5ldyBCaWdOdW1iZXIobW9kZWxWYWx1ZSk7XG4gICAgICAgIGlmIChiaWdOdW1iZXIuaXNOYU4oKSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdE51bWVyaWMoYmlnTnVtYmVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgcGFzdGVkIHZhbHVlIGZyb20gY2xpcGJvYXJkXG4gICAgICogQ29udmVydHMgc2NpZW50aWZpYyBub3RhdGlvbiB0byBkZWNpbWFsIHVzaW5nIEJpZ051bWJlclxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYXJzZUNsaXBib2FyZFZhbHVlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmFsbG93U2NpZW50aWZpY05vdGF0aW9uKCkgJiYgL1tlRV0vLnRlc3QodGV4dCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmlnTnVtZXJpYyA9IG5ldyBCaWdOdW1iZXIodGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKCFiaWdOdW1lcmljLmlzTmFOKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGJpZ051bWVyaWMudG9GaXhlZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIHZvaWQgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVTZXBhcmF0b3JzKHRleHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIHNpZ24gKC0gb3IgKykgb2YgYSB2YWx1ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSB0b2dnbGVTaWduKHZhbHVlOiBzdHJpbmcsIG1ha2VOZWdhdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICBsZXQgbmV3VmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICBpZiAobWFrZU5lZ2F0aXZlICYmICFuZXdWYWx1ZS5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gJy0nICsgbmV3VmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoIW1ha2VOZWdhdGl2ZSAmJiBuZXdWYWx1ZS5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShpbnB1dCwgJ3ZhbHVlJywgbmV3VmFsdWUpO1xuICAgICAgICBjb25zdCBtb2RlbFZhbHVlID0gdGhpcy50b01vZGVsVmFsdWUobmV3VmFsdWUpO1xuICAgICAgICB0aGlzLmxhc3RNb2RlbFZhbHVlID0gbnVsbDtcbiAgICAgICAgdGhpcy5vbkNoYW5nZShtb2RlbFZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZGVjaW1hbFNlcGFyYXRvciB8fCAhdGhpcy50aG91c2FuZFNlcGFyYXRvcikge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTZXBhcmF0b3JzKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGFzRm9jdXMgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKGhhc0ZvY3VzKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMuZnJvbU1vZGVsVmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSB0aGlzLnN0cmlwVHJhaWxpbmdaZXJvcyh0aGlzLnJlbW92ZVNlcGFyYXRvcnMoZm9ybWF0dGVkVmFsdWUpKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHJhd1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5mcm9tTW9kZWxWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCBmb3JtYXR0ZWRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcsIGlzRGlzYWJsZWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29udHJvbC52YWx1ZTtcblxuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG51bWVyaWNWYWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuXG4gICAgICAgIGlmIChpc05hTihudW1lcmljVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5hbGxvd05lZ2F0aXZlKCkgJiYgbnVtZXJpY1ZhbHVlIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbmVnYXRpdmVOb3RBbGxvd2VkOiB0cnVlIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtaW5WYWx1ZSA9IHRoaXMubWluKCk7XG4gICAgICAgIGlmIChtaW5WYWx1ZSAhPT0gdW5kZWZpbmVkICYmIG51bWVyaWNWYWx1ZSA8IG1pblZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1pbjoge1xuICAgICAgICAgICAgICAgICAgICBtaW46IG1pblZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBhY3R1YWw6IG51bWVyaWNWYWx1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1heFZhbHVlID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKG1heFZhbHVlICE9PSB1bmRlZmluZWQgJiYgbnVtZXJpY1ZhbHVlID4gbWF4VmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbWF4OiB7XG4gICAgICAgICAgICAgICAgICAgIG1heDogbWF4VmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbDogbnVtZXJpY1ZhbHVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVjaW1hbFBhcnQgPSB2YWx1ZS5zcGxpdCgnLicpWzFdO1xuXG4gICAgICAgIGlmIChkZWNpbWFsUGFydCAmJiBkZWNpbWFsUGFydC5sZW5ndGggPiB0aGlzLm1heERlY2ltYWxQbGFjZXMoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBleGNlc3NpdmVEZWNpbWFsUGxhY2VzOiB7XG4gICAgICAgICAgICAgICAgICAgIG1heDogdGhpcy5tYXhEZWNpbWFsUGxhY2VzKCksXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbDogZGVjaW1hbFBhcnQubGVuZ3RoLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG4iXX0=
575
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy1tYXNrLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9udW1lcmljLW1hc2svc3JjL2xpYi9udW1lcmljLW1hc2svbnVtZXJpYy1tYXNrLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVHLE9BQU8sRUFHSCxhQUFhLEVBQ2IsaUJBQWlCLEdBR3BCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzFFLE9BQU8sU0FBUyxNQUFNLGNBQWMsQ0FBQzs7QUFFckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUEwQkgsTUFBTSxPQUFPLG9CQUFvQjtJQUM3Qjs7O09BR0c7SUFDSSxNQUFNLEdBQUcsS0FBSyxDQUFxQixTQUFTLENBQUMsQ0FBQztJQUVyRDs7O09BR0c7SUFDSSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFbkM7OztPQUdHO0lBQ0ksZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRXBDOzs7T0FHRztJQUNJLGFBQWEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFcEM7OztPQUdHO0lBQ0ksdUJBQXVCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRTdDOztPQUVHO0lBQ0ksR0FBRyxHQUFHLEtBQUssQ0FBcUIsU0FBUyxDQUFDLENBQUM7SUFFbEQ7O09BRUc7SUFDSSxHQUFHLEdBQUcsS0FBSyxDQUFxQixTQUFTLENBQUMsQ0FBQztJQUVqQyxVQUFVLEdBQUcsTUFBTSxDQUFDLENBQUEsVUFB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QWJsQjtZQUNQO2dCQUNJLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsb0JBQW9CLENBQUM7Z0JBQ25ELEtBQUssRUFBRSxJQUFJO2FBQ2Q7WUFDRDtnQkFDSSxPQUFPLEVBQUUsYUFBYTtnQkFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDbkQsS0FBSyxFQUFFLElBQUk7YUFDZDtTQUNKOzs0RkFFUSxvQkFBb0I7a0JBekJoQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxnQkFBZ0I7b0JBQzFCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixJQUFJLEVBQUU7d0JBQ0YsU0FBUyxFQUFFLGlCQUFpQjt3QkFDNUIsU0FBUyxFQUFFLFdBQVc7d0JBQ3RCLFFBQVEsRUFBRSxVQUFVO3dCQUNwQixTQUFTLEVBQUUsaUJBQWlCO3dCQUM1QixXQUFXLEVBQUUsbUJBQW1CO3dCQUNoQyxZQUFZLEVBQUUsb0JBQW9CO3dCQUNsQyxvQkFBb0IsRUFBRSxTQUFTO3FCQUNsQztvQkFDRCxTQUFTLEVBQUU7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUscUJBQXFCLENBQUM7NEJBQ25ELEtBQUssRUFBRSxJQUFJO3lCQUNkO3dCQUNEOzRCQUNJLE9BQU8sRUFBRSxhQUFhOzRCQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxxQkFBcUIsQ0FBQzs0QkFDbkQsS0FBSyxFQUFFLElBQUk7eUJBQ2Q7cUJBQ0o7aUJBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIGVmZmVjdCwgRWxlbWVudFJlZiwgZm9yd2FyZFJlZiwgaW5qZWN0LCBpbnB1dCwgT25Jbml0LCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQWJzdHJhY3RDb250cm9sLFxuICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIE5HX1ZBTElEQVRPUlMsXG4gICAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgVmFsaWRhdGlvbkVycm9ycyxcbiAgICBWYWxpZGF0b3IsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgTG9jYWxlU2VydmljZSB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvbG9jYWxlJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcblxuLyoqXG4gKiBOdW1lcmljIG1hc2sgZGlyZWN0aXZlIHdpdGggaW50ZXJuYXRpb25hbGl6YXRpb24gc3VwcG9ydC5cbiAqXG4gKiBGb3JtYXRzIG51bWVyaWMgdmFsdWVzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGxvY2FsZSwgYXBwbHlpbmdcbiAqIGFwcHJvcHJpYXRlIHRob3VzYW5kIGFuZCBkZWNpbWFsIHNlcGFyYXRvcnMsIHdpdGggc3VwcG9ydCBmb3IgbmVnYXRpdmUgdmFsdWVzLFxuICogbWluL21heCBkZWNpbWFsIHBsYWNlcyBjb250cm9sLCBhbmQgc2NpZW50aWZpYyBub3RhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPGlucHV0XG4gKiAgIHR5cGU9XCJ0ZXh0XCJcbiAqICAgc051bWVyaWNNYXNrXG4gKiAgIFtsb2NhbGVdPVwiJ3B0LUJSJ1wiXG4gKiAgIFttaW5EZWNpbWFsUGxhY2VzXT1cIjJcIlxuICogICBbbWF4RGVjaW1hbFBsYWNlc109XCIyXCJcbiAqICAgW2FsbG93TmVnYXRpdmVdPVwidHJ1ZVwiXG4gKiAgIFsobmdNb2RlbCldPVwidmFsdWVcIlxuICogLz5cbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tzTnVtZXJpY01hc2tdJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJyhpbnB1dCknOiAnb25JbnB1dCgkZXZlbnQpJyxcbiAgICAgICAgJyhmb2N1cyknOiAnb25Gb2N1cygpJyxcbiAgICAgICAgJyhibHVyKSc6ICdvbkJsdXIoKScsXG4gICAgICAgICcocGFzdGUpJzogJ29uUGFzdGUoJGV2ZW50KScsXG4gICAgICAgICcoa2V5ZG93biknOiAnb25LZXlEb3duKCRldmVudCknLFxuICAgICAgICAnKGtleXByZXNzKSc6ICdvbktleVByZXNzKCRldmVudCknLFxuICAgICAgICAnW3N0eWxlLnRleHQtYWxpZ25dJzogJ1wicmlnaHRcIicsXG4gICAgfSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOdW1lcmljTWFza0RpcmVjdGl2ZSksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE51bWVyaWNNYXNrRGlyZWN0aXZlKSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIE51bWVyaWNNYXNrRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yIHtcbiAgICAvKipcbiAgICAgKiBMb2NhbGUgZm9yIGZvcm1hdHRpbmcgKGUuZy4gJ3B0LUJSJywgJ2VuLVVTJywgJ2RlLURFJylcbiAgICAgKiBJZiBub3QgcHJvdmlkZWQsIHVzZXMgdGhlIGxvY2FsZSBmcm9tIExvY2FsZVNlcnZpY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgbG9jYWxlID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gICAgLyoqXG4gICAgICogTWluaW11bSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdG8gZGlzcGxheVxuICAgICAqIEBkZWZhdWx0IDBcbiAgICAgKi9cbiAgICBwdWJsaWMgbWluRGVjaW1hbFBsYWNlcyA9IGlucHV0KDApO1xuXG4gICAgLyoqXG4gICAgICogTWF4aW11bSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgYWxsb3dlZFxuICAgICAqIEBkZWZhdWx0IDEwXG4gICAgICovXG4gICAgcHVibGljIG1heERlY2ltYWxQbGFjZXMgPSBpbnB1dCgxMCk7XG5cbiAgICAvKipcbiAgICAgKiBBbGxvd3MgbmVnYXRpdmUgdmFsdWVzXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgYWxsb3dOZWdhdGl2ZSA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgc2NpZW50aWZpYyBub3RhdGlvbiBzdXBwb3J0XG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBhbGxvd1NjaWVudGlmaWNOb3RhdGlvbiA9IGlucHV0KHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogTWluaW11bSB2YWx1ZSBhbGxvd2VkXG4gICAgICovXG4gICAgcHVibGljIG1pbiA9IGlucHV0PG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAgIC8qKlxuICAgICAqIE1heGltdW0gdmFsdWUgYWxsb3dlZFxuICAgICAqL1xuICAgIHB1YmxpYyBtYXggPSBpbnB1dDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50Pik7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9jYWxlU2VydmljZSA9IGluamVjdChMb2NhbGVTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gICAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBwcml2YXRlIGRlY2ltYWxTZXBhcmF0b3IgPSAnLCc7XG4gICAgcHJpdmF0ZSB0aG91c2FuZFNlcGFyYXRvciA9ICcuJztcbiAgICBwcml2YXRlIGN1cnJlbnRMb2NhbGUgPSAncHQtQlInO1xuICAgIHByaXZhdGUgbGFzdE1vZGVsVmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dExvY2FsZSA9IHRoaXMubG9jYWxlKCk7XG5cbiAgICAgICAgICAgIGlmIChpbnB1dExvY2FsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudExvY2FsZSA9IGlucHV0TG9jYWxlO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2VwYXJhdG9ycygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm1pbkRlY2ltYWxQbGFjZXMoKSA+IHRoaXMubWF4RGVjaW1hbFBsYWNlcygpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYE51bWVyaWNNYXNrRGlyZWN0aXZlOiBtaW5EZWNpbWFsUGxhY2VzICgke3RoaXMubWluRGVjaW1hbFBsYWNlcygpfSkgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBtYXhEZWNpbWFsUGxhY2VzICgke3RoaXMubWF4RGVjaW1hbFBsYWNlcygpfSlgXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubG9jYWxlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExvY2FsZSA9IHRoaXMubG9jYWxlKCkhO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTZXBhcmF0b3JzKCk7XG4gICAgICAgICAgICB0aGlzLnNldElucHV0TW9kZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubG9jYWxlU2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5sb2NhbGVTZXJ2aWNlLmdldCgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TG9jYWxlID0gdGhpcy5sb2NhbGVTZXJ2aWNlIS5nZXRMb2NhbGVPcHRpb25zKCk/LmxvY2FsZSB8fCAncHQtQlInO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2VwYXJhdG9ycygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SW5wdXRNb2RlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2VwYXJhdG9ycygpO1xuICAgICAgICAgICAgdGhpcy5zZXRJbnB1dE1vZGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3RlbmVyIGZvciBpbnB1dCBldmVudHMgKHR5cGluZylcbiAgICAgKi9cbiAgICBwdWJsaWMgb25JbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgbGV0IHZhbHVlID0gaW5wdXQudmFsdWU7XG4gICAgICAgIHZhbHVlID0gdGhpcy5ub3JtYWxpemVTZXBhcmF0b3JzKHZhbHVlKTtcbiAgICAgICAgdGhpcy5wcm9jZXNzSW5wdXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdGVuZXIgZm9yIGZvY3VzIGV2ZW50cyAoZ2FpbmluZyBmb2N1cylcbiAgICAgKi9cbiAgICBwdWJsaWMgb25Gb2N1cygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gaW5wdXQudmFsdWU7XG5cbiAgICAgICAgaWYgKCFjdXJyZW50VmFsdWUgfHwgY3VycmVudFZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxhc3RNb2RlbFZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSB0aGlzLmxhc3RNb2RlbFZhbHVlLnJlcGxhY2UoJy4nLCB0aGlzLmRlY2ltYWxTZXBhcmF0b3IpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShpbnB1dCwgJ3ZhbHVlJywgZGlzcGxheVZhbHVlKTtcbiAgICAgICAgICAgIGlucHV0LnNlbGVjdCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbW9kZWxWYWx1ZSA9IHRoaXMudG9Nb2RlbFZhbHVlKGN1cnJlbnRWYWx1ZSk7XG5cbiAgICAgICAgaWYgKCFtb2RlbFZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSBtb2RlbFZhbHVlLnJlcGxhY2UoJy4nLCB0aGlzLmRlY2ltYWxTZXBhcmF0b3IpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KGlucHV0LCAndmFsdWUnLCBkaXNwbGF5VmFsdWUpO1xuICAgICAgICBpbnB1dC5zZWxlY3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW5lciBmb3IgYmx1ciBldmVudHMgKGZvY3VzIGxvc3MpXG4gICAgICovXG4gICAgcHVibGljIG9uQmx1cigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcblxuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZTtcblxuICAgICAgICBpZiAoIWN1cnJlbnRWYWx1ZSB8fCBjdXJyZW50VmFsdWUudHJpbSgpID09PSAnJykge1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZShudWxsKTtcbiAgICAgICAgICAgIHRoaXMubGFzdE1vZGVsVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbW9kZWxWYWx1ZSA9IHRoaXMudG9Nb2RlbFZhbHVlKGN1cnJlbnRWYWx1ZSk7XG5cbiAgICAgICAgaWYgKCFtb2RlbFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgICAgICAgdGhpcy5sYXN0TW9kZWxWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxhc3RNb2RlbFZhbHVlID0gbW9kZWxWYWx1ZTtcbiAgICAgICAgY29uc3QgZGlzcGxheVZhbHVlID0gdGhpcy5mcm9tTW9kZWxWYWx1ZShtb2RlbFZhbHVlKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgZGlzcGxheVZhbHVlKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZShtb2RlbFZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW5lciBmb3IgcGFzdGUgZXZlbnRzIChjbGlwYm9hcmQpXG4gICAgICovXG4gICAgcHVibGljIG9uUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGV2ZW50LmNsaXBib2FyZERhdGE/LmdldERhdGEoJ3RleHQnKSB8fCAnJztcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5wYXJzZUNsaXBib2FyZFZhbHVlKHBhc3RlZFRleHQpO1xuXG4gICAgICAgIHRoaXMucHJvY2Vzc0lucHV0VmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3RlbmVyIGZvciBzcGVjaWFsIGtleXMgKCsgYW5kIC0pXG4gICAgICovXG4gICAgcHVibGljIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBrZXkgPSBldmVudC5rZXk7XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJy0nIHx8IGtleSA9PT0gJysnKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnNvclBvc2l0aW9uID0gaW5wdXQuc2VsZWN0aW9uU3RhcnQgfHwgMDtcblxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJy0nICYmIHRoaXMuYWxsb3dTY2llbnRpZmljTm90YXRpb24oKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJCZWZvcmVDdXJzb3IgPSB2YWx1ZVtjdXJzb3JQb3NpdGlvbiAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChjaGFyQmVmb3JlQ3Vyc29yID09PSAnZScgfHwgY2hhckJlZm9yZUN1cnNvciA9PT0gJ0UnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYWxsb3dOZWdhdGl2ZSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVNpZ24odmFsdWUsIGtleSA9PT0gJy0nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3RlbmVyIGZvciBrZXlwcmVzcyB0byBibG9jayBpbnZhbGlkIGNoYXJhY3RlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgb25LZXlQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBrZXkgPSBldmVudC5rZXk7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGN1cnNvclBvc2l0aW9uID0gaW5wdXQuc2VsZWN0aW9uU3RhcnQgfHwgMDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBpbnB1dC52YWx1ZTtcblxuICAgICAgICBpZiAoKGtleSA9PT0gJy0nIHx8IGtleSA9PT0gJysnKSAmJiB0aGlzLmFsbG93U2NpZW50aWZpY05vdGF0aW9uKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYXJCZWZvcmVDdXJzb3IgPSB2YWx1ZVtjdXJzb3JQb3NpdGlvbiAtIDFdO1xuICAgICAgICAgICAgaWYgKGNoYXJCZWZvcmVDdXJzb3IgPT09ICdlJyB8fCBjaGFyQmVmb3JlQ3Vyc29yID09PSAnRScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5ID09PSAnKycgfHwga2V5ID09PSAnLScpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0RpZ2l0ID0gL15bMC05XSQvLnRlc3Qoa2V5KTtcbiAgICAgICAgY29uc3QgaXNMb2NhbGVEZWNpbWFsU2VwYXJhdG9yID0ga2V5ID09PSB0aGlzLmRlY2ltYWxTZXBhcmF0b3I7XG4gICAgICAgIGNvbnN0IGlzT3RoZXJTZXBhcmF0b3IgPSAoa2V5ID09PSAnLCcgfHwga2V5ID09PSAnLicpICYmIGtleSAhPT0gdGhpcy5kZWNpbWFsU2VwYXJhdG9yO1xuICAgICAgICBjb25zdCBpc1NjaWVudGlmaWNOb3RhdGlvbiA9IChrZXkgPT09ICdlJyB8fCBrZXkgPT09ICdFJykgJiYgdGhpcy5hbGxvd1NjaWVudGlmaWNOb3RhdGlvbigpO1xuICAgICAgICBjb25zdCBpc0NvbnRyb2xLZXkgPSBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuYWx0S2V5O1xuICAgICAgICBjb25zdCBpc1NwZWNpYWxLZXkgPSBbXG4gICAgICAgICAgICAnQmFja3NwYWNlJyxcbiAgICAgICAgICAgICdUYWInLFxuICAgICAgICAgICAgJ0VudGVyJyxcbiAgICAgICAgICAgICdFc2NhcGUnLFxuICAgICAgICAgICAgJ0Fycm93TGVmdCcsXG4gICAgICAgICAgICAnQXJyb3dSaWdodCcsXG4gICAgICAgICAgICAnRGVsZXRlJyxcbiAgICAgICAgICAgICdIb21lJyxcbiAgICAgICAgICAgICdFbmQnLFxuICAgICAgICBdLmluY2x1ZGVzKGtleSk7XG5cbiAgICAgICAgaWYgKGlzT3RoZXJTZXBhcmF0b3IpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNTY2llbnRpZmljTm90YXRpb24pIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcygnZScpIHx8IHZhbHVlLmluY2x1ZGVzKCdFJykpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY2hhckJlZm9yZUN1cnNvciA9IHZhbHVlW2N1cnNvclBvc2l0aW9uIC0gMV07XG4gICAgICAgICAgICBpZiAoIWNoYXJCZWZvcmVDdXJzb3IgfHwgIS9eWzAtOV0kLy50ZXN0KGNoYXJCZWZvcmVDdXJzb3IpKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzRGlnaXQgJiYgIWlzTG9jYWxlRGVjaW1hbFNlcGFyYXRvciAmJiAhaXNTY2llbnRpZmljTm90YXRpb24gJiYgIWlzQ29udHJvbEtleSAmJiAhaXNTcGVjaWFsS2V5KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBzZXBhcmF0b3JzIGFjY29yZGluZyB0byB0aGUgbG9jYWxlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHVwZGF0ZVNlcGFyYXRvcnMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IG5ldyBJbnRsLk51bWJlckZvcm1hdCh0aGlzLmN1cnJlbnRMb2NhbGUpLmZvcm1hdCgxMjM0LjUpO1xuXG4gICAgICAgIHRoaXMudGhvdXNhbmRTZXBhcmF0b3IgPSBmb3JtYXR0ZWRbMV07XG4gICAgICAgIHRoaXMuZGVjaW1hbFNlcGFyYXRvciA9IGZvcm1hdHRlZFs1XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgaW5wdXQgdmFsdWUgYW5kIHVwZGF0ZXMgdGhlIGlucHV0IGFuZCBtb2RlbFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBwcm9jZXNzSW5wdXRWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5kZWNpbWFsU2VwYXJhdG9yIHx8ICF0aGlzLnRob3VzYW5kU2VwYXJhdG9yKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNlcGFyYXRvcnMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbHVlKTtcblxuICAgICAgICBjb25zdCBtb2RlbFZhbHVlID0gdGhpcy50b01vZGVsVmFsdWUodmFsdWUpO1xuXG4gICAgICAgIC8vIER1cmluZyB0eXBpbmcsIGNsZWFyIHRoZSBzdG9yZWQgbW9kZWwgdmFsdWUgc28gb25Gb2N1cyB3aWxsIHJlY2FsY3VsYXRlXG4gICAgICAgIHRoaXMubGFzdE1vZGVsVmFsdWUgPSBudWxsO1xuXG4gICAgICAgIHRoaXMub25DaGFuZ2UobW9kZWxWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBpbnB1dG1vZGUgZm9yIG51bWVyaWMga2V5Ym9hcmQgb24gbW9iaWxlIGRldmljZXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0SW5wdXRNb2RlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2lucHV0bW9kZScsICdkZWNpbWFsJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnYXV0b2NvbXBsZXRlJywgJ29mZicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgc2VwYXJhdG9ycyBmcm9tIGEgZm9ybWF0dGVkIHZhbHVlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbW92ZVNlcGFyYXRvcnModmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHRob3VzYW5kUmVnZXggPSBuZXcgUmVnRXhwKGBcXFxcJHt0aGlzLmVzY2FwZVJlZ2V4KHRoaXMudGhvdXNhbmRTZXBhcmF0b3IpfWAsICdnJyk7XG4gICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKHRob3VzYW5kUmVnZXgsICcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdHJpcHMgdW5uZWNlc3NhcnkgdHJhaWxpbmcgemVyb3MgZnJvbSBkZWNpbWFsIHBhcnRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RyaXBUcmFpbGluZ1plcm9zKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHZhbHVlLnNwbGl0KHRoaXMuZGVjaW1hbFNlcGFyYXRvcik7XG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY2ltYWxQYXJ0ID0gcGFydHNbMV0ucmVwbGFjZSgvMCskLywgJycpO1xuICAgICAgICAgICAgcmV0dXJuIGRlY2ltYWxQYXJ0Lmxlbmd0aCA+IDAgPyBwYXJ0c1swXSArIHRoaXMuZGVjaW1hbFNlcGFyYXRvciArIGRlY2ltYWxQYXJ0IDogcGFydHNbMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZXMgc2VwYXJhdG9ycyBkdXJpbmcgdHlwaW5nXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIG5vcm1hbGl6ZVNlcGFyYXRvcnModmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5yZW1vdmVTZXBhcmF0b3JzKHZhbHVlKTtcblxuICAgICAgICBpZiAodGhpcy5kZWNpbWFsU2VwYXJhdG9yID09PSAnLCcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFwuL2csICcsJyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kZWNpbWFsU2VwYXJhdG9yID09PSAnLicpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvLC9nLCAnLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFydHMgPSB2YWx1ZS5zcGxpdCh0aGlzLmRlY2ltYWxTZXBhcmF0b3IpO1xuICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgdmFsdWUgPSBwYXJ0c1swXSArIHRoaXMuZGVjaW1hbFNlcGFyYXRvciArIHBhcnRzLnNsaWNlKDEpLmpvaW4oJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzY2FwZXMgc3BlY2lhbCBjaGFyYWN0ZXJzIGZvciB1c2UgaW4gcmVnZXhcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZXNjYXBlUmVnZXgoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJ1bmNhdGVzIGEgbnVtYmVyIHRvIHRoZSBzcGVjaWZpZWQgZGVjaW1hbCBwbGFjZXMgKG5ldmVyIHJvdW5kcylcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgdHJ1bmNhdGVUb0RlY2ltYWxQbGFjZXMoYmlnTnVtYmVyOiBCaWdOdW1iZXIsIGRlY2ltYWxQbGFjZXM6IG51bWJlcik6IEJpZ051bWJlciB7XG4gICAgICAgIGlmIChkZWNpbWFsUGxhY2VzIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJpZ051bWJlcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtdWx0aXBsaWVyID0gbmV3IEJpZ051bWJlcigxMCkucG93KGRlY2ltYWxQbGFjZXMpO1xuICAgICAgICByZXR1cm4gYmlnTnVtYmVyLm11bHRpcGxpZWRCeShtdWx0aXBsaWVyKS5pbnRlZ2VyVmFsdWUoQmlnTnVtYmVyLlJPVU5EX0RPV04pLmRpdmlkZWRCeShtdWx0aXBsaWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIHZhbHVlIGhhcyBleGNlc3NpdmUgZGVjaW1hbCBwbGFjZXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgaGFzRXhjZXNzaXZlRGVjaW1hbFBsYWNlcyh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gdmFsdWUuc3BsaXQodGhpcy5kZWNpbWFsU2VwYXJhdG9yKTtcblxuICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29uc3QgZGVjaW1hbFBhcnQgPSBwYXJ0c1sxXS5yZXBsYWNlKC9bXjAtOV0vZywgJycpO1xuICAgICAgICAgICAgcmV0dXJuIGRlY2ltYWxQYXJ0Lmxlbmd0aCA+IHRoaXMubWF4RGVjaW1hbFBsYWNlcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgaW5wdXQgYW5kIG5vdGlmaWVzIHRoZSBtb2RlbFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjbGVhcklucHV0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCAnJyk7XG4gICAgICAgIHRoaXMubGFzdE1vZGVsVmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKG51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIHN0cmluZyB2YWx1ZSB0byBpdHMgbnVtZXJpYyByZXByZXNlbnRhdGlvbiwgaGFuZGxpbmcgc2VwYXJhdG9ycyBhbmQgc2lnblxuICAgICAqIFJldHVybnMgQmlnTnVtYmVyIHRvIHByZXNlcnZlIGZ1bGwgcHJlY2lzaW9uIGFuZCBvcHRpb25hbCBudW1iZXIgY29udmVyc2lvblxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYXJzZVN0cmluZ1RvVmFsdWUodmFsdWU6IHN0cmluZyk6IHsgYmlnTnVtYmVyOiBCaWdOdW1iZXI7IG51bWVyaWM6IG51bWJlcjsgaXNOZWdhdGl2ZTogYm9vbGVhbiB9IHtcbiAgICAgICAgY29uc3QgaXNOZWdhdGl2ZSA9IHZhbHVlLnN0YXJ0c1dpdGgoJy0nKTtcbiAgICAgICAgbGV0IG51bWVyaWNTdHIgPSB2YWx1ZVxuICAgICAgICAgICAgLnJlcGxhY2UoL14tLywgJycpXG4gICAgICAgICAgICAucmVwbGFjZShuZXcgUmVnRXhwKGBcXFxcJHt0aGlzLnRob3VzYW5kU2VwYXJhdG9yfWAsICdnJyksICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UobmV3IFJlZ0V4cChgXFxcXCR7dGhpcy5kZWNpbWFsU2VwYXJhdG9yfWAsICdnJyksICcuJyk7XG5cbiAgICAgICAgaWYgKG51bWVyaWNTdHIgPT09ICcuJyB8fCBudW1lcmljU3RyID09PSAnJykge1xuICAgICAgICAgICAgbnVtZXJpY1N0ciA9ICcwJztcbiAgICAgICAgfSBlbHNlIGlmIChudW1lcmljU3RyLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICAgICAgbnVtZXJpY1N0ciA9ICcwJyArIG51bWVyaWNTdHI7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYmlnTnVtYmVyID0gbmV3IEJpZ051bWJlcihudW1lcmljU3RyKTtcbiAgICAgICAgaWYgKGJpZ051bWJlci5pc05hTigpKSB7XG4gICAgICAgICAgICBiaWdOdW1iZXIgPSBuZXcgQmlnTnVtYmVyKDApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzTmVnYXRpdmUgJiYgdGhpcy5hbGxvd05lZ2F0aXZlKCkpIHtcbiAgICAgICAgICAgIGJpZ051bWJlciA9IGJpZ051bWJlci5uZWdhdGVkKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBiaWdOdW1iZXIsIG51bWVyaWM6IGJpZ051bWJlci50b051bWJlcigpLCBpc05lZ2F0aXZlIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9ybWF0cyBhIG51bWVyaWMgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbGVcbiAgICAgKiBUcnVuY2F0ZXMgKG5ldmVyIHJvdW5kcykgdG8gbWF4RGVjaW1hbFBsYWNlcyBhbmQgcGFkcyB3aXRoIHplcm9zIHRvIG1pbkRlY2ltYWxQbGFjZXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZm9ybWF0TnVtZXJpYyhudW1lcmljOiBudW1iZXIgfCBCaWdOdW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBsZXQgYmlnTnVtZXJpYyA9IG51bWVyaWMgaW5zdGFuY2VvZiBCaWdOdW1iZXIgPyBudW1lcmljIDogbmV3IEJpZ051bWJlcihudW1lcmljKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHRydW5jYXRlZFZhbHVlID0gdGhpcy50cnVuY2F0ZVRvRGVjaW1hbFBsYWNlcyhiaWdOdW1lcmljLCB0aGlzLm1heERlY2ltYWxQbGFjZXMoKSk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCB2YWx1ZVN0ciA9IHRydW5jYXRlZFZhbHVlLnRvRml4ZWQoTWF0aC5tYXgodGhpcy5taW5EZWNpbWFsUGxhY2VzKCksIHRoaXMubWF4RGVjaW1hbFBsYWNlcygpKSk7XG4gICAgICAgIFxuICAgICAgICBsZXQgZm9ybWF0dGVkVmFsdWUgPSB2YWx1ZVN0ci5yZXBsYWNlKCcuJywgdGhpcy5kZWNpbWFsU2VwYXJhdG9yKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHBhcnRzID0gZm9ybWF0dGVkVmFsdWUuc3BsaXQodGhpcy5kZWNpbWFsU2VwYXJhdG9yKTtcbiAgICAgICAgY29uc3QgaW50ZWdlclBhcnQgPSBwYXJ0c1swXTtcbiAgICAgICAgbGV0IGRlY2ltYWxQYXJ0ID0gcGFydHNbMV0gfHwgJyc7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBmb3JtYXR0ZWRJbnRlZ2VyID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMuY3VycmVudExvY2FsZSkuZm9ybWF0KFxuICAgICAgICAgICAgcGFyc2VJbnQoaW50ZWdlclBhcnQsIDEwKSB8fCAwXG4gICAgICAgICkuc3BsaXQodGhpcy5kZWNpbWFsU2VwYXJhdG9yKVswXTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZURlY2ltYWxQbGFjZXMgPSBkZWNpbWFsUGFydC5yZXBsYWNlKC8wKyQvLCAnJykubGVuZ3RoO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgZGVjaW1hbFBsYWNlc1RvU2hvdyA9IE1hdGgubWF4KFxuICAgICAgICAgICAgdGhpcy5taW5EZWNpbWFsUGxhY2VzKCksXG4gICAgICAgICAgICBNYXRoLm1pbihlZmZlY3RpdmVEZWNpbWFsUGxhY2VzLCB0aGlzLm1heERlY2ltYWxQbGFjZXMoKSlcbiAgICAgICAgKTtcbiAgICAgICAgXG4gICAgICAgIGRlY2ltYWxQYXJ0ID0gZGVjaW1hbFBhcnQuc3Vic3RyaW5nKDAsIGRlY2ltYWxQbGFjZXNUb1Nob3cpLnBhZEVuZChkZWNpbWFsUGxhY2VzVG9TaG93LCAnMCcpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlZEludGVnZXIgKyB0aGlzLmRlY2ltYWxTZXBhcmF0b3IgKyBkZWNpbWFsUGFydDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXRzIHRoZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIGxvY2FsZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBmb3JtYXRWYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBudW1lcmljIH0gPSB0aGlzLnBhcnNlU3RyaW5nVG9WYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdE51bWVyaWMobnVtZXJpYyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZvcm1hdHRlZCB2YWx1ZSB0byB0aGUgbW9kZWwgZm9ybWF0IChpbnRlcm5hdGlvbmFsIHN0YW5kYXJkIHN0cmluZylcbiAgICAgKiBBbHdheXMgcmV0dXJucyBkZWNpbWFsIG5vdGF0aW9uLCBuZXZlciBzY2llbnRpZmljIG5vdGF0aW9uXG4gICAgICogU3RvcmVzIHRoZSBmdWxsIHByZWNpc2lvbiB2YWx1ZSB3aXRob3V0IHRydW5jYXRpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgdG9Nb2RlbFZhbHVlKGZvcm1hdHRlZFZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKCFmb3JtYXR0ZWRWYWx1ZSB8fCBmb3JtYXR0ZWRWYWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGJpZ051bWJlciB9ID0gdGhpcy5wYXJzZVN0cmluZ1RvVmFsdWUoZm9ybWF0dGVkVmFsdWUpO1xuICAgICAgICByZXR1cm4gYmlnTnVtYmVyLnRvRml4ZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgbW9kZWwgdmFsdWUgdG8gZGlzcGxheSBmb3JtYXRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZnJvbU1vZGVsVmFsdWUobW9kZWxWYWx1ZTogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB7XG4gICAgICAgIGlmIChtb2RlbFZhbHVlID09PSBudWxsIHx8IG1vZGVsVmFsdWUgPT09IHVuZGVmaW5lZCB8fCBtb2RlbFZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJpZ051bWJlciA9IG5ldyBCaWdOdW1iZXIobW9kZWxWYWx1ZSk7XG4gICAgICAgIGlmIChiaWdOdW1iZXIuaXNOYU4oKSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdE51bWVyaWMoYmlnTnVtYmVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgcGFzdGVkIHZhbHVlIGZyb20gY2xpcGJvYXJkXG4gICAgICogQ29udmVydHMgc2NpZW50aWZpYyBub3RhdGlvbiB0byBkZWNpbWFsIHVzaW5nIEJpZ051bWJlclxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYXJzZUNsaXBib2FyZFZhbHVlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmFsbG93U2NpZW50aWZpY05vdGF0aW9uKCkgJiYgL1tlRV0vLnRlc3QodGV4dCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmlnTnVtZXJpYyA9IG5ldyBCaWdOdW1iZXIodGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKCFiaWdOdW1lcmljLmlzTmFOKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGJpZ051bWVyaWMudG9GaXhlZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIHZvaWQgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVTZXBhcmF0b3JzKHRleHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIHNpZ24gKC0gb3IgKykgb2YgYSB2YWx1ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSB0b2dnbGVTaWduKHZhbHVlOiBzdHJpbmcsIG1ha2VOZWdhdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICBsZXQgbmV3VmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICBpZiAobWFrZU5lZ2F0aXZlICYmICFuZXdWYWx1ZS5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gJy0nICsgbmV3VmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoIW1ha2VOZWdhdGl2ZSAmJiBuZXdWYWx1ZS5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShpbnB1dCwgJ3ZhbHVlJywgbmV3VmFsdWUpO1xuICAgICAgICBjb25zdCBtb2RlbFZhbHVlID0gdGhpcy50b01vZGVsVmFsdWUobmV3VmFsdWUpO1xuICAgICAgICB0aGlzLmxhc3RNb2RlbFZhbHVlID0gbnVsbDtcbiAgICAgICAgdGhpcy5vbkNoYW5nZShtb2RlbFZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZGVjaW1hbFNlcGFyYXRvciB8fCAhdGhpcy50aG91c2FuZFNlcGFyYXRvcikge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTZXBhcmF0b3JzKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGFzRm9jdXMgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKGhhc0ZvY3VzKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMuZnJvbU1vZGVsVmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSB0aGlzLnN0cmlwVHJhaWxpbmdaZXJvcyh0aGlzLnJlbW92ZVNlcGFyYXRvcnMoZm9ybWF0dGVkVmFsdWUpKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHJhd1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5mcm9tTW9kZWxWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCBmb3JtYXR0ZWRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcsIGlzRGlzYWJsZWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29udHJvbC52YWx1ZTtcblxuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG51bWVyaWNWYWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuXG4gICAgICAgIGlmIChpc05hTihudW1lcmljVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5hbGxvd05lZ2F0aXZlKCkgJiYgbnVtZXJpY1ZhbHVlIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbmVnYXRpdmVOb3RBbGxvd2VkOiB0cnVlIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtaW5WYWx1ZSA9IHRoaXMubWluKCk7XG4gICAgICAgIGlmIChtaW5WYWx1ZSAhPT0gdW5kZWZpbmVkICYmIG51bWVyaWNWYWx1ZSA8IG1pblZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1pbjoge1xuICAgICAgICAgICAgICAgICAgICBtaW46IG1pblZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBhY3R1YWw6IG51bWVyaWNWYWx1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1heFZhbHVlID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKG1heFZhbHVlICE9PSB1bmRlZmluZWQgJiYgbnVtZXJpY1ZhbHVlID4gbWF4VmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbWF4OiB7XG4gICAgICAgICAgICAgICAgICAgIG1heDogbWF4VmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbDogbnVtZXJpY1ZhbHVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVjaW1hbFBhcnQgPSB2YWx1ZS5zcGxpdCgnLicpWzFdO1xuXG4gICAgICAgIGlmIChkZWNpbWFsUGFydCAmJiBkZWNpbWFsUGFydC5sZW5ndGggPiB0aGlzLm1heERlY2ltYWxQbGFjZXMoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBleGNlc3NpdmVEZWNpbWFsUGxhY2VzOiB7XG4gICAgICAgICAgICAgICAgICAgIG1heDogdGhpcy5tYXhEZWNpbWFsUGxhY2VzKCksXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbDogZGVjaW1hbFBhcnQubGVuZ3RoLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG4iXX0=