verben-authentication-ui 0.0.8 → 0.1.0

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 (28) hide show
  1. package/esm2022/lib/components/sso/sso-form/sso-form.component.mjs +3 -3
  2. package/esm2022/lib/components/sso/sso.component.mjs +3 -3
  3. package/esm2022/lib/components/user-management/base-table-style.mjs +52 -0
  4. package/esm2022/lib/components/user-management/helper.mjs +24 -0
  5. package/esm2022/lib/components/user-management/useer-management.module.mjs +68 -0
  6. package/esm2022/lib/components/user-management/user-management-form/use-management-form.component.mjs +57 -0
  7. package/esm2022/lib/components/user-management/user-management.columns.mjs +43 -0
  8. package/esm2022/lib/components/user-management/user-management.component.mjs +319 -0
  9. package/esm2022/lib/components/user-request-approval/user-request-approval.component.mjs +4 -4
  10. package/esm2022/lib/components/user-request-approval/user-request-approval.module.mjs +2 -2
  11. package/esm2022/lib/components/user-request-approval/user-request-form/{user-request-form.component.mjs → use-request-form.component.mjs} +1 -1
  12. package/esm2022/lib/models/user-access-request.mjs +1 -1
  13. package/esm2022/lib/models/user.mjs +1 -1
  14. package/esm2022/public-api.mjs +3 -1
  15. package/fesm2022/verben-authentication-ui.mjs +559 -21
  16. package/fesm2022/verben-authentication-ui.mjs.map +1 -1
  17. package/lib/components/user-management/base-table-style.d.ts +1 -0
  18. package/lib/components/user-management/helper.d.ts +2 -0
  19. package/lib/components/user-management/useer-management.module.d.ts +11 -0
  20. package/lib/components/user-management/user-management-form/use-management-form.component.d.ts +20 -0
  21. package/lib/components/user-management/user-management.columns.d.ts +3 -0
  22. package/lib/components/user-management/user-management.component.d.ts +61 -0
  23. package/lib/components/user-request-approval/user-request-approval.module.d.ts +1 -1
  24. package/lib/models/user-access-request.d.ts +1 -1
  25. package/lib/models/user.d.ts +3 -0
  26. package/package.json +2 -2
  27. package/public-api.d.ts +2 -0
  28. /package/lib/components/user-request-approval/user-request-form/{user-request-form.component.d.ts → use-request-form.component.d.ts} +0 -0
@@ -0,0 +1,57 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/forms";
4
+ import * as i2 from "verben-ng-ui";
5
+ export class UserManagementFormComponent {
6
+ fb;
7
+ set currentData(value) {
8
+ if (value?.data) {
9
+ this.form.patchValue({
10
+ MailAddress: value.data.MailAddress || '',
11
+ Name: value.data.Name || '',
12
+ PhoneNumber: value.data.PhoneNumber || '',
13
+ });
14
+ }
15
+ else {
16
+ this.form.reset();
17
+ }
18
+ }
19
+ switchView = new EventEmitter();
20
+ form;
21
+ roles = [
22
+ { id: 'admin', name: 'Admin' },
23
+ { id: 'manager', name: 'Manager' },
24
+ { id: 'staff', name: 'Staff' },
25
+ ];
26
+ constructor(fb) {
27
+ this.fb = fb;
28
+ this.form = this.fb.group({
29
+ MailAddress: ['', { readonly: true }],
30
+ Name: ['', { readonly: true }],
31
+ PhoneNumber: ['', { readonly: true }],
32
+ RoleId: [''],
33
+ });
34
+ }
35
+ ngOnInit() { }
36
+ onSave() {
37
+ if (this.form.valid) {
38
+ // Emit save event with form value
39
+ console.log('Form saved:', this.form.value);
40
+ }
41
+ }
42
+ onDelete() {
43
+ // Emit delete event
44
+ console.log('Delete requested');
45
+ }
46
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: UserManagementFormComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
47
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.11", type: UserManagementFormComponent, selector: "lib-user-request-form", inputs: { currentData: "currentData" }, outputs: { switchView: "switchView" }, ngImport: i0, template: "<form\n [formGroup]=\"form\"\n class=\"flex flex-col px-3 pb-3 rounded-xl h-full w-full relative space-y-4\"\n>\n <verbena-input\n name=\"MailAddress\"\n label=\"Mail Address:\"\n formControlName=\"MailAddress\"\n />\n <verbena-input label=\"Name:\" name=\"Name\" type=\"text\" formControlName=\"Name\" />\n <verbena-input\n label=\"Phone Number:\"\n name=\"PhoneNumber\"\n type=\"tel\"\n formControlName=\"PhoneNumber\"\n />\n\n <div class=\"space-y-1\">\n <label for=\"role\">Role</label>\n\n <verben-drop-down\n label=\"Role\"\n styleClass=\"w-full\"\n width=\"100%\"\n [multiselect]=\"false\"\n [filter]=\"true\"\n [showClear]=\"true\"\n placeholder=\"\"\n [(options)]=\"roles\"\n id=\"role\"\n optionLabel=\"name\"\n optionValue=\"id\"\n formControlName=\"RoleId\"\n class=\"form-control\"\n >\n </verben-drop-down>\n </div>\n\n <!-- buttons -->\n <div\n class=\"flex justify-between bottom-8 left-0 right-0 px-3 pb-2 absolute\"\n style=\"\n display: flex;\n justify-content: space-between;\n position: absolute;\n padding: 8px 12px;\n right: 0;\n left: 0;\n bottom: 32;\n \"\n >\n <!-- <verbena-button\n text=\"Delete\"\n class=\"bg-secondary-200 text-[black]\"\n (click)=\"onDelete()\"\n />\n <verbena-button\n text=\"Save\"\n class=\"bg-primary text-[black]\"\n (click)=\"onSave()\"\n />\n\n <verbena-button\n text=\"Secondary Button\"\n styleType=\"secondary\"\n ></verbena-button> -->\n <verbena-button\n width=\"114px\"\n height=\"39px\"\n text=\"Reject\"\n styleType=\"danger\"\n borderRadius=\"10px\"\n ></verbena-button>\n <verbena-button\n (click)=\"switchView.emit()\"\n text=\"Switch To Table\"\n styleType=\"ylw-outline\"\n ></verbena-button>\n <verbena-button\n text=\"Approve\"\n bgColor=\"#28a745\"\n textColor=\"white\"\n border=\"1px solid #28a745\"\n borderRadius=\"10px\"\n pd=\"10px 20px\"\n width=\"114px\"\n height=\"39px\"\n ></verbena-button>\n </div>\n</form>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { 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"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i2.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "inputWrapperClass", "customErrorMessages"], outputs: ["valueChange"] }, { kind: "component", type: i2.VerbenaButtonComponent, selector: "verbena-button", inputs: ["text", "icon", "svgPosition", "bgColor", "textColor", "border", "borderRadius", "pd", "width", "height", "fontSize", "fontWeight", "disable", "styleType", "svg", "svgWidth", "svgHeight", "svgColor", "buttonClass", "buttonTextClass"] }, { kind: "component", type: i2.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }] });
48
+ }
49
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: UserManagementFormComponent, decorators: [{
50
+ type: Component,
51
+ args: [{ selector: 'lib-user-request-form', template: "<form\n [formGroup]=\"form\"\n class=\"flex flex-col px-3 pb-3 rounded-xl h-full w-full relative space-y-4\"\n>\n <verbena-input\n name=\"MailAddress\"\n label=\"Mail Address:\"\n formControlName=\"MailAddress\"\n />\n <verbena-input label=\"Name:\" name=\"Name\" type=\"text\" formControlName=\"Name\" />\n <verbena-input\n label=\"Phone Number:\"\n name=\"PhoneNumber\"\n type=\"tel\"\n formControlName=\"PhoneNumber\"\n />\n\n <div class=\"space-y-1\">\n <label for=\"role\">Role</label>\n\n <verben-drop-down\n label=\"Role\"\n styleClass=\"w-full\"\n width=\"100%\"\n [multiselect]=\"false\"\n [filter]=\"true\"\n [showClear]=\"true\"\n placeholder=\"\"\n [(options)]=\"roles\"\n id=\"role\"\n optionLabel=\"name\"\n optionValue=\"id\"\n formControlName=\"RoleId\"\n class=\"form-control\"\n >\n </verben-drop-down>\n </div>\n\n <!-- buttons -->\n <div\n class=\"flex justify-between bottom-8 left-0 right-0 px-3 pb-2 absolute\"\n style=\"\n display: flex;\n justify-content: space-between;\n position: absolute;\n padding: 8px 12px;\n right: 0;\n left: 0;\n bottom: 32;\n \"\n >\n <!-- <verbena-button\n text=\"Delete\"\n class=\"bg-secondary-200 text-[black]\"\n (click)=\"onDelete()\"\n />\n <verbena-button\n text=\"Save\"\n class=\"bg-primary text-[black]\"\n (click)=\"onSave()\"\n />\n\n <verbena-button\n text=\"Secondary Button\"\n styleType=\"secondary\"\n ></verbena-button> -->\n <verbena-button\n width=\"114px\"\n height=\"39px\"\n text=\"Reject\"\n styleType=\"danger\"\n borderRadius=\"10px\"\n ></verbena-button>\n <verbena-button\n (click)=\"switchView.emit()\"\n text=\"Switch To Table\"\n styleType=\"ylw-outline\"\n ></verbena-button>\n <verbena-button\n text=\"Approve\"\n bgColor=\"#28a745\"\n textColor=\"white\"\n border=\"1px solid #28a745\"\n borderRadius=\"10px\"\n pd=\"10px 20px\"\n width=\"114px\"\n height=\"39px\"\n ></verbena-button>\n </div>\n</form>\n" }]
52
+ }], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { currentData: [{
53
+ type: Input
54
+ }], switchView: [{
55
+ type: Output
56
+ }] } });
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLW1hbmFnZW1lbnQtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tYXV0aGVudGljYXRpb24tdWkvc3JjL2xpYi9jb21wb25lbnRzL3VzZXItbWFuYWdlbWVudC91c2VyLW1hbmFnZW1lbnQtZm9ybS91c2UtbWFuYWdlbWVudC1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi1hdXRoZW50aWNhdGlvbi11aS9zcmMvbGliL2NvbXBvbmVudHMvdXNlci1tYW5hZ2VtZW50L3VzZXItbWFuYWdlbWVudC1mb3JtL3VzZXItbWFuYWdlbWVudC1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUFnQnZFLE1BQU0sT0FBTywyQkFBMkI7SUFzQmxCO0lBckJwQixJQUFhLFdBQVcsQ0FBQyxLQUFzQjtRQUM3QyxJQUFJLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFDbkIsV0FBVyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUU7Z0JBQ3pDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFO2dCQUMzQixXQUFXLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRTthQUMxQyxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7SUFDUyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUVyRCxJQUFJLENBQVk7SUFFaEIsS0FBSyxHQUFtQztRQUN0QyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtRQUM5QixFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtRQUNsQyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtLQUMvQixDQUFDO0lBRUYsWUFBb0IsRUFBZTtRQUFmLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDakMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUN4QixXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDckMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1lBQzlCLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUNyQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7U0FDYixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUSxLQUFVLENBQUM7SUFFbkIsTUFBTTtRQUNKLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNwQixrQ0FBa0M7WUFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxDQUFDO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixvQkFBb0I7UUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7d0dBM0NVLDJCQUEyQjs0RkFBM0IsMkJBQTJCLDRJQ2hCeEMsNnBFQTBGQTs7NEZEMUVhLDJCQUEyQjtrQkFMdkMsU0FBUzsrQkFDRSx1QkFBdUI7Z0ZBS3BCLFdBQVc7c0JBQXZCLEtBQUs7Z0JBV0ksVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ2FyZERhdGEgfSBmcm9tICd2ZXJiZW4tbmctdWknO1xuLy8gaW1wb3J0IHsgcm9sZXMgfSBmcm9tICcuLi9oZWxwZXInO1xuXG5pbnRlcmZhY2UgVXNlckZvcm1EYXRhIHtcbiAgTWFpbEFkZHJlc3M6IHN0cmluZztcbiAgTmFtZTogc3RyaW5nO1xuICBQaG9uZU51bWJlcjogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItdXNlci1yZXF1ZXN0LWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1tYW5hZ2VtZW50LWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vdXNlci1tYW5hZ2VtZW50LWZvcm0uY29tcG9uZW50LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIFVzZXJNYW5hZ2VtZW50Rm9ybUNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIHNldCBjdXJyZW50RGF0YSh2YWx1ZTogQ2FyZERhdGEgfCBudWxsKSB7XG4gICAgaWYgKHZhbHVlPy5kYXRhKSB7XG4gICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIE1haWxBZGRyZXNzOiB2YWx1ZS5kYXRhLk1haWxBZGRyZXNzIHx8ICcnLFxuICAgICAgICBOYW1lOiB2YWx1ZS5kYXRhLk5hbWUgfHwgJycsXG4gICAgICAgIFBob25lTnVtYmVyOiB2YWx1ZS5kYXRhLlBob25lTnVtYmVyIHx8ICcnLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybS5yZXNldCgpO1xuICAgIH1cbiAgfVxuICBAT3V0cHV0KCkgc3dpdGNoVmlldyA9IG5ldyBFdmVudEVtaXR0ZXI8dW5kZWZpbmVkPigpO1xuXG4gIGZvcm06IEZvcm1Hcm91cDtcblxuICByb2xlczogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdID0gW1xuICAgIHsgaWQ6ICdhZG1pbicsIG5hbWU6ICdBZG1pbicgfSxcbiAgICB7IGlkOiAnbWFuYWdlcicsIG5hbWU6ICdNYW5hZ2VyJyB9LFxuICAgIHsgaWQ6ICdzdGFmZicsIG5hbWU6ICdTdGFmZicgfSxcbiAgXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBGb3JtQnVpbGRlcikge1xuICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgTWFpbEFkZHJlc3M6IFsnJywgeyByZWFkb25seTogdHJ1ZSB9XSxcbiAgICAgIE5hbWU6IFsnJywgeyByZWFkb25seTogdHJ1ZSB9XSxcbiAgICAgIFBob25lTnVtYmVyOiBbJycsIHsgcmVhZG9ubHk6IHRydWUgfV0sXG4gICAgICBSb2xlSWQ6IFsnJ10sXG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHt9XG5cbiAgb25TYXZlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZvcm0udmFsaWQpIHtcbiAgICAgIC8vIEVtaXQgc2F2ZSBldmVudCB3aXRoIGZvcm0gdmFsdWVcbiAgICAgIGNvbnNvbGUubG9nKCdGb3JtIHNhdmVkOicsIHRoaXMuZm9ybS52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgb25EZWxldGUoKTogdm9pZCB7XG4gICAgLy8gRW1pdCBkZWxldGUgZXZlbnRcbiAgICBjb25zb2xlLmxvZygnRGVsZXRlIHJlcXVlc3RlZCcpO1xuICB9XG59XG4iLCI8Zm9ybVxuICBbZm9ybUdyb3VwXT1cImZvcm1cIlxuICBjbGFzcz1cImZsZXggZmxleC1jb2wgcHgtMyBwYi0zIHJvdW5kZWQteGwgaC1mdWxsIHctZnVsbCByZWxhdGl2ZSBzcGFjZS15LTRcIlxuPlxuICA8dmVyYmVuYS1pbnB1dFxuICAgIG5hbWU9XCJNYWlsQWRkcmVzc1wiXG4gICAgbGFiZWw9XCJNYWlsIEFkZHJlc3M6XCJcbiAgICBmb3JtQ29udHJvbE5hbWU9XCJNYWlsQWRkcmVzc1wiXG4gIC8+XG4gIDx2ZXJiZW5hLWlucHV0IGxhYmVsPVwiTmFtZTpcIiBuYW1lPVwiTmFtZVwiIHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiTmFtZVwiIC8+XG4gIDx2ZXJiZW5hLWlucHV0XG4gICAgbGFiZWw9XCJQaG9uZSBOdW1iZXI6XCJcbiAgICBuYW1lPVwiUGhvbmVOdW1iZXJcIlxuICAgIHR5cGU9XCJ0ZWxcIlxuICAgIGZvcm1Db250cm9sTmFtZT1cIlBob25lTnVtYmVyXCJcbiAgLz5cblxuICA8ZGl2IGNsYXNzPVwic3BhY2UteS0xXCI+XG4gICAgPGxhYmVsIGZvcj1cInJvbGVcIj5Sb2xlPC9sYWJlbD5cblxuICAgIDx2ZXJiZW4tZHJvcC1kb3duXG4gICAgICBsYWJlbD1cIlJvbGVcIlxuICAgICAgc3R5bGVDbGFzcz1cInctZnVsbFwiXG4gICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgW211bHRpc2VsZWN0XT1cImZhbHNlXCJcbiAgICAgIFtmaWx0ZXJdPVwidHJ1ZVwiXG4gICAgICBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgcGxhY2Vob2xkZXI9XCJcIlxuICAgICAgWyhvcHRpb25zKV09XCJyb2xlc1wiXG4gICAgICBpZD1cInJvbGVcIlxuICAgICAgb3B0aW9uTGFiZWw9XCJuYW1lXCJcbiAgICAgIG9wdGlvblZhbHVlPVwiaWRcIlxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiUm9sZUlkXCJcbiAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICA+XG4gICAgPC92ZXJiZW4tZHJvcC1kb3duPlxuICA8L2Rpdj5cblxuICA8IS0tIGJ1dHRvbnMgLS0+XG4gIDxkaXZcbiAgICBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGJvdHRvbS04IGxlZnQtMCByaWdodC0wIHB4LTMgcGItMiBhYnNvbHV0ZVwiXG4gICAgc3R5bGU9XCJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBwYWRkaW5nOiA4cHggMTJweDtcbiAgICAgIHJpZ2h0OiAwO1xuICAgICAgbGVmdDogMDtcbiAgICAgIGJvdHRvbTogMzI7XG4gICAgXCJcbiAgPlxuICAgIDwhLS0gPHZlcmJlbmEtYnV0dG9uXG4gICAgICB0ZXh0PVwiRGVsZXRlXCJcbiAgICAgIGNsYXNzPVwiYmctc2Vjb25kYXJ5LTIwMCB0ZXh0LVtibGFja11cIlxuICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlKClcIlxuICAgIC8+XG4gICAgPHZlcmJlbmEtYnV0dG9uXG4gICAgICB0ZXh0PVwiU2F2ZVwiXG4gICAgICBjbGFzcz1cImJnLXByaW1hcnkgdGV4dC1bYmxhY2tdXCJcbiAgICAgIChjbGljayk9XCJvblNhdmUoKVwiXG4gICAgLz5cblxuICAgIDx2ZXJiZW5hLWJ1dHRvblxuICAgICAgdGV4dD1cIlNlY29uZGFyeSBCdXR0b25cIlxuICAgICAgc3R5bGVUeXBlPVwic2Vjb25kYXJ5XCJcbiAgICA+PC92ZXJiZW5hLWJ1dHRvbj4gLS0+XG4gICAgPHZlcmJlbmEtYnV0dG9uXG4gICAgICB3aWR0aD1cIjExNHB4XCJcbiAgICAgIGhlaWdodD1cIjM5cHhcIlxuICAgICAgdGV4dD1cIlJlamVjdFwiXG4gICAgICBzdHlsZVR5cGU9XCJkYW5nZXJcIlxuICAgICAgYm9yZGVyUmFkaXVzPVwiMTBweFwiXG4gICAgPjwvdmVyYmVuYS1idXR0b24+XG4gICAgPHZlcmJlbmEtYnV0dG9uXG4gICAgICAoY2xpY2spPVwic3dpdGNoVmlldy5lbWl0KClcIlxuICAgICAgdGV4dD1cIlN3aXRjaCBUbyBUYWJsZVwiXG4gICAgICBzdHlsZVR5cGU9XCJ5bHctb3V0bGluZVwiXG4gICAgPjwvdmVyYmVuYS1idXR0b24+XG4gICAgPHZlcmJlbmEtYnV0dG9uXG4gICAgICB0ZXh0PVwiQXBwcm92ZVwiXG4gICAgICBiZ0NvbG9yPVwiIzI4YTc0NVwiXG4gICAgICB0ZXh0Q29sb3I9XCJ3aGl0ZVwiXG4gICAgICBib3JkZXI9XCIxcHggc29saWQgIzI4YTc0NVwiXG4gICAgICBib3JkZXJSYWRpdXM9XCIxMHB4XCJcbiAgICAgIHBkPVwiMTBweCAyMHB4XCJcbiAgICAgIHdpZHRoPVwiMTE0cHhcIlxuICAgICAgaGVpZ2h0PVwiMzlweFwiXG4gICAgPjwvdmVyYmVuYS1idXR0b24+XG4gIDwvZGl2PlxuPC9mb3JtPlxuIl19
@@ -0,0 +1,43 @@
1
+ export const columns = [
2
+ {
3
+ id: 'createdAt',
4
+ header: 'CREATED',
5
+ accessorKey: 'CreatedAt',
6
+ },
7
+ {
8
+ id: 'user',
9
+ header: 'NAME',
10
+ accessorKey: 'Name',
11
+ },
12
+ {
13
+ id: 'mail',
14
+ header: 'E-Mail',
15
+ accessorKey: 'MailAddress',
16
+ },
17
+ {
18
+ id: 'phone',
19
+ header: 'PHONE NUMBER',
20
+ accessorKey: 'PhoneNumber',
21
+ },
22
+ {
23
+ id: 'address',
24
+ header: 'ADDRESS',
25
+ accessorKey: 'Address',
26
+ },
27
+ {
28
+ id: 'role',
29
+ header: 'ROLE',
30
+ accessorKey: 'Role',
31
+ },
32
+ {
33
+ id: 'status',
34
+ header: 'STATUS',
35
+ accessorKey: 'Status',
36
+ },
37
+ {
38
+ id: 'actions',
39
+ header: 'ACTIONS',
40
+ accessorKey: 'MailAddress'
41
+ },
42
+ ];
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1tYW5hZ2VtZW50LmNvbHVtbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tYXV0aGVudGljYXRpb24tdWkvc3JjL2xpYi9jb21wb25lbnRzL3VzZXItbWFuYWdlbWVudC91c2VyLW1hbmFnZW1lbnQuY29sdW1ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQTBDO0lBQzVEO1FBQ0UsRUFBRSxFQUFFLFdBQVc7UUFDZixNQUFNLEVBQUUsU0FBUztRQUNqQixXQUFXLEVBQUUsV0FBVztLQUN6QjtJQUNEO1FBQ0UsRUFBRSxFQUFFLE1BQU07UUFDVixNQUFNLEVBQUUsTUFBTTtRQUNkLFdBQVcsRUFBRSxNQUFNO0tBQ3BCO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsTUFBTTtRQUNWLE1BQU0sRUFBRSxRQUFRO1FBQ2hCLFdBQVcsRUFBRSxhQUFhO0tBQzNCO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsT0FBTztRQUNYLE1BQU0sRUFBRSxjQUFjO1FBQ3RCLFdBQVcsRUFBRSxhQUFhO0tBQzNCO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsU0FBUztRQUNiLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLFdBQVcsRUFBRSxTQUFTO0tBQ3ZCO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsTUFBTTtRQUNWLE1BQU0sRUFBRSxNQUFNO1FBQ2QsV0FBVyxFQUFFLE1BQU07S0FFcEI7SUFDRDtRQUNFLEVBQUUsRUFBRSxRQUFRO1FBQ1osTUFBTSxFQUFFLFFBQVE7UUFDaEIsV0FBVyxFQUFFLFFBQVE7S0FFdEI7SUFDRDtRQUNFLEVBQUUsRUFBRSxTQUFTO1FBQ2IsTUFBTSxFQUFFLFNBQVM7UUFDakIsV0FBVyxFQUFFLGFBQWE7S0FDM0I7Q0FFRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29sdW1uRGVmaW5pdGlvbiB9IGZyb20gJ3ZlcmJlbi1uZy11aSc7XG5pbXBvcnQgeyBVc2VyQWNjZXNzUmVxdWVzdCB9IGZyb20gJy4uLy4uL21vZGVscy91c2VyLWFjY2Vzcy1yZXF1ZXN0JztcblxuXG5leHBvcnQgY29uc3QgY29sdW1uczogQ29sdW1uRGVmaW5pdGlvbjxVc2VyQWNjZXNzUmVxdWVzdD5bXSA9IFtcbiAge1xuICAgIGlkOiAnY3JlYXRlZEF0JyxcbiAgICBoZWFkZXI6ICdDUkVBVEVEJyxcbiAgICBhY2Nlc3NvcktleTogJ0NyZWF0ZWRBdCcsXG4gIH0sXG4gIHtcbiAgICBpZDogJ3VzZXInLFxuICAgIGhlYWRlcjogJ05BTUUnLFxuICAgIGFjY2Vzc29yS2V5OiAnTmFtZScsXG4gIH0sXG4gIHtcbiAgICBpZDogJ21haWwnLFxuICAgIGhlYWRlcjogJ0UtTWFpbCcsXG4gICAgYWNjZXNzb3JLZXk6ICdNYWlsQWRkcmVzcycsXG4gIH0sXG4gIHtcbiAgICBpZDogJ3Bob25lJyxcbiAgICBoZWFkZXI6ICdQSE9ORSBOVU1CRVInLFxuICAgIGFjY2Vzc29yS2V5OiAnUGhvbmVOdW1iZXInLFxuICB9LFxuICB7XG4gICAgaWQ6ICdhZGRyZXNzJyxcbiAgICBoZWFkZXI6ICdBRERSRVNTJyxcbiAgICBhY2Nlc3NvcktleTogJ0FkZHJlc3MnLFxuICB9LFxuICB7XG4gICAgaWQ6ICdyb2xlJyxcbiAgICBoZWFkZXI6ICdST0xFJyxcbiAgICBhY2Nlc3NvcktleTogJ1JvbGUnLFxuXG4gIH0sXG4gIHtcbiAgICBpZDogJ3N0YXR1cycsXG4gICAgaGVhZGVyOiAnU1RBVFVTJyxcbiAgICBhY2Nlc3NvcktleTogJ1N0YXR1cycsXG5cbiAgfSxcbiAge1xuICAgIGlkOiAnYWN0aW9ucycsXG4gICAgaGVhZGVyOiAnQUNUSU9OUycsXG4gICAgYWNjZXNzb3JLZXk6ICdNYWlsQWRkcmVzcydcbiAgfSxcblxuXTtcbiJdfQ==
@@ -0,0 +1,319 @@
1
+ import { Component, ViewChild } from '@angular/core';
2
+ import { columns } from './user-management.columns';
3
+ import { mockData } from './helper';
4
+ import { baseStyle } from './base-table-style';
5
+ import { DataFilterType } from 'verben-ng-ui';
6
+ import { UserAccessRequestStatus } from '../../models/user-access-request-status';
7
+ import { ObjectState } from '../../models/object-state';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/common";
10
+ import * as i2 from "verben-ng-ui";
11
+ import * as i3 from "@angular/forms";
12
+ import * as i4 from "./user-management-form/use-management-form.component";
13
+ export class UserManagementComponent {
14
+ cardDataView;
15
+ dataView;
16
+ columns = columns;
17
+ data = mockData;
18
+ styles = baseStyle;
19
+ selectedParent;
20
+ basicOption;
21
+ selectedOption = [];
22
+ selectedOptionTwo = [];
23
+ selectedOptionThree;
24
+ missingObject;
25
+ generateNewUserAccessRequest() {
26
+ const newId = this.data.length + 1; // Incremental ID based on current data length
27
+ return {
28
+ Name: `User ${newId}`,
29
+ Id: `${newId}`,
30
+ id: newId,
31
+ MailAddress: ` `,
32
+ PhoneNumber: ``,
33
+ Status: UserAccessRequestStatus.Pending,
34
+ Address: ` `,
35
+ Password: ' ',
36
+ ExpireOn: new Date(),
37
+ IsSeeded: false,
38
+ OTPExpireOn: new Date(),
39
+ Tenants: [`Tenant${newId}`],
40
+ Role: ["User"],
41
+ CreatedAt: new Date(),
42
+ UpdatedAt: new Date(),
43
+ State: ObjectState.New,
44
+ Tenant: `Tenant${newId}`
45
+ };
46
+ }
47
+ // Function to add a new user to mockData
48
+ addNewUserToMockData() {
49
+ const newUser = this.generateNewUserAccessRequest();
50
+ this.data.push(newUser); // Adds the new user to the data array
51
+ // Optionally, update cardData with the new user entry for card display
52
+ const newCardData = {
53
+ selected: false,
54
+ title: newUser.Name,
55
+ data: {
56
+ Name: newUser.Name,
57
+ MailAddress: newUser.MailAddress,
58
+ PhoneNumber: newUser.PhoneNumber,
59
+ RoleID: newUser.Role,
60
+ Status: newUser.Status,
61
+ },
62
+ body: [
63
+ { title: 'Name', value: newUser.Name },
64
+ { title: 'E-Mail Address', value: newUser.MailAddress },
65
+ { title: 'Phone Number', value: newUser.PhoneNumber ?? '' },
66
+ ],
67
+ children: [],
68
+ };
69
+ this.cardData.push(newCardData); // Update cardData array with the new user
70
+ return newUser;
71
+ }
72
+ // Grid view properties
73
+ isGridView = true;
74
+ currentData;
75
+ selectedColumnCount = 0;
76
+ selectedFilterTableCount = 0;
77
+ isOPen = true;
78
+ selectedSortCount = 0;
79
+ showColumn = false;
80
+ showSort = false;
81
+ selectedAll = false;
82
+ visibleColumns = columns.map((col) => ({
83
+ checked: false,
84
+ name: typeof col.header === 'string' ? col.header : col.id,
85
+ type: DataFilterType.Bool,
86
+ }));
87
+ filterArray = [
88
+ { name: 'Name', type: DataFilterType.String, checked: false },
89
+ { name: 'MailAddress', type: DataFilterType.String, checked: false },
90
+ { name: 'PhoneNumber', type: DataFilterType.String, checked: false },
91
+ { name: 'CreatedAt', type: DataFilterType.Date, checked: false },
92
+ ];
93
+ sortOptions = [
94
+ { name: 'Name', type: DataFilterType.String, checked: false },
95
+ { name: 'MailAddress', type: DataFilterType.String, checked: false },
96
+ { name: 'PhoneNumber', type: DataFilterType.String, checked: false },
97
+ { name: 'CreatedAt', type: DataFilterType.Date, checked: false },
98
+ ];
99
+ testParents = [
100
+ { Id: '1', Name: 'Manager' },
101
+ { Id: '2', Name: 'Administrator' },
102
+ { Id: '3', Name: 'Jelom' },
103
+ ];
104
+ cardData = mockData.map(({ Name, MailAddress, PhoneNumber, RoleID, Status }) => ({
105
+ selected: false,
106
+ title: Name,
107
+ data: {
108
+ Name,
109
+ MailAddress,
110
+ PhoneNumber,
111
+ RoleID,
112
+ Status,
113
+ },
114
+ body: [
115
+ { title: 'Name', value: Name },
116
+ { title: 'E-Mail Address', value: MailAddress },
117
+ { title: 'Phone Number', value: PhoneNumber ?? '' },
118
+ ],
119
+ children: [],
120
+ }));
121
+ ngOnInit() {
122
+ this.selectedParent = '1';
123
+ this.selectedOption = ['Opt 1'];
124
+ this.selectedOptionTwo = ['1'];
125
+ this.selectedOptionThree = '1';
126
+ }
127
+ getParentLabel(context) {
128
+ console.log({ MissingObj: this.missingObject });
129
+ return this.missingObject.Name;
130
+ }
131
+ async loadMoreParents(event) {
132
+ console.log({ ParentLoadEvent: JSON.parse(JSON.stringify(event)) });
133
+ return await new Promise((resolve) => setTimeout(() => resolve([
134
+ { Id: '1', Name: 'Jimly' },
135
+ { Id: '2', Name: 'Jecil' },
136
+ { Id: '3', Name: 'Jelom' },
137
+ { Id: '4', Name: 'Jemima' },
138
+ { Id: '5', Name: 'Akintunde' },
139
+ ]), 3000));
140
+ }
141
+ onDropdownChange(event) {
142
+ // console.log({
143
+ // 'Test Parent Value': this.selectedParent,
144
+ // ...
145
+ // });
146
+ }
147
+ onSelectionChange(selectedRows) {
148
+ console.log('Selection changed:', selectedRows);
149
+ // Handle the selection change
150
+ }
151
+ handleExport(exportedData) {
152
+ console.log('Exported data:', exportedData);
153
+ this.downloadCSV(exportedData);
154
+ }
155
+ downloadCSV(data) {
156
+ const headers = Object.keys(data[0]);
157
+ const csvContent = [
158
+ headers.join(','),
159
+ ...data.map((row) => headers.map((header) => row[header]).join(',')),
160
+ ].join('\n');
161
+ const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
162
+ const link = document.createElement('a');
163
+ if (link.download !== undefined) {
164
+ const url = URL.createObjectURL(blob);
165
+ link.setAttribute('href', url);
166
+ link.setAttribute('download', 'export.csv');
167
+ link.style.visibility = 'hidden';
168
+ document.body.appendChild(link);
169
+ link.click();
170
+ document.body.removeChild(link);
171
+ }
172
+ }
173
+ // applyFilters() {
174
+ // this.filteredData = this.data.filter((item) => {
175
+ // return this.filterArray.every((filter) => {
176
+ // if (filter.checked) {
177
+ // switch (filter.type) {
178
+ // case DataFilterType.String:
179
+ // return item[filter.name].toLowerCase().includes(filter.name.toLowerCase());
180
+ // case DataFilterType.Date:
181
+ // return new Date(item[filter.name]) >= new Date(filter.name);
182
+ // default:
183
+ // return true;
184
+ // }
185
+ // }
186
+ // return true;
187
+ // });
188
+ // });
189
+ // }
190
+ getCardDataByMailAddress(mailAddress) {
191
+ console.log("cardData array:", this.cardData);
192
+ console.log(mailAddress);
193
+ return this.cardData.find(({ data }) => data?.MailAddress === mailAddress);
194
+ }
195
+ openDetailView(mailAddress) {
196
+ const cardItem = this.getCardDataByMailAddress(mailAddress);
197
+ console.log(cardItem);
198
+ if (cardItem && this.cardDataView) {
199
+ this.dataView.toggleView();
200
+ // First reset all selections
201
+ this.cardData.forEach((item) => {
202
+ item.selected = false;
203
+ if (item.children) {
204
+ item.children.forEach((child) => (child.selected = false));
205
+ }
206
+ });
207
+ // Set the selected item
208
+ cardItem.selected = true;
209
+ this.currentData = this.cardDataView.onItemClick(cardItem);
210
+ // Force change detection if needed
211
+ // this.changeDetectorRef.detectChanges();
212
+ }
213
+ }
214
+ newItem() {
215
+ const newData = this.addNewUserToMockData();
216
+ const newCardData = {
217
+ selected: true,
218
+ title: newData.Name,
219
+ data: {
220
+ ...newData,
221
+ },
222
+ body: [
223
+ { title: 'Name', value: newData.Name },
224
+ { title: 'E-Mail Address', value: newData.MailAddress },
225
+ { title: 'Phone Number', value: newData.PhoneNumber ?? '' },
226
+ ],
227
+ children: [],
228
+ };
229
+ if (this.dataView.isTableView) {
230
+ this.dataView.toggleView();
231
+ }
232
+ // First reset all selections
233
+ this.cardData.forEach((item) => {
234
+ item.selected = false;
235
+ if (item.children) {
236
+ item.children.forEach((child) => (child.selected = false));
237
+ }
238
+ });
239
+ // this.cardData = [newCardData].concat(this.cardData);
240
+ // this.cardDataView.onItemClick(newCardData)
241
+ this.cardData = [newCardData, ...this.cardData];
242
+ this.currentData = this.cardDataView.onItemClick(newCardData);
243
+ }
244
+ toggleChildView(action) {
245
+ if (action === 'create') {
246
+ const newCard = {
247
+ selected: false,
248
+ title: 'New Card', // Default title, change as needed
249
+ data: { Name: '', MailAddress: '', PhoneNumber: '' },
250
+ body: [
251
+ { title: 'Name', value: '' },
252
+ { title: 'E-Mail Address', value: '' },
253
+ { title: 'Phone Number', value: '' }
254
+ ],
255
+ children: []
256
+ };
257
+ this.cardData.push(newCard);
258
+ }
259
+ }
260
+ clearData() {
261
+ this.currentData = {};
262
+ }
263
+ loadMore() {
264
+ this.cardData = this.cardData.concat(this.cardData);
265
+ }
266
+ onColumnChange(event) {
267
+ this.showColumn = event;
268
+ }
269
+ onSortChange(event) {
270
+ this.showSort = event;
271
+ console.log(event);
272
+ }
273
+ onColumnsUpdated(updatedColumns) {
274
+ this.onColumnChange(false);
275
+ this.selectedColumnCount = updatedColumns.length;
276
+ }
277
+ onSortUpdated(updatedSorts) {
278
+ this.onSortChange(false);
279
+ this.selectedSortCount = updatedSorts.length;
280
+ console.log(updatedSorts);
281
+ }
282
+ onViewChange(isGridView) {
283
+ console.log('View changed to:', isGridView ? 'Grid View' : 'List View');
284
+ }
285
+ onStateChange(event) {
286
+ console.log(`State changed for ${event.key}:`, event.value);
287
+ if (event.key === "create") {
288
+ console.log('peace is a boy');
289
+ this.newItem();
290
+ // const newUser = this.newItem()
291
+ // if ( newUser && this.cardDataView) {
292
+ // this.dataView.toggleView();
293
+ // // First reset all selections
294
+ // this.cardData.forEach((item) => {
295
+ // item.selected = false;
296
+ // if (item.children) {
297
+ // item.children.forEach((child) => (child.selected = false));
298
+ // }
299
+ // });
300
+ // this.currentData = this.cardDataView.onItemClick(newUser);
301
+ // // Force change detection if needed
302
+ // // this.changeDetectorRef.detectChanges();
303
+ // }
304
+ }
305
+ }
306
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: UserManagementComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
307
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.11", type: UserManagementComponent, selector: "lib-user-management", viewQueries: [{ propertyName: "cardDataView", first: true, predicate: ["vdcv"], descendants: true }, { propertyName: "dataView", first: true, predicate: ["vdv"], descendants: true }], ngImport: i0, template: "<div class=\"space-y-8\">\n <verben-data-view\n #vdv\n [viewState]=\"{\n isSearch: true,\n isColumn: true,\n isFilter: true,\n isSort: true,\n isExport: true,\n isSelect: true,\n isCreate: true\n }\"\n [buttonClass]=\"'my-custom-button-class'\"\n [iconClass]=\"'my-icon-class'\"\n [activeIconClass]=\"'my-active-icon-class'\"\n [selectedColumnCount]=\"0\"\n [selectedSortCount]=\"0\"\n [selectedFilterTableCount]=\"0\"\n (viewChange)=\"onViewChange($event)\"\n (stateChange)=\"onStateChange($event)\"\n >\n <div table-content>\n <lib-data-table\n [data]=\"data\"\n [columns]=\"columns\"\n [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <ng-container libColumn=\"createdAt\">\n <ng-template #cell let-value>\n {{ value | date }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"actions\">\n <ng-template #cell let-value let-deleteRow >\n <div class=\"flex gap-6\">\n <verben-svg\n (click)=\"openDetailView(value)\"\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n class=\"cursor-pointer\"\n ></verben-svg>\n\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"deleteRow()\"\n class=\"cursor-pointer\"\n ></verben-svg>\n </div>\n </ng-template>\n <ng-template #header>\n <strong>Actions</strong>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"status\">\n <ng-template\n #cell\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-deleteRow=\"deleteRow\"\n let-value=\"value\"\n >\n <verbena-badge\n borderRadius=\"20px\"\n width=\"121px\"\n text=\"{{value}}\"\n bgColor=\"#D6F3E6\"\n textColor=\"#2DB76F\"\n pd=\"5px 15px\"\n fontSize=\"16px\"\n >\n\n\n </verbena-badge>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"role\">\n <ng-template\n #cell\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-deleteRow=\"deleteRow\"\n let-value=\"value\"\n let-updateValue=\"updateValue\"\n >\n <!-- <verben-drop-down [minChar]=\"3\" [required]=\"true\" placeholder=\"Select Parent\"\n [asyncLabel]=\"this.getParentLabel.bind(this)\" invalidMessage=\"No value was provided\"\n width=\"120px\"\n (onChange)=\"onDropdownChange($event)\" [(ngModel)]=\"selectedParent\" optionLabel=\"Name\" optionValue=\"Id\"\n [options]=\"testParents\"></verben-drop-down> -->\n\n <verben-drop-down\n placeholder=\"Select Value\"\n (ngModelChange)=\"onDropdownChange($event)\"\n [options]=\"testParents\"\n optionLabel=\"Name\"\n optionValue=\"Name\"\n [ngModel]=\"value\"\n ></verben-drop-down>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n <div card-content>\n <verben-card-data-view\n borderRadius=\"12px\"\n (loadMoreClick)=\"loadMore()\"\n #vdcv\n dataId=\"MailAddress\"\n border=\"5px\"\n [cardDataList]=\"cardData\"\n rbgColor=\"#f5f6f9\"\n mg=\"20px\"\n >\n <verben-left-card-data-view class=\"\">\n <verben-left-card-data\n #vlcd\n [parent]=\"vdcv\"\n dataId=\"MailAddress\"\n class=\"bg-secondary-100 rounded-xl border-primary border-[1px]\"\n [cardDataList]=\"cardData\"\n >\n <ng-template #card let-item>\n <div (click)=\"currentData = vdcv.onItemClick(item)\" class=\"flex\">\n <verben-svg\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"vlcd.showChildren(item)\"\n [ngClass]=\"vlcd.showToggle(item) ? 'visible' : 'invisible'\"\n class=\"items-center flex pr-1 cursor-pointer\"\n [icon]=\"item.isChildrenExpanded ? 'minus' : 'plus'\"\n />\n <div\n (click)=\"currentData = vdcv.onItemClick(item)\"\n class=\"flex cursor-pointer w-full bg-secondary rounded-xl\"\n >\n <div\n class=\"w-3 rounded-xl rounded-tr-none rounded-br-none\"\n [ngClass]=\"\n item.selected ? 'bg-primary' : 'bg-secondary-200'\n \"\n ></div>\n <div class=\"flex flex-col py-2 px-4 w-full\">\n <div class=\"flex items-center gap-4\">\n <div class=\"space-y-1\">\n <span class=\"font-semibold text-[#404040]\">{{\n item.title\n }}</span>\n <p class=\"flex items-center\">\n <label for=\"phone\" class=\"text-[10px] font-light\"\n >Phone Number:</label\n >\n <span id=\"phone\" class=\"text-sm font-medium\">{{\n item.data.PhoneNumber\n }}</span>\n </p>\n </div>\n\n <div class=\"space-y-1\">\n <p class=\"grid\">\n <label for=\"phone\" class=\"text-[10px] font-light\"\n >Role</label\n >\n <span id=\"phone\" class=\"text-sm font-medium\"\n >Manager</span\n >\n </p>\n <!-- <lib-user-access-request-status-badge\n [status]=\"item.data.Status\"\n ></lib-user-access-request-status-badge> -->\n </div>\n </div>\n\n <!-- <div class=\"flex\">\n <span class=\"font-normal text-sm\">{{ item.title }}</span>\n </div>\n @for (ciItem of item.body; track ciItem.value) {\n <div class=\"\">\n <span class=\"text-muted font-light text-xs\"\n >{{ ciItem.title }}:</span\n >\n <span class=\"text-black\">{{ ciItem.value }}</span>\n </div>\n } -->\n </div>\n </div>\n </div>\n </ng-template>\n </verben-left-card-data>\n </verben-left-card-data-view>\n\n <verben-right-card-data-view>\n <ng-template #parent>\n <lib-user-request-form\n [currentData]=\"currentData\"\n (switchView)=\"vdv.toggleView()\"\n ></lib-user-request-form>\n </ng-template>\n </verben-right-card-data-view>\n\n <verben-card-data-view-footer class=\"float-right\">\n <div class=\"flex gap-2\">\n <span class=\"paginator-text\"\n >{{ cardData.length }} records loaded</span\n >\n <button (click)=\"loadMore()\" class=\"load-more\">Load more</button>\n </div>\n </verben-card-data-view-footer>\n </verben-card-data-view>\n </div>\n <div column-content>\n <verben-visible-column\n (columnsUpdated)=\"onColumnsUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n [columns]=\"visibleColumns\"\n [displayedColumns]=\"5\"\n ></verben-visible-column>\n </div>\n <div filter-content>\n <verben-table-filter\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"420px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"\n ></verben-table-filter>\n </div>\n <div sort-content>\n <verben-sort-table\n (selectedOptions)=\"onSortUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [enableDragAndDrop]=\"true\"\n [sortOptions]=\"sortOptions\"\n ></verben-sort-table>\n </div>\n <div export-content>\n <lib-data-export [data]=\"data\" (exportDataEvent)=\"handleExport($event)\">\n </lib-data-export>\n </div>\n </verben-data-view>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2.DataTableComponent, selector: "lib-data-table", inputs: ["data", "columns", "styleConfig"], outputs: ["rowEdit", "rowSave", "rowDelete", "selectionChange"] }, { kind: "directive", type: i2.ColumnDirective, selector: "[libColumn]", inputs: ["libColumn"] }, { kind: "component", type: i2.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "size"] }, { kind: "component", type: i2.DataViewComponent, selector: "verben-data-view", inputs: ["buttonClass", "iconClass", "activeIconClass", "columnCustomClass", "filterCustomClass", "sortCustomClass", "exportCustomClass", "selectCustomClass", "zIndex", "createCustomClass", "tableIcon", "cardIcon", "cardClass", "tableClass", "viewState", "searchTemplate", "columnTemplate", "filterTemplate", "sortTemplate", "exportTemplate", "createTemplate", "selectedColumnCount", "selectedSortCount", "selectedFilterTableCount", "inputWidth", "showColumnChild", "showSortChild", "showFilterChild", "showExportChild", "create", "showSelected"], outputs: ["viewChange", "stateChange"] }, { kind: "component", type: i2.CardDataViewComponent, selector: "verben-card-data-view", inputs: ["pd", "mg", "lHeight", "rHeight", "rWidth", "lWidth", "textColor", "lbgColor", "rbgColor", "border", "display", "borderRadius", "activeCss", "inActiveCss", "displayAsRow", "cardDataList", "dataId", "totalRecords", "footer", "noOfVisibleChildren", "onItemClick", "onCardChildClick"], outputs: ["loadMoreClick"] }, { kind: "component", type: i2.LeftCardDataComponent, selector: "verben-left-card-data", inputs: ["pd", "mg", "height", "weight", "activeCss", "inActiveCss", "cardDataList", "iconCollapse", "iconExpanded", "parent", "dataId"] }, { kind: "component", type: i2.LeftCardDataViewComponent, selector: "verben-left-card-data-view", inputs: ["cardDataList"] }, { kind: "component", type: i2.RightCardDataViewComponent, selector: "verben-right-card-data-view", inputs: ["parentData", "chilData", "meth"] }, { kind: "component", type: i2.CardDataViewFooterComponent, selector: "verben-card-data-view-footer" }, { kind: "component", type: i2.SortTableComponent, selector: "verben-sort-table", inputs: ["enableDragAndDrop", "sortOptions", "resetText", "displayedOptions", "propertyText", "showMoreText", "sortButtonText", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "containerHeight"], outputs: ["selectedOptions"] }, { kind: "component", type: i2.VisibleColumnComponent, selector: "verben-visible-column", inputs: ["columns", "items", "enableDragAndDrop", "displayedColumns", "showMore", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth"], outputs: ["columnsUpdated"] }, { kind: "component", type: i2.TableFilterComponent, selector: "verben-table-filter", inputs: ["filterOptions", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "maxFilterLength", "tooltip"], outputs: ["filtersApplied"] }, { kind: "component", type: i2.DataExportComponent, selector: "lib-data-export", inputs: ["data"], outputs: ["exportDataEvent"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.VerbenaBadgeComponent, selector: "verbena-badge", inputs: ["text", "bgColor", "textColor", "borderRadius", "pd", "fontSize", "width", "height"] }, { kind: "component", type: i2.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i4.UserManagementFormComponent, selector: "lib-user-request-form", inputs: ["currentData"], outputs: ["switchView"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
308
+ }
309
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: UserManagementComponent, decorators: [{
310
+ type: Component,
311
+ args: [{ selector: 'lib-user-management', template: "<div class=\"space-y-8\">\n <verben-data-view\n #vdv\n [viewState]=\"{\n isSearch: true,\n isColumn: true,\n isFilter: true,\n isSort: true,\n isExport: true,\n isSelect: true,\n isCreate: true\n }\"\n [buttonClass]=\"'my-custom-button-class'\"\n [iconClass]=\"'my-icon-class'\"\n [activeIconClass]=\"'my-active-icon-class'\"\n [selectedColumnCount]=\"0\"\n [selectedSortCount]=\"0\"\n [selectedFilterTableCount]=\"0\"\n (viewChange)=\"onViewChange($event)\"\n (stateChange)=\"onStateChange($event)\"\n >\n <div table-content>\n <lib-data-table\n [data]=\"data\"\n [columns]=\"columns\"\n [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <ng-container libColumn=\"createdAt\">\n <ng-template #cell let-value>\n {{ value | date }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"actions\">\n <ng-template #cell let-value let-deleteRow >\n <div class=\"flex gap-6\">\n <verben-svg\n (click)=\"openDetailView(value)\"\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n class=\"cursor-pointer\"\n ></verben-svg>\n\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"deleteRow()\"\n class=\"cursor-pointer\"\n ></verben-svg>\n </div>\n </ng-template>\n <ng-template #header>\n <strong>Actions</strong>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"status\">\n <ng-template\n #cell\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-deleteRow=\"deleteRow\"\n let-value=\"value\"\n >\n <verbena-badge\n borderRadius=\"20px\"\n width=\"121px\"\n text=\"{{value}}\"\n bgColor=\"#D6F3E6\"\n textColor=\"#2DB76F\"\n pd=\"5px 15px\"\n fontSize=\"16px\"\n >\n\n\n </verbena-badge>\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"role\">\n <ng-template\n #cell\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-deleteRow=\"deleteRow\"\n let-value=\"value\"\n let-updateValue=\"updateValue\"\n >\n <!-- <verben-drop-down [minChar]=\"3\" [required]=\"true\" placeholder=\"Select Parent\"\n [asyncLabel]=\"this.getParentLabel.bind(this)\" invalidMessage=\"No value was provided\"\n width=\"120px\"\n (onChange)=\"onDropdownChange($event)\" [(ngModel)]=\"selectedParent\" optionLabel=\"Name\" optionValue=\"Id\"\n [options]=\"testParents\"></verben-drop-down> -->\n\n <verben-drop-down\n placeholder=\"Select Value\"\n (ngModelChange)=\"onDropdownChange($event)\"\n [options]=\"testParents\"\n optionLabel=\"Name\"\n optionValue=\"Name\"\n [ngModel]=\"value\"\n ></verben-drop-down>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n <div card-content>\n <verben-card-data-view\n borderRadius=\"12px\"\n (loadMoreClick)=\"loadMore()\"\n #vdcv\n dataId=\"MailAddress\"\n border=\"5px\"\n [cardDataList]=\"cardData\"\n rbgColor=\"#f5f6f9\"\n mg=\"20px\"\n >\n <verben-left-card-data-view class=\"\">\n <verben-left-card-data\n #vlcd\n [parent]=\"vdcv\"\n dataId=\"MailAddress\"\n class=\"bg-secondary-100 rounded-xl border-primary border-[1px]\"\n [cardDataList]=\"cardData\"\n >\n <ng-template #card let-item>\n <div (click)=\"currentData = vdcv.onItemClick(item)\" class=\"flex\">\n <verben-svg\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"vlcd.showChildren(item)\"\n [ngClass]=\"vlcd.showToggle(item) ? 'visible' : 'invisible'\"\n class=\"items-center flex pr-1 cursor-pointer\"\n [icon]=\"item.isChildrenExpanded ? 'minus' : 'plus'\"\n />\n <div\n (click)=\"currentData = vdcv.onItemClick(item)\"\n class=\"flex cursor-pointer w-full bg-secondary rounded-xl\"\n >\n <div\n class=\"w-3 rounded-xl rounded-tr-none rounded-br-none\"\n [ngClass]=\"\n item.selected ? 'bg-primary' : 'bg-secondary-200'\n \"\n ></div>\n <div class=\"flex flex-col py-2 px-4 w-full\">\n <div class=\"flex items-center gap-4\">\n <div class=\"space-y-1\">\n <span class=\"font-semibold text-[#404040]\">{{\n item.title\n }}</span>\n <p class=\"flex items-center\">\n <label for=\"phone\" class=\"text-[10px] font-light\"\n >Phone Number:</label\n >\n <span id=\"phone\" class=\"text-sm font-medium\">{{\n item.data.PhoneNumber\n }}</span>\n </p>\n </div>\n\n <div class=\"space-y-1\">\n <p class=\"grid\">\n <label for=\"phone\" class=\"text-[10px] font-light\"\n >Role</label\n >\n <span id=\"phone\" class=\"text-sm font-medium\"\n >Manager</span\n >\n </p>\n <!-- <lib-user-access-request-status-badge\n [status]=\"item.data.Status\"\n ></lib-user-access-request-status-badge> -->\n </div>\n </div>\n\n <!-- <div class=\"flex\">\n <span class=\"font-normal text-sm\">{{ item.title }}</span>\n </div>\n @for (ciItem of item.body; track ciItem.value) {\n <div class=\"\">\n <span class=\"text-muted font-light text-xs\"\n >{{ ciItem.title }}:</span\n >\n <span class=\"text-black\">{{ ciItem.value }}</span>\n </div>\n } -->\n </div>\n </div>\n </div>\n </ng-template>\n </verben-left-card-data>\n </verben-left-card-data-view>\n\n <verben-right-card-data-view>\n <ng-template #parent>\n <lib-user-request-form\n [currentData]=\"currentData\"\n (switchView)=\"vdv.toggleView()\"\n ></lib-user-request-form>\n </ng-template>\n </verben-right-card-data-view>\n\n <verben-card-data-view-footer class=\"float-right\">\n <div class=\"flex gap-2\">\n <span class=\"paginator-text\"\n >{{ cardData.length }} records loaded</span\n >\n <button (click)=\"loadMore()\" class=\"load-more\">Load more</button>\n </div>\n </verben-card-data-view-footer>\n </verben-card-data-view>\n </div>\n <div column-content>\n <verben-visible-column\n (columnsUpdated)=\"onColumnsUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n [columns]=\"visibleColumns\"\n [displayedColumns]=\"5\"\n ></verben-visible-column>\n </div>\n <div filter-content>\n <verben-table-filter\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"420px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"\n ></verben-table-filter>\n </div>\n <div sort-content>\n <verben-sort-table\n (selectedOptions)=\"onSortUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [enableDragAndDrop]=\"true\"\n [sortOptions]=\"sortOptions\"\n ></verben-sort-table>\n </div>\n <div export-content>\n <lib-data-export [data]=\"data\" (exportDataEvent)=\"handleExport($event)\">\n </lib-data-export>\n </div>\n </verben-data-view>\n</div>\n" }]
312
+ }], propDecorators: { cardDataView: [{
313
+ type: ViewChild,
314
+ args: ['vdcv']
315
+ }], dataView: [{
316
+ type: ViewChild,
317
+ args: ['vdv']
318
+ }] } });
319
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1tYW5hZ2VtZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi1hdXRoZW50aWNhdGlvbi11aS9zcmMvbGliL2NvbXBvbmVudHMvdXNlci1tYW5hZ2VtZW50L3VzZXItbWFuYWdlbWVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tYXV0aGVudGljYXRpb24tdWkvc3JjL2xpYi9jb21wb25lbnRzL3VzZXItbWFuYWdlbWVudC91c2VyLW1hbmFnZW1lbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDcEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRS9DLE9BQU8sRUFBWSxjQUFjLEVBQWlHLE1BQU0sY0FBYyxDQUFDO0FBQ3ZKLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7Ozs7O0FBWXhELE1BQU0sT0FBTyx1QkFBdUI7SUFDZixZQUFZLENBQXlCO0lBQ3RDLFFBQVEsQ0FBcUI7SUFHL0MsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUNsQixJQUFJLEdBQUcsUUFBUSxDQUFDO0lBQ2hCLE1BQU0sR0FBRyxTQUFTLENBQUM7SUFFbkIsY0FBYyxDQUFVO0lBQ3hCLFdBQVcsQ0FBVTtJQUNyQixjQUFjLEdBQWEsRUFBRSxDQUFDO0lBQzlCLGlCQUFpQixHQUFhLEVBQUUsQ0FBQztJQUNqQyxtQkFBbUIsQ0FBVTtJQUM3QixhQUFh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SUFBSTtLQUMxQixDQUFDLENBQUMsQ0FBQztJQVlKLFdBQVcsR0FBa0I7UUFDM0IsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7UUFDN0QsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7UUFDcEUsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7UUFDcEUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7S0FDakUsQ0FBQztJQUVGLFdBQVcsR0FBa0I7UUFDM0IsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7UUFDN0QsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7UUFDcEUsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7UUFDcEUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7S0FDakUsQ0FBQztJQUVGLFdBQVcsR0FBdUI7UUFDaEMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7UUFDNUIsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUU7UUFDbEMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7S0FD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NFFBOzs0RkR6UGEsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLHFCQUFxQjs4QkFLWixZQUFZO3NCQUE5QixTQUFTO3VCQUFDLE1BQU07Z0JBQ0MsUUFBUTtzQkFBekIsU0FBUzt1QkFBQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNvbHVtbnMgfSBmcm9tICcuL3VzZXItbWFuYWdlbWVudC5jb2x1bW5zJztcbmltcG9ydCB7IG1vY2tEYXRhIH0gZnJvbSAnLi9oZWxwZXInO1xuaW1wb3J0IHsgYmFzZVN0eWxlIH0gZnJvbSAnLi9iYXNlLXRhYmxlLXN0eWxlJztcbmltcG9ydCB7IFVzZXJBY2Nlc3NSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vbW9kZWxzL3VzZXItYWNjZXNzLXJlcXVlc3QnO1xuaW1wb3J0IHsgQ2FyZERhdGEsIERhdGFGaWx0ZXJUeXBlLCBJRGF0YUZpbHRlciwgRHJvcGRvd25Mb2FkRXZlbnQsIERyb3Bkb3duQ2hhbmdlRXZlbnQsIENhcmREYXRhVmlld0NvbXBvbmVudCwgRGF0YVZpZXdDb21wb25lbnQgfSBmcm9tICd2ZXJiZW4tbmctdWknO1xuaW1wb3J0IHsgVXNlckFjY2Vzc1JlcXVlc3RTdGF0dXMgfSBmcm9tICcuLi8uLi9tb2RlbHMvdXNlci1hY2Nlc3MtcmVxdWVzdC1zdGF0dXMnO1xuaW1wb3J0IHsgT2JqZWN0U3RhdGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvb2JqZWN0LXN0YXRlJztcblxuaW50ZXJmYWNlIFRlc3RQYXJlbnRPYmplY3Qge1xuICBJZDogc3RyaW5nO1xuICBOYW1lOiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi11c2VyLW1hbmFnZW1lbnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1tYW5hZ2VtZW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdXNlci1tYW5hZ2VtZW50LmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBVc2VyTWFuYWdlbWVudENvbXBvbmVudCB7XG4gIEBWaWV3Q2hpbGQoJ3ZkY3YnKSBjYXJkRGF0YVZpZXchOiBDYXJkRGF0YVZpZXdDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3ZkdicpIGRhdGFWaWV3ITogRGF0YVZpZXdDb21wb25lbnQ7XG5cblxuICBjb2x1bW5zID0gY29sdW1ucztcbiAgZGF0YSA9IG1vY2tEYXRhO1xuICBzdHlsZXMgPSBiYXNlU3R5bGU7XG5cbiAgc2VsZWN0ZWRQYXJlbnQ/OiBzdHJpbmc7XG4gIGJhc2ljT3B0aW9uPzogc3RyaW5nO1xuICBzZWxlY3RlZE9wdGlvbjogc3RyaW5nW10gPSBbXTtcbiAgc2VsZWN0ZWRPcHRpb25Ud286IHN0cmluZ1tdID0gW107XG4gIHNlbGVjdGVkT3B0aW9uVGhyZWU/OiBzdHJpbmc7XG4gIG1pc3NpbmdPYmplY3Q6IGFueTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICBwcml2YXRlIGdlbmVyYXRlTmV3VXNlckFjY2Vzc1JlcXVlc3QoKTogVXNlckFjY2Vzc1JlcXVlc3Qge1xuICAgIGNvbnN0IG5ld0lkID0gdGhpcy5kYXRhLmxlbmd0aCArIDE7IC8vIEluY3JlbWVudGFsIElEIGJhc2VkIG9uIGN1cnJlbnQgZGF0YSBsZW5ndGhcblxuICAgIHJldHVybiB7XG4gICAgICBOYW1lOiBgVXNlciAke25ld0lkfWAsXG4gICAgICBJZDogYCR7bmV3SWR9YCxcbiAgICAgIGlkOiBuZXdJZCxcbiAgICAgIE1haWxBZGRyZXNzOiBgIGAsXG4gICAgICBQaG9uZU51bWJlcjogYGAsXG4gICAgICBTdGF0dXM6IFVzZXJBY2Nlc3NSZXF1ZXN0U3RhdHVzLlBlbmRpbmcsXG4gICAgICBBZGRyZXNzOiBgIGAsXG4gICAgICBQYXNzd29yZDogJyAnLFxuICAgICAgRXhwaXJlT246IG5ldyBEYXRlKCksXG4gICAgICBJc1NlZWRlZDogZmFsc2UsXG4gICAgICBPVFBFeHBpcmVPbjogbmV3IERhdGUoKSxcbiAgICAgIFRlbmFudHM6IFtgVGVuYW50JHtuZXdJZH1gXSxcbiAgICAgIFJvbGU6IFtcIlVzZXJcIl0sXG4gICAgICBDcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICBVcGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICBTdGF0ZTogT2JqZWN0U3RhdGUuTmV3LFxuICAgICAgVGVuYW50OiBgVGVuYW50JHtuZXdJZH1gXG4gICAgfTtcbiAgfVxuXG4gIC8vIEZ1bmN0aW9uIHRvIGFkZCBhIG5ldyB1c2VyIHRvIG1vY2tEYXRhXG4gIGFkZE5ld1VzZXJUb01vY2tEYXRhKCk6IFVzZXJBY2Nlc3NSZXF1ZXN0IHtcbiAgICBjb25zdCBuZXdVc2VyID0gdGhpcy5nZW5lcmF0ZU5ld1VzZXJBY2Nlc3NSZXF1ZXN0KCk7XG4gICAgdGhpcy5kYXRhLnB1c2gobmV3VXNlcik7IC8vIEFkZHMgdGhlIG5ldyB1c2VyIHRvIHRoZSBkYXRhIGFycmF5XG5cbiAgICAvLyBPcHRpb25hbGx5LCB1cGRhdGUgY2FyZERhdGEgd2l0aCB0aGUgbmV3IHVzZXIgZW50cnkgZm9yIGNhcmQgZGlzcGxheVxuICAgIGNvbnN0IG5ld0NhcmREYXRhOiBDYXJkRGF0YSA9IHtcbiAgICAgIHNlbGVjdGVkOiBmYWxzZSxcbiAgICAgIHRpdGxlOiBuZXdVc2VyLk5hbWUsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIE5hbWU6IG5ld1VzZXIuTmFtZSxcbiAgICAgICAgTWFpbEFkZHJlc3M6IG5ld1VzZXIuTWFpbEFkZHJlc3MsXG4gICAgICAgIFBob25lTnVtYmVyOiBuZXdVc2VyLlBob25lTnVtYmVyLFxuICAgICAgICBSb2xlSUQ6IG5ld1VzZXIuUm9sZSxcbiAgICAgICAgU3RhdHVzOiBuZXdVc2VyLlN0YXR1cyxcbiAgICAgIH0gYXMgUGFydGlhbDxVc2VyQWNjZXNzUmVxdWVzdD4sXG4gICAgICBib2R5OiBbXG4gICAgICAgIHsgdGl0bGU6ICdOYW1lJywgdmFsdWU6IG5ld1VzZXIuTmFtZSB9LFxuICAgICAgICB7IHRpdGxlOiAnRS1NYWlsIEFkZHJlc3MnLCB2YWx1ZTogbmV3VXNlci5NYWlsQWRkcmVzcyB9LFxuICAgICAgICB7IHRpdGxlOiAnUGhvbmUgTnVtYmVyJywgdmFsdWU6IG5ld1VzZXIuUGhvbmVOdW1iZXIgPz8gJycgfSxcbiAgICAgIF0sXG4gICAgICBjaGlsZHJlbjogW10sXG4gICAgfTtcblxuICAgIHRoaXMuY2FyZERhdGEucHVzaChuZXdDYXJkRGF0YSk7IC8vIFVwZGF0ZSBjYXJkRGF0YSBhcnJheSB3aXRoIHRoZSBuZXcgdXNlclxuICAgIHJldHVybiBuZXdVc2VyO1xuICB9XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gIC8vIEdyaWQgdmlldyBwcm9wZXJ0aWVzXG4gIGlzR3JpZFZpZXc6IGJvb2xlYW4gPSB0cnVlO1xuICBjdXJyZW50RGF0YSE6IENhcmREYXRhO1xuICBzZWxlY3RlZENvbHVtbkNvdW50OiBudW1iZXIgPSAwO1xuICBzZWxlY3RlZEZpbHRlclRhYmxlQ291bnQ6IG51bWJlciA9IDA7XG4gIGlzT1BlbjogYm9vbGVhbiA9IHRydWU7XG4gIHNlbGVjdGVkU29ydENvdW50OiBudW1iZXIgPSAwO1xuICBzaG93Q29sdW1uOiBib29sZWFuID0gZmFsc2U7XG4gIHNob3dTb3J0OiBib29sZWFuID0gZmFsc2U7XG4gIHNlbGVjdGVkQWxsOiBib29sZWFuID0gZmFsc2U7XG4gIHZpc2libGVDb2x1bW5zOiBJRGF0YUZpbHRlcltdID0gY29sdW1ucy5tYXAoKGNvbCkgPT4gKHtcbiAgICBjaGVja2VkOiBmYWxzZSxcbiAgICBuYW1lOiB0eXBlb2YgY29sLmhlYWRlciA9PT0gJ3N0cmluZycgPyBjb2wuaGVhZGVyIDogY29sLmlkLFxuICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLkJvb2wsXG4gIH0pKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG4gIGZpbHRlckFycmF5OiBJRGF0YUZpbHRlcltdID0gW1xuICAgIHsgbmFtZTogJ05hbWUnLCB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsIGNoZWNrZWQ6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiAnTWFpbEFkZHJlc3MnLCB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsIGNoZWNrZWQ6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiAnUGhvbmVOdW1iZXInLCB0eXBlOiBEYXRhRmlsdGVyVHlwZS5TdHJpbmcsIGNoZWNrZWQ6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiAnQ3JlYXRlZEF0JywgdHlwZTogRGF0YUZpbHRlclR5cGUuRGF0ZSwgY2hlY2tlZDogZmFsc2UgfSxcbiAgXTtcblxuICBzb3J0T3B0aW9uczogSURhdGFGaWx0ZXJbXSA9IFtcbiAgICB7IG5hbWU6ICdOYW1lJywgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLCBjaGVja2VkOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogJ01haWxBZGRyZXNzJywgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLCBjaGVja2VkOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogJ1Bob25lTnVtYmVyJywgdHlwZTogRGF0YUZpbHRlclR5cGUuU3RyaW5nLCBjaGVja2VkOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogJ0NyZWF0ZWRBdCcsIHR5cGU6IERhdGFGaWx0ZXJUeXBlLkRhdGUsIGNoZWNrZWQ6IGZhbHNlIH0sXG4gIF07XG5cbiAgdGVzdFBhcmVudHM6IFRlc3RQYXJlbnRPYmplY3RbXSA9IFtcbiAgICB7IElkOiAnMScsIE5hbWU6ICdNYW5hZ2VyJyB9LFxuICAgIHsgSWQ6ICcyJywgTmFtZTogJ0FkbWluaXN0cmF0b3InIH0sXG4gICAgeyBJZDogJzMnLCBOYW1lOiAnSmVsb20nIH0sXG4gIF07XG5cblxuXG5cblxuXG5cblxuXG5cbiAgY2FyZERhdGE6IENhcmREYXRhW10gPSBtb2NrRGF0YS5tYXAoXG4gICAgKHsgTmFtZSwgTWFpbEFkZHJlc3MsIFBob25lTnVtYmVyLCBSb2xlSUQsIFN0YXR1cyB9KSA9PiAoe1xuICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgdGl0bGU6IE5hbWUsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIE5hbWUsXG4gICAgICAgIE1haWxBZGRyZXNzLFxuICAgICAgICBQaG9uZU51bWJlcixcbiAgICAgICAgUm9sZUlELFxuICAgICAgICBTdGF0dXMsXG4gICAgICB9IGFzIFBhcnRpYWw8VXNlckFjY2Vzc1JlcXVlc3Q+LFxuICAgICAgYm9keTogW1xuICAgICAgICB7IHRpdGxlOiAnTmFtZScsIHZhbHVlOiBOYW1lIH0sXG4gICAgICAgIHsgdGl0bGU6ICdFLU1haWwgQWRkcmVzcycsIHZhbHVlOiBNYWlsQWRkcmVzcyB9LFxuICAgICAgICB7IHRpdGxlOiAnUGhvbmUgTnVtYmVyJywgdmFsdWU6IFBob25lTnVtYmVyID8/ICcnIH0sXG4gICAgICBdLFxuICAgICAgY2hpbGRyZW46IFtdLFxuICAgIH0pXG4gICk7XG5cblxuXG5cblxuXG5cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkUGFyZW50ID0gJzEnO1xuICAgIHRoaXMuc2VsZWN0ZWRPcHRpb24gPSBbJ09wdCAxJ107XG4gICAgdGhpcy5zZWxlY3RlZE9wdGlvblR3byA9IFsnMSddO1xuICAgIHRoaXMuc2VsZWN0ZWRPcHRpb25UaHJlZSA9ICcxJztcbiAgfVxuXG4gIGdldFBhcmVudExhYmVsKGNvbnRleHQ6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc29sZS5sb2coeyBNaXNzaW5nT2JqOiB0aGlzLm1pc3NpbmdPYmplY3QgfSk7XG4gICAgcmV0dXJuIHRoaXMubWlzc2luZ09iamVjdC5OYW1lO1xuICB9XG5cbiAgYXN5bmMgbG9hZE1vcmVQYXJlbnRzKGV2ZW50OiBEcm9wZG93bkxvYWRFdmVudCk6IFByb21pc2U8VGVzdFBhcmVudE9iamVjdFtdPiB7XG4gICAgY29uc29sZS5sb2coeyBQYXJlbnRMb2FkRXZlbnQ6IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZXZlbnQpKSB9KTtcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIHJlc29sdmUoW1xuICAgICAgICAgICAgeyBJZDogJzEnLCBOYW1lOiAnSmltbHknIH0sXG4gICAgICAgICAgICB7IElkOiAnMicsIE5hbWU6ICdKZWNpbCcgfSxcbiAgICAgICAgICAgIHsgSWQ6ICczJywgTmFtZTogJ0plbG9tJyB9LFxuICAgICAgICAgICAgeyBJZDogJzQnLCBOYW1lOiAnSmVtaW1hJyB9LFxuICAgICAgICAgICAgeyBJZDogJzUnLCBOYW1lOiAnQWtpbnR1bmRlJyB9LFxuICAgICAgICAgIF0pLFxuICAgICAgICAzMDAwXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG5cblxuXG5cblxuXG4gIG9uRHJvcGRvd25DaGFuZ2UoZXZlbnQ6IERyb3Bkb3duQ2hhbmdlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBjb25zb2xlLmxvZyh7XG4gICAgLy8gICAnVGVzdCBQYXJlbnQgVmFsdWUnOiB0aGlzLnNlbGVjdGVkUGFyZW50LFxuICAgIC8vICAgLi4uXG4gICAgLy8gfSk7XG4gIH1cblxuICBvblNlbGVjdGlvbkNoYW5nZShzZWxlY3RlZFJvd3M6IFVzZXJBY2Nlc3NSZXF1ZXN0W10pIHtcbiAgICBjb25zb2xlLmxvZygnU2VsZWN0aW9uIGNoYW5nZWQ6Jywgc2VsZWN0ZWRSb3dzKTtcbiAgICAvLyBIYW5kbGUgdGhlIHNlbGVjdGlvbiBjaGFuZ2VcbiAgfVxuXG4gIGhhbmRsZUV4cG9ydChleHBvcnRlZERhdGE6IFBhcnRpYWw8YW55PltdKSB7XG4gICAgY29uc29sZS5sb2coJ0V4cG9ydGVkIGRhdGE6JywgZXhwb3J0ZWREYXRhKTtcbiAgICB0aGlzLmRvd25sb2FkQ1NWKGV4cG9ydGVkRGF0YSk7XG4gIH1cblxuXG5cblxuXG5cblxuXG5cblxuICBwcml2YXRlIGRvd25sb2FkQ1NWKGRhdGE6IFBhcnRpYWw8YW55PltdKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IE9iamVjdC5rZXlzKGRhdGFbMF0pO1xuICAgIGNvbnN0IGNzdkNvbnRlbnQgPSBbXG4gICAgICBoZWFkZXJzLmpvaW4oJywnKSxcbiAgICAgIC4uLmRhdGEubWFwKChyb3cpID0+IGhlYWRlcnMubWFwKChoZWFkZXIpID0+IHJvd1toZWFkZXJdKS5qb2luKCcsJykpLFxuICAgIF0uam9pbignXFxuJyk7XG5cbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2NzdkNvbnRlbnRdLCB7IHR5cGU6ICd0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04OycgfSk7XG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBpZiAobGluay5kb3dubG9hZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCB1cmwpO1xuICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgJ2V4cG9ydC5jc3YnKTtcbiAgICAgIGxpbmsuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgIGxpbmsuY2xpY2soKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XG4gICAgfVxuICB9XG5cblxuXG5cbiAgLy8gYXBwbHlGaWx0ZXJzKCkge1xuICAvLyAgIHRoaXMuZmlsdGVyZWREYXRhID0gdGhpcy5kYXRhLmZpbHRlcigoaXRlbSkgPT4ge1xuICAvLyAgICAgcmV0dXJuIHRoaXMuZmlsdGVyQXJyYXkuZXZlcnkoKGZpbHRlcikgPT4ge1xuICAvLyAgICAgICBpZiAoZmlsdGVyLmNoZWNrZWQpIHtcbiAgLy8gICAgICAgICBzd2l0Y2ggKGZpbHRlci50eXBlKSB7XG4gIC8vICAgICAgICAgICBjYXNlIERhdGFGaWx0ZXJUeXBlLlN0cmluZzpcbiAgLy8gICAgICAgICAgICAgcmV0dXJuIGl0ZW1bZmlsdGVyLm5hbWVdLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyLm5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIC8vICAgICAgICAgICBjYXNlIERhdGFGaWx0ZXJUeXBlLkRhdGU6XG4gIC8vICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShpdGVtW2ZpbHRlci5uYW1lXSkgPj0gbmV3IERhdGUoZmlsdGVyLm5hbWUpO1xuICAvLyAgICAgICAgICAgZGVmYXVsdDpcbiAgLy8gICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gIC8vICAgICAgICAgfVxuICAvLyAgICAgICB9XG4gIC8vICAgICAgIHJldHVybiB0cnVlO1xuICAvLyAgICAgfSk7XG4gIC8vICAgfSk7XG4gIC8vIH1cbiAgZ2V0Q2FyZERhdGFCeU1haWxBZGRyZXNzKG1haWxBZGRyZXNzOiBzdHJpbmcpOiBDYXJkRGF0YSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc29sZS5sb2coXCJjYXJkRGF0YSBhcnJheTpcIiwgdGhpcy5jYXJkRGF0YSk7XG4gICAgY29uc29sZS5sb2cobWFpbEFkZHJlc3MpO1xuXG4gICAgcmV0dXJuIHRoaXMuY2FyZERhdGEuZmluZCgoeyBkYXRhIH0pID0+IGRhdGE/Lk1haWxBZGRyZXNzID09PSBtYWlsQWRkcmVzcyk7XG4gIH1cblxuICBvcGVuRGV0YWlsVmlldyhtYWlsQWRkcmVzczogc3RyaW5nKSB7XG4gICAgY29uc3QgY2FyZEl0ZW0gPSB0aGlzLmdldENhcmREYXRhQnlNYWlsQWRkcmVzcyhtYWlsQWRkcmVzcyk7XG4gICAgY29uc29sZS5sb2coY2FyZEl0ZW0pO1xuXG4gICAgaWYgKGNhcmRJdGVtICYmIHRoaXMuY2FyZERhdGFWaWV3KSB7XG4gICAgICB0aGlzLmRhdGFWaWV3LnRvZ2dsZVZpZXcoKTtcbiAgICAgIC8vIEZpcnN0IHJlc2V0IGFsbCBzZWxlY3Rpb25zXG4gICAgICB0aGlzLmNhcmREYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaXRlbS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoaXRlbS5jaGlsZHJlbikge1xuICAgICAgICAgIGl0ZW0uY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IChjaGlsZC5zZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZXQgdGhlIHNlbGVjdGVkIGl0ZW1cbiAgICAgIGNhcmRJdGVtLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuY3VycmVudERhdGEgPSB0aGlzLmNhcmREYXRhVmlldy5vbkl0ZW1DbGljayhjYXJkSXRlbSk7XG5cbiAgICAgIC8vIEZvcmNlIGNoYW5nZSBkZXRlY3Rpb24gaWYgbmVlZGVkXG4gICAgICAvLyB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgfVxuICBuZXdJdGVtICgpe1xuICAgIGNvbnN0IG5ld0RhdGEgPSB0aGlzLmFkZE5ld1VzZXJUb01vY2tEYXRhKCk7XG4gICAgY29uc3QgbmV3Q2FyZERhdGE6IENhcmREYXRhID0ge1xuICAgICAgc2VsZWN0ZWQ6IHRydWUsXG4gICAgICB0aXRsZTogbmV3RGF0YS5OYW1lLFxuICAgICAgZGF0YToge1xuICAgICAgICAuLi5uZXdEYXRhLFxuICAgICAgfSBhcyBQYXJ0aWFsPFVzZXJBY2Nlc3NSZXF1ZXN0PixcbiAgICAgIGJvZHk6IFtcbiAgICAgICAgeyB0aXRsZTogJ05hbWUnLCB2YWx1ZTogbmV3RGF0YS5OYW1lIH0sXG4gICAgICAgIHsgdGl0bGU6ICdFLU1haWwgQWRkcmVzcycsIHZhbHVlOiBuZXdEYXRhLk1haWxBZGRyZXNzIH0sXG4gICAgICAgIHsgdGl0bGU6ICdQaG9uZSBOdW1iZXInLCB2YWx1ZTogbmV3RGF0YS5QaG9uZU51bWJlciA/PyAnJyB9LFxuICAgICAgXSxcbiAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICB9XG5cblxuICAgIGlmICh0aGlzLmRhdGFWaWV3LmlzVGFibGVWaWV3KSB7XG4gICAgICB0aGlzLmRhdGFWaWV3LnRvZ2dsZVZpZXcoKTtcbiAgICB9XG4gICAgLy8gRmlyc3QgcmVzZXQgYWxsIHNlbGVjdGlvbnNcbiAgICB0aGlzLmNhcmREYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGl0ZW0uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIGlmIChpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgIGl0ZW0uY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IChjaGlsZC5zZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gdGhpcy5jYXJkRGF0YSA9IFtuZXdDYXJkRGF0YV0uY29uY2F0KHRoaXMuY2FyZERhdGEpO1xuICAgIC8vIHRoaXMuY2FyZERhdGFWaWV3Lm9uSXRlbUNsaWNrKG5ld0NhcmREYXRhKVxuXG4gICAgdGhpcy5jYXJkRGF0YSA9IFtuZXdDYXJkRGF0YSwgLi4udGhpcy5jYXJkRGF0YV07XG5cblxuXG4gICAgdGhpcy5jdXJyZW50RGF0YSA9IHRoaXMuY2FyZERhdGFWaWV3Lm9uSXRlbUNsaWNrKG5ld0NhcmREYXRhKTtcblxuXG4gIH1cblxuXG5cblxuXG4gIHRvZ2dsZUNoaWxkVmlldyhhY3Rpb246IHN0cmluZykge1xuICAgIGlmIChhY3Rpb24gPT09ICdjcmVhdGUnKSB7XG4gICAgICBjb25zdCBuZXdDYXJkOiBDYXJkRGF0YSA9IHtcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICB0aXRsZTogJ05ldyBDYXJkJywgLy8gRGVmYXVsdCB0aXRsZSwgY2hhbmdlIGFzIG5lZWRlZFxuICAgICAgICBkYXRhOiB7IE5hbWU6ICcnLCBNYWlsQWRkcmVzczogJycsIFBob25lTnVtYmVyOiAnJyB9LFxuICAgICAgICBib2R5OiBbXG4gICAgICAgICAgeyB0aXRsZTogJ05hbWUnLCB2YWx1ZTogJycgfSxcbiAgICAgICAgICB7IHRpdGxlOiAnRS1NYWlsIEFkZHJlc3MnLCB2YWx1ZTogJycgfSxcbiAgICAgICAgICB7IHRpdGxlOiAnUGhvbmUgTnVtYmVyJywgdmFsdWU6ICcnIH1cbiAgICAgICAgXSxcbiAgICAgICAgY2hpbGRyZW46IFtdXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmNhcmREYXRhLnB1c2gobmV3Q2FyZCk7XG4gICAgfVxuICB9XG5cblxuXG5cblxuXG4gIGNsZWFyRGF0YSgpIHtcbiAgICB0aGlzLmN1cnJlbnREYXRhID0ge30gYXMgQ2FyZERhdGE7XG4gIH1cblxuICBsb2FkTW9yZSgpIHtcbiAgICB0aGlzLmNhcmREYXRhID0gdGhpcy5jYXJkRGF0YS5jb25jYXQodGhpcy5jYXJkRGF0YSk7XG4gIH1cblxuICBvbkNvbHVtbkNoYW5nZShldmVudDogYm9vbGVhbikge1xuICAgIHRoaXMuc2hvd0NvbHVtbiA9IGV2ZW50O1xuICB9XG5cbiAgb25Tb3J0Q2hhbmdlKGV2ZW50OiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG93U29ydCA9IGV2ZW50O1xuICAgIGNvbnNvbGUubG9nKGV2ZW50KTtcbiAgfVxuXG4gIG9uQ29sdW1uc1VwZGF0ZWQodXBkYXRlZENvbHVtbnM6IElEYXRhRmlsdGVyW10pIHtcbiAgICB0aGlzLm9uQ29sdW1uQ2hhbmdlKGZhbHNlKTtcbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1uQ291bnQgPSB1cGRhdGVkQ29sdW1ucy5sZW5ndGg7XG4gIH1cblxuICBvblNvcnRVcGRhdGVkKHVwZGF0ZWRTb3J0czogSURhdGFGaWx0ZXJbXSkge1xuICAgIHRoaXMub25Tb3J0Q2hhbmdlKGZhbHNlKTtcbiAgICB0aGlzLnNlbGVjdGVkU29ydENvdW50ID0gdXBkYXRlZFNvcnRzLmxlbmd0aDtcbiAgICBjb25zb2xlLmxvZyh1cGRhdGVkU29ydHMpO1xuICB9XG5cbiAgb25WaWV3Q2hhbmdlKGlzR3JpZFZpZXc6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnVmlldyBjaGFuZ2VkIHRvOicsIGlzR3JpZFZpZXcgPyAnR3JpZCBWaWV3JyA6ICdMaXN0IFZpZXcnKTtcbiAgfVxuXG4gIG9uU3RhdGVDaGFuZ2UoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhgU3RhdGUgY2hhbmdlZCBmb3IgJHtldmVudC5rZXl9OmAsIGV2ZW50LnZhbHVlKTtcbiAgICBpZiggZXZlbnQua2V5ID09PSBcImNyZWF0ZVwiKXtcbiAgICAgIGNvbnNvbGUubG9nKCdwZWFjZSBpcyBhIGJveScpO1xuXG4gICAgICB0aGlzLm5ld0l0ZW0oKTtcblxuICAgICAgLy8gY29uc3QgbmV3VXNlciA9IHRoaXMubmV3SXRlbSgpXG5cbiAgICAgIC8vIGlmICggbmV3VXNlciAmJiB0aGlzLmNhcmREYXRhVmlldykge1xuICAgICAgLy8gICB0aGlzLmRhdGFWaWV3LnRvZ2dsZVZpZXcoKTtcbiAgICAgIC8vICAgLy8gRmlyc3QgcmVzZXQgYWxsIHNlbGVjdGlvbnNcbiAgICAgIC8vICAgdGhpcy5jYXJkRGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAvLyAgICAgaXRlbS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgLy8gICAgIGlmIChpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAvLyAgICAgICBpdGVtLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiAoY2hpbGQuc2VsZWN0ZWQgPSBmYWxzZSkpO1xuICAgICAgLy8gICAgIH1cbiAgICAgIC8vICAgfSk7XG5cblxuICAgICAgLy8gICB0aGlzLmN1cnJlbnREYXRhID0gdGhpcy5jYXJkRGF0YVZpZXcub25JdGVtQ2xpY2sobmV3VXNlcik7XG5cbiAgICAgIC8vICAgLy8gRm9yY2UgY2hhbmdlIGRldGVjdGlvbiBpZiBuZWVkZWRcbiAgICAgIC8vICAgLy8gdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAvLyB9XG5cblxuXG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwic3BhY2UteS04XCI+XG4gIDx2ZXJiZW4tZGF0YS12aWV3XG4gICAgI3ZkdlxuICAgIFt2aWV3U3RhdGVdPVwie1xuICAgICAgaXNTZWFyY2g6IHRydWUsXG4gICAgICBpc0NvbHVtbjogdHJ1ZSxcbiAgICAgIGlzRmlsdGVyOiB0cnVlLFxuICAgICAgaXNTb3J0OiB0cnVlLFxuICAgICAgaXNFeHBvcnQ6IHRydWUsXG4gICAgICBpc1NlbGVjdDogdHJ1ZSxcbiAgICAgIGlzQ3JlYXRlOiB0cnVlXG4gICAgfVwiXG4gICAgW2J1dHRvbkNsYXNzXT1cIidteS1jdXN0b20tYnV0dG9uLWNsYXNzJ1wiXG4gICAgW2ljb25DbGFzc109XCInbXktaWNvbi1jbGFzcydcIlxuICAgIFthY3RpdmVJY29uQ2xhc3NdPVwiJ215LWFjdGl2ZS1pY29uLWNsYXNzJ1wiXG4gICAgW3NlbGVjdGVkQ29sdW1uQ291bnRdPVwiMFwiXG4gICAgW3NlbGVjdGVkU29ydENvdW50XT1cIjBcIlxuICAgIFtzZWxlY3RlZEZpbHRlclRhYmxlQ291bnRdPVwiMFwiXG4gICAgKHZpZXdDaGFuZ2UpPVwib25WaWV3Q2hhbmdlKCRldmVudClcIlxuICAgIChzdGF0ZUNoYW5nZSk9XCJvblN0YXRlQ2hhbmdlKCRldmVudClcIlxuICA+XG4gICAgPGRpdiB0YWJsZS1jb250ZW50PlxuICAgICAgPGxpYi1kYXRhLXRhYmxlXG4gICAgICAgIFtkYXRhXT1cImRhdGFcIlxuICAgICAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcbiAgICAgICAgW3N0eWxlQ29uZmlnXT1cInN0eWxlc1wiXG4gICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cImNyZWF0ZWRBdFwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXZhbHVlPlxuICAgICAgICAgIHt7IHZhbHVlIHwgZGF0ZSB9fVxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cImFjdGlvbnNcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC12YWx1ZSBsZXQtZGVsZXRlUm93ID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNlwiPlxuICAgICAgICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5EZXRhaWxWaWV3KHZhbHVlKVwiXG4gICAgICAgICAgICAgIGljb249XCJlZGl0XCJcbiAgICAgICAgICAgICAgW3dpZHRoXT1cIjE1XCJcbiAgICAgICAgICAgICAgW2hlaWdodF09XCIxNVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgPjwvdmVyYmVuLXN2Zz5cblxuICAgICAgICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgICAgICAgaWNvbj1cImRlbGV0ZVwiXG4gICAgICAgICAgICAgIFt3aWR0aF09XCIxNVwiXG4gICAgICAgICAgICAgIFtoZWlnaHRdPVwiMTVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlUm93KClcIlxuICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgID48L3ZlcmJlbi1zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgIDxzdHJvbmc+QWN0aW9uczwvc3Ryb25nPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwic3RhdHVzXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgI2NlbGxcbiAgICAgICAgICBsZXQtaXNFZGl0aW5nPVwiaXNFZGl0aW5nXCJcbiAgICAgICAgICBsZXQtdG9nZ2xlUm93RWRpdD1cInRvZ2dsZVJvd0VkaXRcIlxuICAgICAgICAgIGxldC1kZWxldGVSb3c9XCJkZWxldGVSb3dcIlxuICAgICAgICAgIGxldC12YWx1ZT1cInZhbHVlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dmVyYmVuYS1iYWRnZVxuICAgICAgICAgICBib3JkZXJSYWRpdXM9XCIyMHB4XCJcbiAgICAgICAgICAgd2lkdGg9XCIxMjFweFwiXG4gICAgICAgICAgICB0ZXh0PVwie3t2YWx1ZX19XCJcbiAgICAgICAgICAgIGJnQ29sb3I9XCIjRDZGM0U2XCJcbiAgICAgICAgICAgIHRleHRDb2xvcj1cIiMyREI3NkZcIlxuICAgICAgICAgICAgcGQ9XCI1cHggMTVweFwiXG4gICAgICAgICAgICBmb250U2l6ZT1cIjE2cHhcIlxuICAgICAgICAgID5cblxuXG4gICAgICAgIDwvdmVyYmVuYS1iYWRnZT5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJyb2xlXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgI2NlbGxcbiAgICAgICAgICBsZXQtaXNFZGl0aW5nPVwiaXNFZGl0aW5nXCJcbiAgICAgICAgICBsZXQtdG9nZ2xlUm93RWRpdD1cInRvZ2dsZVJvd0VkaXRcIlxuICAgICAgICAgIGxldC1kZWxldGVSb3c9XCJkZWxldGVSb3dcIlxuICAgICAgICAgIGxldC12YWx1ZT1cInZhbHVlXCJcbiAgICAgICAgICBsZXQtdXBkYXRlVmFsdWU9XCJ1cGRhdGVWYWx1ZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPCEtLSA8dmVyYmVuLWRyb3AtZG93biBbbWluQ2hhcl09XCIzXCIgW3JlcXVpcmVkXT1cInRydWVcIiBwbGFjZWhvbGRlcj1cIlNlbGVjdCBQYXJlbnRcIlxuICAgICAgICAgICAgW2FzeW5jTGFiZWxdPVwidGhpcy5nZXRQYXJlbnRMYWJlbC5iaW5kKHRoaXMpXCIgaW52YWxpZE1lc3NhZ2U9XCJObyB2YWx1ZSB3YXMgcHJvdmlkZWRcIlxuICAgICAgICAgICAgIHdpZHRoPVwiMTIwcHhcIlxuICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRHJvcGRvd25DaGFuZ2UoJGV2ZW50KVwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRQYXJlbnRcIiBvcHRpb25MYWJlbD1cIk5hbWVcIiBvcHRpb25WYWx1ZT1cIklkXCJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cInRlc3RQYXJlbnRzXCI+PC92ZXJiZW4tZHJvcC1kb3duPiAtLT5cblxuICAgICAgICAgICAgPHZlcmJlbi1kcm9wLWRvd25cbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IFZhbHVlXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRHJvcGRvd25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJ0ZXN0UGFyZW50c1wiXG4gICAgICAgICAgICBvcHRpb25MYWJlbD1cIk5hbWVcIlxuICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJOYW1lXCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cInZhbHVlXCJcbiAgICAgICAgICA+PC92ZXJiZW4tZHJvcC1kb3duPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9saWItZGF0YS10YWJsZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNhcmQtY29udGVudD5cbiAgICAgIDx2ZXJiZW4tY2FyZC1kYXRhLXZpZXdcbiAgICAgICAgYm9yZGVyUmFkaXVzPVwiMTJweFwiXG4gICAgICAgIChsb2FkTW9yZUNsaWNrKT1cImxvYWRNb3JlKClcIlxuICAgICAgICAjdmRjdlxuICAgICAgICBkYXRhSWQ9XCJNYWlsQWRkcmVzc1wiXG4gICAgICAgIGJvcmRlcj1cIjVweFwiXG4gICAgICAgIFtjYXJkRGF0YUxpc3RdPVwiY2FyZERhdGFcIlxuICAgICAgICByYmdDb2xvcj1cIiNmNWY2ZjlcIlxuICAgICAgICBtZz1cIjIwcHhcIlxuICAgICAgPlxuICAgICAgICA8dmVyYmVuLWxlZnQtY2FyZC1kYXRhLXZpZXcgY2xhc3M9XCJcIj5cbiAgICAgICAgICA8dmVyYmVuLWxlZnQtY2FyZC1kYXRhXG4gICAgICAgICAgICAjdmxjZFxuICAgICAgICAgICAgW3BhcmVudF09XCJ2ZGN2XCJcbiAgICAgICAgICAgIGRhdGFJZD1cIk1haWxBZGRyZXNzXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYmctc2Vjb25kYXJ5LTEwMCByb3VuZGVkLXhsIGJvcmRlci1wcmltYXJ5IGJvcmRlci1bMXB4XVwiXG4gICAgICAgICAgICBbY2FyZERhdGFMaXN0XT1cImNhcmREYXRhXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NhcmQgbGV0LWl0ZW0+XG4gICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImN1cnJlbnREYXRhID0gdmRjdi5vbkl0ZW1DbGljayhpdGVtKVwiIGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgICAgICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAgICAgICAgICAgICBbd2lkdGhdPVwiMTVcIlxuICAgICAgICAgICAgICAgICAgW2hlaWdodF09XCIxNVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwidmxjZC5zaG93Q2hpbGRyZW4oaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwidmxjZC5zaG93VG9nZ2xlKGl0ZW0pID8gJ3Zpc2libGUnIDogJ2ludmlzaWJsZSdcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtcy1jZW50ZXIgZmxleCBwci0xIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgIFtpY29uXT1cIml0ZW0uaXNDaGlsZHJlbkV4cGFuZGVkID8gJ21pbnVzJyA6ICdwbHVzJ1wiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY3VycmVudERhdGEgPSB2ZGN2Lm9uSXRlbUNsaWNrKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBjdXJzb3ItcG9pbnRlciB3LWZ1bGwgYmctc2Vjb25kYXJ5IHJvdW5kZWQteGxcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTMgcm91bmRlZC14bCByb3VuZGVkLXRyLW5vbmUgcm91bmRlZC1ici1ub25lXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZWxlY3RlZCA/ICdiZy1wcmltYXJ5JyA6ICdiZy1zZWNvbmRhcnktMjAwJ1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgcHktMiBweC00IHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3BhY2UteS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtc2VtaWJvbGQgdGV4dC1bIzQwNDA0MF1cIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnRpdGxlXG4gICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBob25lXCIgY2xhc3M9XCJ0ZXh0LVsxMHB4XSBmb250LWxpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+UGhvbmUgTnVtYmVyOjwvbGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD1cInBob25lXCIgY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRhdGEuUGhvbmVOdW1iZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3BhY2UteS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImdyaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBob25lXCIgY2xhc3M9XCJ0ZXh0LVsxMHB4XSBmb250LWxpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Um9sZTwvbGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD1cInBob25lXCIgY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+TWFuYWdlcjwvc3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxsaWItdXNlci1hY2Nlc3MtcmVxdWVzdC1zdGF0dXMtYmFkZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0YXR1c109XCJpdGVtLmRhdGEuU3RhdHVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2xpYi11c2VyLWFjY2Vzcy1yZXF1ZXN0LXN0YXR1cy1iYWRnZT4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtbm9ybWFsIHRleHQtc21cIj57eyBpdGVtLnRpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoY2lJdGVtIG9mIGl0ZW0uYm9keTsgdHJhY2sgY2lJdGVtLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWQgZm9udC1saWdodCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID57eyBjaUl0ZW0udGl0bGUgfX06PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1ibGFja1wiPnt7IGNpSXRlbS52YWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH0gLS0+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvdmVyYmVuLWxlZnQtY2FyZC1kYXRhPlxuICAgICAgICA8L3ZlcmJlbi1sZWZ0LWNhcmQtZGF0YS12aWV3PlxuXG4gICAgICAgIDx2ZXJiZW4tcmlnaHQtY2FyZC1kYXRhLXZpZXc+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNwYXJlbnQ+XG4gICAgICAgICAgICA8bGliLXVzZXItcmVxdWVzdC1mb3JtXG4gICAgICAgICAgICAgIFtjdXJyZW50RGF0YV09XCJjdXJyZW50RGF0YVwiXG4gICAgICAgICAgICAgIChzd2l0Y2hWaWV3KT1cInZkdi50b2dnbGVWaWV3KClcIlxuICAgICAgICAgICAgPjwvbGliLXVzZXItcmVxdWVzdC1mb3JtPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvdmVyYmVuLXJpZ2h0LWNhcmQtZGF0YS12aWV3PlxuXG4gICAgICAgIDx2ZXJiZW4tY2FyZC1kYXRhLXZpZXctZm9vdGVyIGNsYXNzPVwiZmxvYXQtcmlnaHRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMlwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWdpbmF0b3ItdGV4dFwiXG4gICAgICAgICAgICAgID57eyBjYXJkRGF0YS5sZW5ndGggfX0gcmVjb3JkcyBsb2FkZWQ8L3NwYW5cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImxvYWRNb3JlKClcIiBjbGFzcz1cImxvYWQtbW9yZVwiPkxvYWQgbW9yZTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3ZlcmJlbi1jYXJkLWRhdGEtdmlldy1mb290ZXI+XG4gICAgICA8L3ZlcmJlbi1jYXJkLWRhdGEtdmlldz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNvbHVtbi1jb250ZW50PlxuICAgICAgPHZlcmJlbi12aXNpYmxlLWNvbHVtblxuICAgICAgICAoY29sdW1uc1VwZGF0ZWQpPVwib25Db2x1bW5zVXBkYXRlZCgkZXZlbnQpXCJcbiAgICAgICAgW2JvcmRlcl09XCInMXB4IHNvbGlkIHJnYmEoMjEyLCAxNjAsIDcsIDEpJ1wiXG4gICAgICAgIGJvcmRlclJhZGl1cz1cIjEwcHhcIlxuICAgICAgICBib3hTaGFkb3c9XCIycHggMnB4IDJweCAwcHggc2lsdmVyXCJcbiAgICAgICAgYmdDb2xvcj1cIndoaXRlXCJcbiAgICAgICAgd2lkdGg9XCI0MDBweFwiXG4gICAgICAgIHRleHRDb2xvcj1cImJsYWNrXCJcbiAgICAgICAgcGQ9XCIxcmVtXCJcbiAgICAgICAgcHJpbWFyeUNvbG9yPVwiI0ZGRTY4MVwiXG4gICAgICAgIHNlY29uZGFyeUNvbG9yPVwiIzM0NzlFOVwiXG4gICAgICAgIFtjb2x1bW5zXT1cInZpc2libGVDb2x1bW5zXCJcbiAgICAgICAgW2Rpc3BsYXllZENvbHVtbnNdPVwiNVwiXG4gICAgICA+PC92ZXJiZW4tdmlzaWJsZS1jb2x1bW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBmaWx0ZXItY29udGVudD5cbiAgICAgIDx2ZXJiZW4tdGFibGUtZmlsdGVyXG4gICAgICAgIFtib3JkZXJdPVwiJzFweCBzb2xpZCByZ2JhKDIxMiwgMTYwLCA3LCAxKSdcIlxuICAgICAgICBib3JkZXJSYWRpdXM9XCIxMHB4XCJcbiAgICAgICAgYm94U2hhZG93PVwiMnB4IDJweCAycHggMHB4IHNpbHZlclwiXG4gICAgICAgIGJnQ29sb3I9XCJ3aGl0ZVwiXG4gICAgICAgIHdpZHRoPVwiNDIwcHhcIlxuICAgICAgICB0ZXh0Q29sb3I9XCJibGFja1wiXG4gICAgICAgIHBkPVwiMXJlbVwiXG4gICAgICAgIHByaW1hcnlDb2xvcj1cIiNGRkU2ODFcIlxuICAgICAgICBzZWNvbmRhcnlDb2xvcj1cIiMzNDc5RTlcIlxuICAgICAgICB0ZXJ0aWFyeUNvbG9yPVwiIzQwNDA0MFwiXG4gICAgICAgIFtmaWx0ZXJPcHRpb25zXT1cImZpbHRlckFycmF5XCJcbiAgICAgICAgW21heEZpbHRlckxlbmd0aF09XCIzXCJcbiAgICAgID48L3ZlcmJlbi10YWJsZS1maWx0ZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBzb3J0LWNvbnRlbnQ+XG4gICAgICA8dmVyYmVuLXNvcnQtdGFibGVcbiAgICAgICAgKHNlbGVjdGVkT3B0aW9ucyk9XCJvblNvcnRVcGRhdGVkKCRldmVudClcIlxuICAgICAgICBbYm9yZGVyXT1cIicxcHggc29saWQgcmdiYSgyMTIsIDE2MCwgNywgMSknXCJcbiAgICAgICAgYm9yZGVyUmFkaXVzPVwiMTBweFwiXG4gICAgICAgIGJveFNoYWRvdz1cIjJweCAycHggMnB4IDBweCBzaWx2ZXJcIlxuICAgICAgICBiZ0NvbG9yPVwid2hpdGVcIlxuICAgICAgICB3aWR0aD1cIjQwMHB4XCJcbiAgICAgICAgdGV4dENvbG9yPVwiYmxhY2tcIlxuICAgICAgICBwZD1cIjFyZW1cIlxuICAgICAgICBwcmltYXJ5Q29sb3I9XCIjRkZFNjgxXCJcbiAgICAgICAgc2Vjb25kYXJ5Q29sb3I9XCIjMzQ3OUU5XCJcbiAgICAgICAgdGVydGlhcnlDb2xvcj1cIiM0MDQwNDBcIlxuICAgICAgICBbZW5hYmxlRHJhZ0FuZERyb3BdPVwidHJ1ZVwiXG4gICAgICAgIFtzb3J0T3B0aW9uc109XCJzb3J0T3B0aW9uc1wiXG4gICAgICA+PC92ZXJiZW4tc29ydC10YWJsZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGV4cG9ydC1jb250ZW50PlxuICAgICAgPGxpYi1kYXRhLWV4cG9ydCBbZGF0YV09XCJkYXRhXCIgKGV4cG9ydERhdGFFdmVudCk9XCJoYW5kbGVFeHBvcnQoJGV2ZW50KVwiPlxuICAgICAgPC9saWItZGF0YS1leHBvcnQ+XG4gICAgPC9kaXY+XG4gIDwvdmVyYmVuLWRhdGEtdmlldz5cbjwvZGl2PlxuIl19