@cqa-lib/cqa-ui 1.1.520 → 1.1.521

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.
@@ -0,0 +1,204 @@
1
+ import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../custom-input/custom-input.component";
4
+ import * as i2 from "../dropdown-button/dropdown-button.component";
5
+ import * as i3 from "../permission-toggle/permission-toggle.component";
6
+ import * as i4 from "../custom-textarea/custom-textarea.component";
7
+ import * as i5 from "@angular/common";
8
+ export class NewGlobalVariableDialogComponent {
9
+ constructor(cdr) {
10
+ this.cdr = cdr;
11
+ this.mode = 'create';
12
+ this.existingNames = [];
13
+ this.typeOptions = ['String', 'Number', 'Boolean', 'Password'];
14
+ this.typeDropdownOptions = [
15
+ { label: 'String', value: 'String' },
16
+ { label: 'Number', value: 'Number' },
17
+ { label: 'Boolean', value: 'Boolean' },
18
+ { label: 'Password', value: 'Password' },
19
+ ];
20
+ this.permissionSegments = [
21
+ { label: 'RO', value: 'RO', icon: 'lock' },
22
+ { label: 'RW', value: 'RW', icon: 'edit' },
23
+ ];
24
+ this.name = '';
25
+ this.type = 'String';
26
+ this.value = '';
27
+ this.readWriteMode = 'RW';
28
+ this.description = '';
29
+ this.passwordTouched = false;
30
+ this.nameError = null;
31
+ this.valueError = null;
32
+ }
33
+ ngOnInit() {
34
+ if (this.initialValue) {
35
+ this.name = this.initialValue.name ?? '';
36
+ this.type = this.initialValue.type ?? 'String';
37
+ this.value = this.initialValue.value ?? '';
38
+ this.readWriteMode = this.initialValue.readWriteMode ?? 'RW';
39
+ this.description = this.initialValue.description ?? '';
40
+ }
41
+ if (this.type === 'Boolean' && this.value !== 'true' && this.value !== 'false') {
42
+ this.value = 'false';
43
+ }
44
+ if (this.mode === 'edit' && this.type === 'Password') {
45
+ this.value = '';
46
+ }
47
+ }
48
+ get title() {
49
+ return this.mode === 'edit' ? 'Edit global variable' : 'New global variable';
50
+ }
51
+ get subtitle() {
52
+ return 'Workspace-wide — accessible from any test case, any environment.';
53
+ }
54
+ get primaryButtonLabel() {
55
+ return this.mode === 'edit' ? 'Save changes' : 'Create variable';
56
+ }
57
+ get isBoolean() {
58
+ return this.type === 'Boolean';
59
+ }
60
+ get isPassword() {
61
+ return this.type === 'Password';
62
+ }
63
+ get isNumber() {
64
+ return this.type === 'Number';
65
+ }
66
+ get valuePlaceholder() {
67
+ if (this.isPassword && this.mode === 'edit') {
68
+ return '•••••• (leave blank to keep existing)';
69
+ }
70
+ return '';
71
+ }
72
+ get nameHelperText() {
73
+ if (this.nameError) {
74
+ return this.nameError;
75
+ }
76
+ return 'Names must be unique across the entire workspace (primary key — no duplicates).';
77
+ }
78
+ get nameErrorsArray() {
79
+ return this.nameError ? [this.nameError] : [];
80
+ }
81
+ get valueErrorsArray() {
82
+ return this.valueError ? [this.valueError] : [];
83
+ }
84
+ get booleanOptions() {
85
+ return [
86
+ { label: 'true', value: 'true' },
87
+ { label: 'false', value: 'false' },
88
+ ];
89
+ }
90
+ get booleanDropdownOptions() {
91
+ return this.booleanOptions;
92
+ }
93
+ onNameChange(next) {
94
+ this.name = next;
95
+ this.nameError = null;
96
+ this.cdr.markForCheck();
97
+ }
98
+ onTypeChange(next) {
99
+ if (!next) {
100
+ return;
101
+ }
102
+ this.type = next;
103
+ if (this.type === 'Boolean' && this.value !== 'true' && this.value !== 'false') {
104
+ this.value = 'false';
105
+ }
106
+ if (this.type === 'Password') {
107
+ this.passwordTouched = false;
108
+ if (this.mode === 'edit') {
109
+ this.value = '';
110
+ }
111
+ }
112
+ this.valueError = null;
113
+ this.cdr.markForCheck();
114
+ }
115
+ onPermissionChange(next) {
116
+ this.readWriteMode = next === 'RO' ? 'RO' : 'RW';
117
+ this.cdr.markForCheck();
118
+ }
119
+ onValueChange(next) {
120
+ this.value = next;
121
+ if (this.isPassword) {
122
+ this.passwordTouched = true;
123
+ }
124
+ this.valueError = null;
125
+ this.cdr.markForCheck();
126
+ }
127
+ onBooleanValueChange(next) {
128
+ this.value = next;
129
+ this.cdr.markForCheck();
130
+ }
131
+ onDescriptionChange(next) {
132
+ this.description = next;
133
+ this.cdr.markForCheck();
134
+ }
135
+ /**
136
+ * Called by the host (via DialogRef.getComponentInstance()) when the primary
137
+ * button is clicked. Returns the captured value when valid, or null when the
138
+ * form has errors — in which case the host should leave the dialog open.
139
+ */
140
+ getValue() {
141
+ const trimmedName = this.name.trim();
142
+ if (!trimmedName) {
143
+ this.nameError = 'Name is required.';
144
+ }
145
+ else if (this.isDuplicateName(trimmedName)) {
146
+ this.nameError = 'A global variable with this name already exists — names must be unique.';
147
+ }
148
+ else {
149
+ this.nameError = null;
150
+ }
151
+ if (this.isNumber && this.value && !this.isValidNumber(this.value)) {
152
+ this.valueError = 'Value must be a number.';
153
+ }
154
+ else {
155
+ this.valueError = null;
156
+ }
157
+ if (this.nameError || this.valueError) {
158
+ this.cdr.markForCheck();
159
+ return null;
160
+ }
161
+ const omitPasswordValue = this.isPassword && this.mode === 'edit' && !this.passwordTouched;
162
+ return {
163
+ name: trimmedName,
164
+ type: this.type,
165
+ value: omitPasswordValue ? null : this.serializeValue(),
166
+ readWriteMode: this.readWriteMode,
167
+ description: this.description ? this.description : null,
168
+ };
169
+ }
170
+ serializeValue() {
171
+ if (this.isBoolean) {
172
+ return this.value === 'true' ? 'true' : 'false';
173
+ }
174
+ return this.value ?? '';
175
+ }
176
+ isDuplicateName(candidate) {
177
+ const existing = (this.existingNames ?? []).map(n => (n ?? '').trim());
178
+ if (this.mode === 'edit') {
179
+ const original = (this.initialValue?.name ?? '').trim();
180
+ return candidate !== original && existing.includes(candidate);
181
+ }
182
+ return existing.includes(candidate);
183
+ }
184
+ isValidNumber(raw) {
185
+ const trimmed = raw.trim();
186
+ if (!trimmed) {
187
+ return true;
188
+ }
189
+ return !Number.isNaN(Number(trimmed));
190
+ }
191
+ }
192
+ NewGlobalVariableDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: NewGlobalVariableDialogComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
193
+ NewGlobalVariableDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: NewGlobalVariableDialogComponent, selector: "cqa-new-global-variable-dialog", inputs: { mode: "mode", initialValue: "initialValue", existingNames: "existingNames" }, host: { styleAttribute: "display:block;width:100%;", classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-w-full\">\n\n <!-- Name -->\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-custom-input\n label=\"Name\"\n placeholder=\"e.g. ihg_api_key\"\n type=\"text\"\n [value]=\"name\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n [errors]=\"nameErrorsArray\"\n inputInlineStyle=\"font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace;\"\n (valueChange)=\"onNameChange($event)\">\n </cqa-custom-input>\n <span *ngIf=\"!nameError\"\n class=\"cqa-text-xs cqa-text-gray-500 cqa-mt-1\">\n Names must be unique across the entire workspace (primary key \u2014 no duplicates).\n </span>\n </div>\n\n <!-- Type + Permission row -->\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col\">\n <label class=\"cqa-text-sm cqa-mb-1.5 cqa-font-medium cqa-text-gray-700\">Type</label>\n <cqa-dropdown-button\n [options]=\"typeDropdownOptions\"\n [selectedValue]=\"type\"\n (selectionChange)=\"onTypeChange($event)\">\n </cqa-dropdown-button>\n </div>\n <div class=\"cqa-flex cqa-flex-col\">\n <label class=\"cqa-text-sm cqa-mb-1.5 cqa-font-medium cqa-text-gray-700\">Permission</label>\n <div class=\"cqa-pt-0.5\">\n <cqa-permission-toggle\n [value]=\"readWriteMode\"\n (valueChange)=\"onPermissionChange($event)\">\n </cqa-permission-toggle>\n </div>\n </div>\n </div>\n\n <!-- Value -->\n <div class=\"cqa-flex cqa-flex-col\">\n <ng-container *ngIf=\"isBoolean; else nonBooleanValue\">\n <label class=\"cqa-text-sm cqa-mb-1.5 cqa-font-medium cqa-text-gray-700\">Value</label>\n <cqa-dropdown-button\n [options]=\"booleanDropdownOptions\"\n [selectedValue]=\"value\"\n (selectionChange)=\"onBooleanValueChange($event)\">\n </cqa-dropdown-button>\n </ng-container>\n <ng-template #nonBooleanValue>\n <cqa-custom-input\n label=\"Value\"\n [type]=\"isPassword ? 'password' : 'text'\"\n [value]=\"value\"\n [placeholder]=\"valuePlaceholder\"\n [fullWidth]=\"true\"\n [errors]=\"valueErrorsArray\"\n inputInlineStyle=\"font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace;\"\n (valueChange)=\"onValueChange($event)\">\n </cqa-custom-input>\n </ng-template>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-custom-textarea\n label=\"Description\"\n placeholder=\"What is this variable used for?\"\n [value]=\"description\"\n [rows]=\"2\"\n [fullWidth]=\"true\"\n (valueChange)=\"onDescriptionChange($event)\">\n </cqa-custom-textarea>\n </div>\n\n</div>\n", components: [{ type: i1.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i2.DropdownButtonComponent, selector: "cqa-dropdown-button", inputs: ["label", "options", "selectedValue", "disabled", "placeholder"], outputs: ["selectionChange", "opened", "closed"] }, { type: i3.PermissionToggleComponent, selector: "cqa-permission-toggle", inputs: ["value", "disabled", "roTooltip", "rwTooltip"], outputs: ["valueChange"] }, { type: i4.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "enableMarkdown", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
194
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: NewGlobalVariableDialogComponent, decorators: [{
195
+ type: Component,
196
+ args: [{ selector: 'cqa-new-global-variable-dialog', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'cqa-ui-root', style: 'display:block;width:100%;' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-w-full\">\n\n <!-- Name -->\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-custom-input\n label=\"Name\"\n placeholder=\"e.g. ihg_api_key\"\n type=\"text\"\n [value]=\"name\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n [errors]=\"nameErrorsArray\"\n inputInlineStyle=\"font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace;\"\n (valueChange)=\"onNameChange($event)\">\n </cqa-custom-input>\n <span *ngIf=\"!nameError\"\n class=\"cqa-text-xs cqa-text-gray-500 cqa-mt-1\">\n Names must be unique across the entire workspace (primary key \u2014 no duplicates).\n </span>\n </div>\n\n <!-- Type + Permission row -->\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col\">\n <label class=\"cqa-text-sm cqa-mb-1.5 cqa-font-medium cqa-text-gray-700\">Type</label>\n <cqa-dropdown-button\n [options]=\"typeDropdownOptions\"\n [selectedValue]=\"type\"\n (selectionChange)=\"onTypeChange($event)\">\n </cqa-dropdown-button>\n </div>\n <div class=\"cqa-flex cqa-flex-col\">\n <label class=\"cqa-text-sm cqa-mb-1.5 cqa-font-medium cqa-text-gray-700\">Permission</label>\n <div class=\"cqa-pt-0.5\">\n <cqa-permission-toggle\n [value]=\"readWriteMode\"\n (valueChange)=\"onPermissionChange($event)\">\n </cqa-permission-toggle>\n </div>\n </div>\n </div>\n\n <!-- Value -->\n <div class=\"cqa-flex cqa-flex-col\">\n <ng-container *ngIf=\"isBoolean; else nonBooleanValue\">\n <label class=\"cqa-text-sm cqa-mb-1.5 cqa-font-medium cqa-text-gray-700\">Value</label>\n <cqa-dropdown-button\n [options]=\"booleanDropdownOptions\"\n [selectedValue]=\"value\"\n (selectionChange)=\"onBooleanValueChange($event)\">\n </cqa-dropdown-button>\n </ng-container>\n <ng-template #nonBooleanValue>\n <cqa-custom-input\n label=\"Value\"\n [type]=\"isPassword ? 'password' : 'text'\"\n [value]=\"value\"\n [placeholder]=\"valuePlaceholder\"\n [fullWidth]=\"true\"\n [errors]=\"valueErrorsArray\"\n inputInlineStyle=\"font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace;\"\n (valueChange)=\"onValueChange($event)\">\n </cqa-custom-input>\n </ng-template>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\">\n <cqa-custom-textarea\n label=\"Description\"\n placeholder=\"What is this variable used for?\"\n [value]=\"description\"\n [rows]=\"2\"\n [fullWidth]=\"true\"\n (valueChange)=\"onDescriptionChange($event)\">\n </cqa-custom-textarea>\n </div>\n\n</div>\n" }]
197
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { mode: [{
198
+ type: Input
199
+ }], initialValue: [{
200
+ type: Input
201
+ }], existingNames: [{
202
+ type: Input
203
+ }] } });
204
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LWdsb2JhbC12YXJpYWJsZS1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9uZXctZ2xvYmFsLXZhcmlhYmxlLWRpYWxvZy9uZXctZ2xvYmFsLXZhcmlhYmxlLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL25ldy1nbG9iYWwtdmFyaWFibGUtZGlhbG9nL25ldy1nbG9iYWwtdmFyaWFibGUtZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQzs7Ozs7OztBQWFyRyxNQUFNLE9BQU8sZ0NBQWdDO0lBNkIzQyxZQUE2QixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQTVCMUMsU0FBSSxHQUFzQixRQUFRLENBQUM7UUFFbkMsa0JBQWEsR0FBYSxFQUFFLENBQUM7UUFFN0IsZ0JBQVcsR0FBMkIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUVsRix3QkFBbUIsR0FBcUQ7WUFDL0UsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDcEMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDcEMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7WUFDdEMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7U0FDekMsQ0FBQztRQUVPLHVCQUFrQixHQUFHO1lBQzVCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBa0MsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO1lBQ3hFLEVBQUUsS0FBSyxF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LEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkUsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUN4QixNQUFNLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hELE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQy9EO1FBQ0QsT0FBTyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFTyxhQUFhLENBQUMsR0FBVztRQUMvQixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDO1NBQUU7UUFDOUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDeEMsQ0FBQzs7NkhBaE5VLGdDQUFnQztpSEFBaEMsZ0NBQWdDLG9QQ2I3Qyx3eUZBK0VBOzJGRGxFYSxnQ0FBZ0M7a0JBTjVDLFNBQVM7K0JBQ0UsZ0NBQWdDLG1CQUV6Qix1QkFBdUIsQ0FBQyxNQUFNLFFBQ3pDLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsMkJBQTJCLEVBQUU7d0dBR3pELElBQUk7c0JBQVosS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgR2xvYmFsVmFyaWFibGVEaWFsb2dWYWx1ZSxcbiAgR2xvYmFsVmFyaWFibGVVSVBlcm1pc3Npb24sXG4gIEdsb2JhbFZhcmlhYmxlVUlUeXBlLFxufSBmcm9tICcuL25ldy1nbG9iYWwtdmFyaWFibGUtZGlhbG9nLm1vZGVscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1uZXctZ2xvYmFsLXZhcmlhYmxlLWRpYWxvZycsXG4gIHRlbXBsYXRlVXJsOiAnLi9uZXctZ2xvYmFsLXZhcmlhYmxlLWRpYWxvZy5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnLCBzdHlsZTogJ2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTsnIH0sXG59KVxuZXhwb3J0IGNsYXNzIE5ld0dsb2JhbFZhcmlhYmxlRGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgbW9kZTogJ2NyZWF0ZScgfCAnZWRpdCcgPSAnY3JlYXRlJztcbiAgQElucHV0KCkgaW5pdGlhbFZhbHVlPzogUGFydGlhbDxHbG9iYWxWYXJpYWJsZURpYWxvZ1ZhbHVlPjtcbiAgQElucHV0KCkgZXhpc3RpbmdOYW1lczogc3RyaW5nW10gPSBbXTtcblxuICByZWFkb25seSB0eXBlT3B0aW9uczogR2xvYmFsVmFyaWFibGVVSVR5cGVbXSA9IFsnU3RyaW5nJywgJ051bWJlcicsICdCb29sZWFuJywgJ1Bhc3N3b3JkJ107XG5cbiAgcmVhZG9ubHkgdHlwZURyb3Bkb3duT3B0aW9uczogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogR2xvYmFsVmFyaWFibGVVSVR5cGUgfVtdID0gW1xuICAgIHsgbGFiZWw6ICdTdHJpbmcnLCB2YWx1ZTogJ1N0cmluZycgfSxcbiAgICB7IGxhYmVsOiAnTnVtYmVyJywgdmFsdWU6ICdOdW1iZXInIH0sXG4gICAgeyBsYWJlbDogJ0Jvb2xlYW4nLCB2YWx1ZTogJ0Jvb2xlYW4nIH0sXG4gICAgeyBsYWJlbDogJ1Bhc3N3b3JkJywgdmFsdWU6ICdQYXNzd29yZCcgfSxcbiAgXTtcblxuICByZWFkb25seSBwZXJtaXNzaW9uU2VnbWVudHMgPSBbXG4gICAgeyBsYWJlbDogJ1JPJywgdmFsdWU6ICdSTycgYXMgR2xvYmFsVmFyaWFibGVVSVBlcm1pc3Npb24sIGljb246ICdsb2NrJyB9LFxuICAgIHsgbGFiZWw6ICdSVycsIHZhbHVlOiAnUlcnIGFzIEdsb2JhbFZhcmlhYmxlVUlQZXJtaXNzaW9uLCBpY29uOiAnZWRpdCcgfSxcbiAgXTtcblxuICBuYW1lID0gJyc7XG4gIHR5cGU6IEdsb2JhbFZhcmlhYmxlVUlUeXBlID0gJ1N0cmluZyc7XG4gIHZhbHVlID0gJyc7XG4gIHJlYWRXcml0ZU1vZGU6IEdsb2JhbFZhcmlhYmxlVUlQZXJtaXNzaW9uID0gJ1JXJztcbiAgZGVzY3JpcHRpb24gPSAnJztcbiAgcGFzc3dvcmRUb3VjaGVkID0gZmFsc2U7XG5cbiAgbmFtZUVycm9yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgdmFsdWVFcnJvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmluaXRpYWxWYWx1ZSkge1xuICAgICAgdGhpcy5uYW1lID0gdGhpcy5pbml0aWFsVmFsdWUubmFtZSA/PyAnJztcbiAgICAgIHRoaXMudHlwZSA9IHRoaXMuaW5pdGlhbFZhbHVlLnR5cGUgPz8gJ1N0cmluZyc7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5pbml0aWFsVmFsdWUudmFsdWUgPz8gJyc7XG4gICAgICB0aGlzLnJlYWRXcml0ZU1vZGUgPSB0aGlzLmluaXRpYWxWYWx1ZS5yZWFkV3JpdGVNb2RlID8/ICdSVyc7XG4gICAgICB0aGlzLmRlc2NyaXB0aW9uID0gdGhpcy5pbml0aWFsVmFsdWUuZGVzY3JpcHRpb24gPz8gJyc7XG4gICAgfVxuICAgIGlmICh0aGlzLnR5cGUgPT09ICdCb29sZWFuJyAmJiB0aGlzLnZhbHVlICE9PSAndHJ1ZScgJiYgdGhpcy52YWx1ZSAhPT0gJ2ZhbHNlJykge1xuICAgICAgdGhpcy52YWx1ZSA9ICdmYWxzZSc7XG4gICAgfVxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdlZGl0JyAmJiB0aGlzLnR5cGUgPT09ICdQYXNzd29yZCcpIHtcbiAgICAgIHRoaXMudmFsdWUgPSAnJztcbiAgICB9XG4gIH1cblxuICBnZXQgdGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSAnZWRpdCcgPyAnRWRpdCBnbG9iYWwgdmFyaWFibGUnIDogJ05ldyBnbG9iYWwgdmFyaWFibGUnO1xuICB9XG5cbiAgZ2V0IHN1YnRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdXb3Jrc3BhY2Utd2lkZSDigJQgYWNjZXNzaWJsZSBmcm9tIGFueSB0ZXN0IGNhc2UsIGFueSBlbnZpcm9ubWVudC4nO1xuICB9XG5cbiAgZ2V0IHByaW1hcnlCdXR0b25MYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09ICdlZGl0JyA/ICdTYXZlIGNoYW5nZXMnIDogJ0NyZWF0ZSB2YXJpYWJsZSc7XG4gIH1cblxuICBnZXQgaXNCb29sZWFuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdCb29sZWFuJztcbiAgfVxuXG4gIGdldCBpc1Bhc3N3b3JkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdQYXNzd29yZCc7XG4gIH1cblxuICBnZXQgaXNOdW1iZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ051bWJlcic7XG4gIH1cblxuICBnZXQgdmFsdWVQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzUGFzc3dvcmQgJiYgdGhpcy5tb2RlID09PSAnZWRpdCcpIHtcbiAgICAgIHJldHVybiAn4oCi4oCi4oCi4oCi4oCi4oCiIChsZWF2ZSBibGFuayB0byBrZWVwIGV4aXN0aW5nKSc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGdldCBuYW1lSGVscGVyVGV4dCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm5hbWVFcnJvcikge1xuICAgICAgcmV0dXJuIHRoaXMubmFtZUVycm9yO1xuICAgIH1cbiAgICByZXR1cm4gJ05hbWVzIG11c3QgYmUgdW5pcXVlIGFjcm9zcyB0aGUgZW50aXJlIHdvcmtzcGFjZSAocHJpbWFyeSBrZXkg4oCUIG5vIGR1cGxpY2F0ZXMpLic7XG4gIH1cblxuICBnZXQgbmFtZUVycm9yc0FycmF5KCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lRXJyb3IgPyBbdGhpcy5uYW1lRXJyb3JdIDogW107XG4gIH1cblxuICBnZXQgdmFsdWVFcnJvcnNBcnJheSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVFcnJvciA/IFt0aGlzLnZhbHVlRXJyb3JdIDogW107XG4gIH1cblxuICBnZXQgYm9vbGVhbk9wdGlvbnMoKTogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgbGFiZWw6ICd0cnVlJywgdmFsdWU6ICd0cnVlJyB9LFxuICAgICAgeyBsYWJlbDogJ2ZhbHNlJywgdmFsdWU6ICdmYWxzZScgfSxcbiAgICBdO1xuICB9XG5cbiAgZ2V0IGJvb2xlYW5Ecm9wZG93bk9wdGlvbnMoKTogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSB7XG4gICAgcmV0dXJuIHRoaXMuYm9vbGVhbk9wdGlvbnM7XG4gIH1cblxuICBvbk5hbWVDaGFuZ2UobmV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5uYW1lID0gbmV4dDtcbiAgICB0aGlzLm5hbWVFcnJvciA9IG51bGw7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvblR5cGVDaGFuZ2UobmV4dDogR2xvYmFsVmFyaWFibGVVSVR5cGUpOiB2b2lkIHtcbiAgICBpZiAoIW5leHQpIHsgcmV0dXJuOyB9XG4gICAgdGhpcy50eXBlID0gbmV4dDtcbiAgICBpZiAodGhpcy50eXBlID09PSAnQm9vbGVhbicgJiYgdGhpcy52YWx1ZSAhPT0gJ3RydWUnICYmIHRoaXMudmFsdWUgIT09ICdmYWxzZScpIHtcbiAgICAgIHRoaXMudmFsdWUgPSAnZmFsc2UnO1xuICAgIH1cbiAgICBpZiAodGhpcy50eXBlID09PSAnUGFzc3dvcmQnKSB7XG4gICAgICB0aGlzLnBhc3N3b3JkVG91Y2hlZCA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ2VkaXQnKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSAnJztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy52YWx1ZUVycm9yID0gbnVsbDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uUGVybWlzc2lvbkNoYW5nZShuZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJlYWRXcml0ZU1vZGUgPSBuZXh0ID09PSAnUk8nID8gJ1JPJyA6ICdSVyc7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvblZhbHVlQ2hhbmdlKG5leHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSBuZXh0O1xuICAgIGlmICh0aGlzLmlzUGFzc3dvcmQpIHtcbiAgICAgIHRoaXMucGFzc3dvcmRUb3VjaGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy52YWx1ZUVycm9yID0gbnVsbDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uQm9vbGVhblZhbHVlQ2hhbmdlKG5leHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSBuZXh0O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25EZXNjcmlwdGlvbkNoYW5nZShuZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gbmV4dDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIGhvc3QgKHZpYSBEaWFsb2dSZWYuZ2V0Q29tcG9uZW50SW5zdGFuY2UoKSkgd2hlbiB0aGUgcHJpbWFyeVxuICAgKiBidXR0b24gaXMgY2xpY2tlZC4gUmV0dXJucyB0aGUgY2FwdHVyZWQgdmFsdWUgd2hlbiB2YWxpZCwgb3IgbnVsbCB3aGVuIHRoZVxuICAgKiBmb3JtIGhhcyBlcnJvcnMg4oCUIGluIHdoaWNoIGNhc2UgdGhlIGhvc3Qgc2hvdWxkIGxlYXZlIHRoZSBkaWFsb2cgb3Blbi5cbiAgICovXG4gIGdldFZhbHVlKCk6IEdsb2JhbFZhcmlhYmxlRGlhbG9nVmFsdWUgfCBudWxsIHtcbiAgICBjb25zdCB0cmltbWVkTmFtZSA9IHRoaXMubmFtZS50cmltKCk7XG5cbiAgICBpZiAoIXRyaW1tZWROYW1lKSB7XG4gICAgICB0aGlzLm5hbWVFcnJvciA9ICdOYW1lIGlzIHJlcXVpcmVkLic7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzRHVwbGljYXRlTmFtZSh0cmltbWVkTmFtZSkpIHtcbiAgICAgIHRoaXMubmFtZUVycm9yID0gJ0EgZ2xvYmFsIHZhcmlhYmxlIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzIOKAlCBuYW1lcyBtdXN0IGJlIHVuaXF1ZS4nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hbWVFcnJvciA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNOdW1iZXIgJiYgdGhpcy52YWx1ZSAmJiAhdGhpcy5pc1ZhbGlkTnVtYmVyKHRoaXMudmFsdWUpKSB7XG4gICAgICB0aGlzLnZhbHVlRXJyb3IgPSAnVmFsdWUgbXVzdCBiZSBhIG51bWJlci4nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlRXJyb3IgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm5hbWVFcnJvciB8fCB0aGlzLnZhbHVlRXJyb3IpIHtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgb21pdFBhc3N3b3JkVmFsdWUgPSB0aGlzLmlzUGFzc3dvcmQgJiYgdGhpcy5tb2RlID09PSAnZWRpdCcgJiYgIXRoaXMucGFzc3dvcmRUb3VjaGVkO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRyaW1tZWROYW1lLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgdmFsdWU6IG9taXRQYXNzd29yZFZhbHVlID8gbnVsbCA6IHRoaXMuc2VyaWFsaXplVmFsdWUoKSxcbiAgICAgIHJlYWRXcml0ZU1vZGU6IHRoaXMucmVhZFdyaXRlTW9kZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uID8gdGhpcy5kZXNjcmlwdGlvbiA6IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2VyaWFsaXplVmFsdWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuaXNCb29sZWFuKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gJ3RydWUnID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmFsdWUgPz8gJyc7XG4gIH1cblxuICBwcml2YXRlIGlzRHVwbGljYXRlTmFtZShjYW5kaWRhdGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gKHRoaXMuZXhpc3RpbmdOYW1lcyA/PyBbXSkubWFwKG4gPT4gKG4gPz8gJycpLnRyaW0oKSk7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2VkaXQnKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbCA9ICh0aGlzLmluaXRpYWxWYWx1ZT8ubmFtZSA/PyAnJykudHJpbSgpO1xuICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gb3JpZ2luYWwgJiYgZXhpc3RpbmcuaW5jbHVkZXMoY2FuZGlkYXRlKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4aXN0aW5nLmluY2x1ZGVzKGNhbmRpZGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIGlzVmFsaWROdW1iZXIocmF3OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCB0cmltbWVkID0gcmF3LnRyaW0oKTtcbiAgICBpZiAoIXRyaW1tZWQpIHsgcmV0dXJuIHRydWU7IH1cbiAgICByZXR1cm4gIU51bWJlci5pc05hTihOdW1iZXIodHJpbW1lZCkpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNCBjcWEtdy1mdWxsXCI+XG5cbiAgPCEtLSBOYW1lIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgIGxhYmVsPVwiTmFtZVwiXG4gICAgICBwbGFjZWhvbGRlcj1cImUuZy4gaWhnX2FwaV9rZXlcIlxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgW3ZhbHVlXT1cIm5hbWVcIlxuICAgICAgW3JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgIFtlcnJvcnNdPVwibmFtZUVycm9yc0FycmF5XCJcbiAgICAgIGlucHV0SW5saW5lU3R5bGU9XCJmb250LWZhbWlseTogdWktbW9ub3NwYWNlLCBTRk1vbm8tUmVndWxhciwgTWVubG8sIE1vbmFjbywgQ29uc29sYXMsICdMaWJlcmF0aW9uIE1vbm8nLCBtb25vc3BhY2U7XCJcbiAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbk5hbWVDaGFuZ2UoJGV2ZW50KVwiPlxuICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICA8c3BhbiAqbmdJZj1cIiFuYW1lRXJyb3JcIlxuICAgICAgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1ncmF5LTUwMCBjcWEtbXQtMVwiPlxuICAgICAgTmFtZXMgbXVzdCBiZSB1bmlxdWUgYWNyb3NzIHRoZSBlbnRpcmUgd29ya3NwYWNlIChwcmltYXJ5IGtleSDigJQgbm8gZHVwbGljYXRlcykuXG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cblxuICA8IS0tIFR5cGUgKyBQZXJtaXNzaW9uIHJvdyAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1ncmlkIGNxYS1ncmlkLWNvbHMtMiBjcWEtZ2FwLTRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbWItMS41IGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMFwiPlR5cGU8L2xhYmVsPlxuICAgICAgPGNxYS1kcm9wZG93bi1idXR0b25cbiAgICAgICAgW29wdGlvbnNdPVwidHlwZURyb3Bkb3duT3B0aW9uc1wiXG4gICAgICAgIFtzZWxlY3RlZFZhbHVlXT1cInR5cGVcIlxuICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uVHlwZUNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICA8L2NxYS1kcm9wZG93bi1idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLW1iLTEuNSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDBcIj5QZXJtaXNzaW9uPC9sYWJlbD5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcHQtMC41XCI+XG4gICAgICAgIDxjcWEtcGVybWlzc2lvbi10b2dnbGVcbiAgICAgICAgICBbdmFsdWVdPVwicmVhZFdyaXRlTW9kZVwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uUGVybWlzc2lvbkNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgIDwvY3FhLXBlcm1pc3Npb24tdG9nZ2xlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gVmFsdWUgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNCb29sZWFuOyBlbHNlIG5vbkJvb2xlYW5WYWx1ZVwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLW1iLTEuNSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDBcIj5WYWx1ZTwvbGFiZWw+XG4gICAgICA8Y3FhLWRyb3Bkb3duLWJ1dHRvblxuICAgICAgICBbb3B0aW9uc109XCJib29sZWFuRHJvcGRvd25PcHRpb25zXCJcbiAgICAgICAgW3NlbGVjdGVkVmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uQm9vbGVhblZhbHVlQ2hhbmdlKCRldmVudClcIj5cbiAgICAgIDwvY3FhLWRyb3Bkb3duLWJ1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI25vbkJvb2xlYW5WYWx1ZT5cbiAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgIGxhYmVsPVwiVmFsdWVcIlxuICAgICAgICBbdHlwZV09XCJpc1Bhc3N3b3JkID8gJ3Bhc3N3b3JkJyA6ICd0ZXh0J1wiXG4gICAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJ2YWx1ZVBsYWNlaG9sZGVyXCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgW2Vycm9yc109XCJ2YWx1ZUVycm9yc0FycmF5XCJcbiAgICAgICAgaW5wdXRJbmxpbmVTdHlsZT1cImZvbnQtZmFtaWx5OiB1aS1tb25vc3BhY2UsIFNGTW9uby1SZWd1bGFyLCBNZW5sbywgTW9uYWNvLCBDb25zb2xhcywgJ0xpYmVyYXRpb24gTW9ubycsIG1vbm9zcGFjZTtcIlxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25WYWx1ZUNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG5cbiAgPCEtLSBEZXNjcmlwdGlvbiAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgIDxjcWEtY3VzdG9tLXRleHRhcmVhXG4gICAgICBsYWJlbD1cIkRlc2NyaXB0aW9uXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiV2hhdCBpcyB0aGlzIHZhcmlhYmxlIHVzZWQgZm9yP1wiXG4gICAgICBbdmFsdWVdPVwiZGVzY3JpcHRpb25cIlxuICAgICAgW3Jvd3NdPVwiMlwiXG4gICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uRGVzY3JpcHRpb25DaGFuZ2UoJGV2ZW50KVwiPlxuICAgIDwvY3FhLWN1c3RvbS10ZXh0YXJlYT5cbiAgPC9kaXY+XG5cbjwvZGl2PlxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LWdsb2JhbC12YXJpYWJsZS1kaWFsb2cubW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9uZXctZ2xvYmFsLXZhcmlhYmxlLWRpYWxvZy9uZXctZ2xvYmFsLXZhcmlhYmxlLWRpYWxvZy5tb2RlbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIEdsb2JhbFZhcmlhYmxlVUlUeXBlID0gJ1N0cmluZycgfCAnTnVtYmVyJyB8ICdCb29sZWFuJyB8ICdQYXNzd29yZCc7XG5leHBvcnQgdHlwZSBHbG9iYWxWYXJpYWJsZVVJUGVybWlzc2lvbiA9ICdSTycgfCAnUlcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdsb2JhbFZhcmlhYmxlRGlhbG9nVmFsdWUge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IEdsb2JhbFZhcmlhYmxlVUlUeXBlO1xuICB2YWx1ZTogc3RyaW5nIHwgbnVsbDtcbiAgcmVhZFdyaXRlTW9kZTogR2xvYmFsVmFyaWFibGVVSVBlcm1pc3Npb247XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5ld0dsb2JhbFZhcmlhYmxlRGlhbG9nSW5wdXRzIHtcbiAgbW9kZT86ICdjcmVhdGUnIHwgJ2VkaXQnO1xuICBpbml0aWFsVmFsdWU/OiBQYXJ0aWFsPEdsb2JhbFZhcmlhYmxlRGlhbG9nVmFsdWU+O1xuICBleGlzdGluZ05hbWVzPzogc3RyaW5nW107XG59XG4iXX0=
@@ -0,0 +1,86 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/material/icon";
4
+ export class PermissionToggleComponent {
5
+ constructor() {
6
+ this.value = 'RW';
7
+ this.disabled = false;
8
+ this.roTooltip = 'Read only — click to allow writes';
9
+ this.rwTooltip = 'Read / write — click to lock';
10
+ this.valueChange = new EventEmitter();
11
+ }
12
+ onClick(next, event) {
13
+ event.stopPropagation();
14
+ if (this.disabled || next === this.value) {
15
+ return;
16
+ }
17
+ this.value = next;
18
+ this.valueChange.emit(next);
19
+ }
20
+ }
21
+ PermissionToggleComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: PermissionToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
22
+ PermissionToggleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: PermissionToggleComponent, selector: "cqa-permission-toggle", inputs: { value: "value", disabled: "disabled", roTooltip: "roTooltip", rwTooltip: "rwTooltip" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: `
23
+ <div class="cqa-ui-root" style="display:inline-flex;">
24
+ <div class="cqa-permission-toggle" [class.cqa-permission-toggle--disabled]="disabled">
25
+ <button
26
+ type="button"
27
+ class="cqa-perm-pill cqa-perm-pill--ro"
28
+ [class.active]="value === 'RO'"
29
+ [disabled]="disabled"
30
+ [title]="roTooltip"
31
+ (click)="onClick('RO', $event)">
32
+ <mat-icon class="cqa-perm-icon">lock</mat-icon>RO
33
+ </button>
34
+ <button
35
+ type="button"
36
+ class="cqa-perm-pill cqa-perm-pill--rw"
37
+ [class.active]="value === 'RW'"
38
+ [disabled]="disabled"
39
+ [title]="rwTooltip"
40
+ (click)="onClick('RW', $event)">
41
+ <mat-icon class="cqa-perm-icon">edit</mat-icon>RW
42
+ </button>
43
+ </div>
44
+ </div>
45
+ `, isInline: true, components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
46
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: PermissionToggleComponent, decorators: [{
47
+ type: Component,
48
+ args: [{
49
+ selector: 'cqa-permission-toggle',
50
+ template: `
51
+ <div class="cqa-ui-root" style="display:inline-flex;">
52
+ <div class="cqa-permission-toggle" [class.cqa-permission-toggle--disabled]="disabled">
53
+ <button
54
+ type="button"
55
+ class="cqa-perm-pill cqa-perm-pill--ro"
56
+ [class.active]="value === 'RO'"
57
+ [disabled]="disabled"
58
+ [title]="roTooltip"
59
+ (click)="onClick('RO', $event)">
60
+ <mat-icon class="cqa-perm-icon">lock</mat-icon>RO
61
+ </button>
62
+ <button
63
+ type="button"
64
+ class="cqa-perm-pill cqa-perm-pill--rw"
65
+ [class.active]="value === 'RW'"
66
+ [disabled]="disabled"
67
+ [title]="rwTooltip"
68
+ (click)="onClick('RW', $event)">
69
+ <mat-icon class="cqa-perm-icon">edit</mat-icon>RW
70
+ </button>
71
+ </div>
72
+ </div>
73
+ `,
74
+ }]
75
+ }], propDecorators: { value: [{
76
+ type: Input
77
+ }], disabled: [{
78
+ type: Input
79
+ }], roTooltip: [{
80
+ type: Input
81
+ }], rwTooltip: [{
82
+ type: Input
83
+ }], valueChange: [{
84
+ type: Output
85
+ }] } });
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi10b2dnbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9wZXJtaXNzaW9uLXRvZ2dsZS9wZXJtaXNzaW9uLXRvZ2dsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBK0J2RSxNQUFNLE9BQU8seUJBQXlCO0lBM0J0QztRQTRCVyxVQUFLLEdBQTBCLElBQUksQ0FBQztRQUNwQyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGNBQVMsR0FBRyxtQ0FBbUMsQ0FBQztRQUNoRCxjQUFTLEdBQUcsOEJBQThCLENBQUM7UUFFMUMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBeUIsQ0FBQztLQVFuRTtJQU5DLE9BQU8sQ0FBQyxJQUEyQixFQUFFLEtBQWlCO1FBQ3BELEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFDckQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsQ0FBQzs7c0hBYlUseUJBQXlCOzBHQUF6Qix5QkFBeUIsd01BekIxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1QlQ7MkZBRVUseUJBQXlCO2tCQTNCckMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsdUJBQXVCO29CQUNqQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJUO2lCQUNGOzhCQUVVLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IHR5cGUgUGVybWlzc2lvblRvZ2dsZVZhbHVlID0gJ1JPJyB8ICdSVyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1wZXJtaXNzaW9uLXRvZ2dsZScsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImNxYS11aS1yb290XCIgc3R5bGU9XCJkaXNwbGF5OmlubGluZS1mbGV4O1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1wZXJtaXNzaW9uLXRvZ2dsZVwiIFtjbGFzcy5jcWEtcGVybWlzc2lvbi10b2dnbGUtLWRpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1wZXJtLXBpbGwgY3FhLXBlcm0tcGlsbC0tcm9cIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwidmFsdWUgPT09ICdSTydcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgW3RpdGxlXT1cInJvVG9vbHRpcFwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2soJ1JPJywgJGV2ZW50KVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS1wZXJtLWljb25cIj5sb2NrPC9tYXQtaWNvbj5ST1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXBlcm0tcGlsbCBjcWEtcGVybS1waWxsLS1yd1wiXG4gICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJ2YWx1ZSA9PT0gJ1JXJ1wiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICBbdGl0bGVdPVwicndUb29sdGlwXCJcbiAgICAgICAgICAoY2xpY2spPVwib25DbGljaygnUlcnLCAkZXZlbnQpXCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXBlcm0taWNvblwiPmVkaXQ8L21hdC1pY29uPlJXXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb25Ub2dnbGVDb21wb25lbnQge1xuICBASW5wdXQoKSB2YWx1ZTogUGVybWlzc2lvblRvZ2dsZVZhbHVlID0gJ1JXJztcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgcm9Ub29sdGlwID0gJ1JlYWQgb25seSDigJQgY2xpY2sgdG8gYWxsb3cgd3JpdGVzJztcbiAgQElucHV0KCkgcndUb29sdGlwID0gJ1JlYWQgLyB3cml0ZSDigJQgY2xpY2sgdG8gbG9jayc7XG5cbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxQZXJtaXNzaW9uVG9nZ2xlVmFsdWU+KCk7XG5cbiAgb25DbGljayhuZXh0OiBQZXJtaXNzaW9uVG9nZ2xlVmFsdWUsIGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgbmV4dCA9PT0gdGhpcy52YWx1ZSkgeyByZXR1cm47IH1cbiAgICB0aGlzLnZhbHVlID0gbmV4dDtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQobmV4dCk7XG4gIH1cbn1cbiJdfQ==