cloud-ide-core 1.0.1 → 1.0.2
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.
- package/README.md +49 -10
- package/fesm2022/{cloud-ide-core-general-master-type.component-B26auJZw.mjs → cloud-ide-core-general-master-type.component-BNYoP_bS.mjs} +132 -134
- package/fesm2022/{cloud-ide-core-general-master-type.component-B26auJZw.mjs.map → cloud-ide-core-general-master-type.component-BNYoP_bS.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-core-general-master-type.service-Ab64Jjps.mjs → cloud-ide-core-general-master-type.service-8JWTVijZ.mjs} +7 -7
- package/fesm2022/{cloud-ide-core-general-master-type.service-Ab64Jjps.mjs.map → cloud-ide-core-general-master-type.service-8JWTVijZ.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-core-general-master.component-B6llTVoV.mjs → cloud-ide-core-general-master.component-CFGGHinl.mjs} +152 -154
- package/fesm2022/{cloud-ide-core-general-master.component-B6llTVoV.mjs.map → cloud-ide-core-general-master.component-CFGGHinl.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-core-page-form.component-CaEca3mB.mjs → cloud-ide-core-page-form.component-vfE-LkTS.mjs} +25 -25
- package/fesm2022/{cloud-ide-core-page-form.component-CaEca3mB.mjs.map → cloud-ide-core-page-form.component-vfE-LkTS.mjs.map} +1 -1
- package/fesm2022/cloud-ide-core.mjs +1113 -1110
- package/fesm2022/cloud-ide-core.mjs.map +1 -1
- package/index.d.ts +1736 -3
- package/package.json +3 -5
- package/esm2022/cloud-ide-core.mjs +0 -5
- package/esm2022/lib/cloud-ide-core.component.mjs +0 -19
- package/esm2022/lib/cloud-ide-core.routes.mjs +0 -137
- package/esm2022/lib/cloud-ide-core.service.mjs +0 -14
- package/esm2022/lib/core/department-management/components/department-list/department-list.component.mjs +0 -768
- package/esm2022/lib/core/department-management/index.mjs +0 -5
- package/esm2022/lib/core/department-management/services/department-management.service.mjs +0 -187
- package/esm2022/lib/core/designation-management/components/designation-list/designation-list.component.mjs +0 -1122
- package/esm2022/lib/core/designation-management/index.mjs +0 -5
- package/esm2022/lib/core/designation-management/services/designation-management.service.mjs +0 -194
- package/esm2022/lib/core/general-master-management/components/general-master/general-master.component.mjs +0 -738
- package/esm2022/lib/core/general-master-management/components/general-master-type/general-master-type.component.mjs +0 -608
- package/esm2022/lib/core/general-master-management/services/general-master-type.service.mjs +0 -203
- package/esm2022/lib/core/general-master-management/services/general-master.service.mjs +0 -166
- package/esm2022/lib/core/grade-level-management/components/grade-level-list/grade-level-list.component.mjs +0 -794
- package/esm2022/lib/core/grade-level-management/index.mjs +0 -5
- package/esm2022/lib/core/grade-level-management/services/grade-level-management.service.mjs +0 -172
- package/esm2022/lib/core/menu-management/components/menu-list/menu-list.component.mjs +0 -1135
- package/esm2022/lib/core/menu-management/index.mjs +0 -10
- package/esm2022/lib/core/menu-management/interfaces/menu-item.interface.mjs +0 -11
- package/esm2022/lib/core/menu-management/mock-data/menu-items.json +0 -311
- package/esm2022/lib/core/menu-management/services/menu-management.service.mjs +0 -230
- package/esm2022/lib/core/page-management/components/page-controls/page-controls.component.mjs +0 -483
- package/esm2022/lib/core/page-management/components/page-form/page-form.component.mjs +0 -212
- package/esm2022/lib/core/page-management/components/page-list/page-list.component.mjs +0 -393
- package/esm2022/lib/core/page-management/components/page-theme/page-theme.component.mjs +0 -767
- package/esm2022/lib/core/page-management/index.mjs +0 -10
- package/esm2022/lib/core/page-management/services/page-controls.service.mjs +0 -136
- package/esm2022/lib/core/page-management/services/page-management.service.mjs +0 -98
- package/esm2022/lib/core/page-management/services/page-theme.service.mjs +0 -107
- package/esm2022/public-api.mjs +0 -17
- package/lib/cloud-ide-core.component.d.ts +0 -5
- package/lib/cloud-ide-core.routes.d.ts +0 -2
- package/lib/cloud-ide-core.service.d.ts +0 -6
- package/lib/core/department-management/components/department-list/department-list.component.d.ts +0 -178
- package/lib/core/department-management/index.d.ts +0 -2
- package/lib/core/department-management/services/department-management.service.d.ts +0 -68
- package/lib/core/designation-management/components/designation-list/designation-list.component.d.ts +0 -242
- package/lib/core/designation-management/index.d.ts +0 -2
- package/lib/core/designation-management/services/designation-management.service.d.ts +0 -69
- package/lib/core/general-master-management/components/general-master/general-master.component.d.ts +0 -167
- package/lib/core/general-master-management/components/general-master-type/general-master-type.component.d.ts +0 -129
- package/lib/core/general-master-management/services/general-master-type.service.d.ts +0 -75
- package/lib/core/general-master-management/services/general-master.service.d.ts +0 -62
- package/lib/core/grade-level-management/components/grade-level-list/grade-level-list.component.d.ts +0 -199
- package/lib/core/grade-level-management/index.d.ts +0 -2
- package/lib/core/grade-level-management/services/grade-level-management.service.d.ts +0 -69
- package/lib/core/menu-management/components/menu-list/menu-list.component.d.ts +0 -278
- package/lib/core/menu-management/index.d.ts +0 -3
- package/lib/core/menu-management/interfaces/menu-item.interface.d.ts +0 -30
- package/lib/core/menu-management/services/menu-management.service.d.ts +0 -85
- package/lib/core/page-management/components/page-controls/page-controls.component.d.ts +0 -126
- package/lib/core/page-management/components/page-form/page-form.component.d.ts +0 -35
- package/lib/core/page-management/components/page-list/page-list.component.d.ts +0 -91
- package/lib/core/page-management/components/page-theme/page-theme.component.d.ts +0 -189
- package/lib/core/page-management/index.d.ts +0 -6
- package/lib/core/page-management/services/page-controls.service.d.ts +0 -54
- package/lib/core/page-management/services/page-management.service.d.ts +0 -42
- package/lib/core/page-management/services/page-theme.service.d.ts +0 -43
- package/public-api.d.ts +0 -8
package/esm2022/lib/core/page-management/components/page-controls/page-controls.component.mjs
DELETED
|
@@ -1,483 +0,0 @@
|
|
|
1
|
-
import { Component, signal, computed, DestroyRef, inject } from '@angular/core';
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { ReactiveFormsModule, NonNullableFormBuilder, FormsModule } from '@angular/forms';
|
|
4
|
-
import { ActivatedRoute, Router } from '@angular/router';
|
|
5
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
6
|
-
import { PageControlsService } from '../../services/page-controls.service';
|
|
7
|
-
import { AppStateHelperService } from 'cloud-ide-layout';
|
|
8
|
-
import { CideEleButtonComponent, CideIconComponent, CideInputComponent, CideSelectComponent, CideEleDropdownComponent } from 'cloud-ide-element';
|
|
9
|
-
import { generateObjectFromString } from 'cloud-ide-lms-model';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "@angular/common";
|
|
12
|
-
import * as i2 from "@angular/forms";
|
|
13
|
-
export class PageControlsComponent {
|
|
14
|
-
constructor() {
|
|
15
|
-
// Dependency injection
|
|
16
|
-
this.destroyRef = inject(DestroyRef);
|
|
17
|
-
this.controlsService = inject(PageControlsService);
|
|
18
|
-
this.appState = inject(AppStateHelperService);
|
|
19
|
-
this.fb = inject(NonNullableFormBuilder);
|
|
20
|
-
this.router = inject(Router);
|
|
21
|
-
this.route = inject(ActivatedRoute);
|
|
22
|
-
// Make Math available in template
|
|
23
|
-
this.Math = Math;
|
|
24
|
-
// Signals for reactive state management
|
|
25
|
-
this.controls = signal([]);
|
|
26
|
-
this.loading = signal(false);
|
|
27
|
-
this.error = signal(null);
|
|
28
|
-
this.selectedItems = signal([]);
|
|
29
|
-
this.searchTerm = signal('');
|
|
30
|
-
// Page information
|
|
31
|
-
this.pageId = signal('');
|
|
32
|
-
this.pageTitle = signal('');
|
|
33
|
-
// Form state
|
|
34
|
-
this.isEditMode = signal(false);
|
|
35
|
-
this.editingControlId = signal(null);
|
|
36
|
-
this.retrievedControl = signal(null);
|
|
37
|
-
// Control selection for new layout
|
|
38
|
-
this.selectedControlId = signal(null);
|
|
39
|
-
// Pagination signals
|
|
40
|
-
this.currentPage = signal(1);
|
|
41
|
-
this.pageSize = signal(10);
|
|
42
|
-
this.totalItems = signal(0);
|
|
43
|
-
// Modern reactive forms with signals - No validators for simplicity
|
|
44
|
-
this.controlForm = this.fb.group({
|
|
45
|
-
sype_key: [''],
|
|
46
|
-
sype_label: [''],
|
|
47
|
-
sype_label_hide: [false],
|
|
48
|
-
sype_auto_complete: [false], // Changed to boolean for checkbox
|
|
49
|
-
sype_hide_helper_and_error_text: [false],
|
|
50
|
-
sype_type: [''], // controlType
|
|
51
|
-
sype_option_key: [''],
|
|
52
|
-
sype_placeholder: [''],
|
|
53
|
-
sype_min_length: [0],
|
|
54
|
-
sype_max_length: [20],
|
|
55
|
-
sype_regex: [''],
|
|
56
|
-
sype_required: [false],
|
|
57
|
-
sype_disabled: [false],
|
|
58
|
-
sype_width: [''], // Changed to string for px values like "20px"
|
|
59
|
-
sype_height: [''], // Changed to string for px values like "20px"
|
|
60
|
-
sype_label_placement: ['left'],
|
|
61
|
-
sype_helper_text_collapse: [false],
|
|
62
|
-
sype_default: [''],
|
|
63
|
-
sype_tooltip: [''],
|
|
64
|
-
sype_size: ['sm'], // Changed default to small
|
|
65
|
-
sype_leading_icon: [''],
|
|
66
|
-
sype_isactive: [true],
|
|
67
|
-
sype_entity_id_syen: ['']
|
|
68
|
-
});
|
|
69
|
-
// Computed values
|
|
70
|
-
this.isFormDirty = computed(() => this.controlForm.dirty);
|
|
71
|
-
}
|
|
72
|
-
ngOnInit() {
|
|
73
|
-
this.initializeComponent();
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Initialize component
|
|
77
|
-
*/
|
|
78
|
-
initializeComponent() {
|
|
79
|
-
// Get page information from route
|
|
80
|
-
this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {
|
|
81
|
-
const queryParams = params['query'];
|
|
82
|
-
const queryData = generateObjectFromString(queryParams);
|
|
83
|
-
this.pageId.set(queryData?.sypg_id || '');
|
|
84
|
-
this.pageTitle.set(queryData?.sypg_title || '');
|
|
85
|
-
if (this.pageId()) {
|
|
86
|
-
this.loadControls();
|
|
87
|
-
this.setupFormSubscriptions();
|
|
88
|
-
this.setEntityIdFromAppState();
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
this.error.set('No page ID provided');
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Set entity ID from app state - auto-assigned internally
|
|
97
|
-
*/
|
|
98
|
-
setEntityIdFromAppState() {
|
|
99
|
-
const entityId = this.appState.getActiveEntityId();
|
|
100
|
-
if (entityId) {
|
|
101
|
-
this.controlForm.patchValue({
|
|
102
|
-
sype_entity_id_syen: entityId
|
|
103
|
-
});
|
|
104
|
-
// Disable the entity field since it's auto-assigned
|
|
105
|
-
this.controlForm.get('sype_entity_id_syen')?.disable();
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Load controls from API
|
|
110
|
-
*/
|
|
111
|
-
loadControls() {
|
|
112
|
-
this.loading.set(true);
|
|
113
|
-
this.error.set(null);
|
|
114
|
-
const request = {
|
|
115
|
-
sype_page_id_sypg: this.pageId()
|
|
116
|
-
};
|
|
117
|
-
this.controlsService.getControlList(request)
|
|
118
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
119
|
-
.subscribe({
|
|
120
|
-
next: (response) => {
|
|
121
|
-
if (response.success) {
|
|
122
|
-
this.controls.set(response.data || []);
|
|
123
|
-
this.totalItems.set(response.total || 0);
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
this.error.set(response.message || 'Failed to load controls');
|
|
127
|
-
}
|
|
128
|
-
this.loading.set(false);
|
|
129
|
-
},
|
|
130
|
-
error: (error) => {
|
|
131
|
-
console.error('Error loading controls:', error);
|
|
132
|
-
this.error.set('Failed to load controls. Please try again.');
|
|
133
|
-
this.loading.set(false);
|
|
134
|
-
}
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Setup form subscriptions
|
|
139
|
-
*/
|
|
140
|
-
setupFormSubscriptions() {
|
|
141
|
-
// Watch for form changes to enable/disable save button
|
|
142
|
-
this.controlForm.valueChanges
|
|
143
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
144
|
-
.subscribe(() => {
|
|
145
|
-
// Form validation is handled by computed signals
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Create new control
|
|
150
|
-
*/
|
|
151
|
-
createControl() {
|
|
152
|
-
const formValue = this.controlForm.getRawValue();
|
|
153
|
-
const entityId = this.appState.getActiveEntityId();
|
|
154
|
-
const newControl = {
|
|
155
|
-
_id: '',
|
|
156
|
-
sype_key: formValue.sype_key,
|
|
157
|
-
sype_page_id_sypg: this.pageId(),
|
|
158
|
-
sype_label: formValue.sype_label,
|
|
159
|
-
sype_label_hide: formValue.sype_label_hide,
|
|
160
|
-
sype_auto_complete: formValue.sype_auto_complete,
|
|
161
|
-
sype_hide_helper_and_error_text: formValue.sype_hide_helper_and_error_text,
|
|
162
|
-
sype_type: formValue.sype_type,
|
|
163
|
-
sype_option_key: formValue.sype_option_key,
|
|
164
|
-
sype_placeholder: formValue.sype_placeholder,
|
|
165
|
-
sype_min_length: formValue.sype_min_length,
|
|
166
|
-
sype_max_length: formValue.sype_max_length,
|
|
167
|
-
sype_regex: formValue.sype_regex,
|
|
168
|
-
sype_required: formValue.sype_required,
|
|
169
|
-
sype_disabled: formValue.sype_disabled,
|
|
170
|
-
sype_width: formValue.sype_width,
|
|
171
|
-
sype_height: formValue.sype_height,
|
|
172
|
-
sype_label_placement: formValue.sype_label_placement,
|
|
173
|
-
sype_helper_text_collapse: formValue.sype_helper_text_collapse,
|
|
174
|
-
sype_default: formValue.sype_default,
|
|
175
|
-
sype_tooltip: formValue.sype_tooltip,
|
|
176
|
-
sype_size: formValue.sype_size,
|
|
177
|
-
sype_leading_icon: formValue.sype_leading_icon,
|
|
178
|
-
sype_isactive: formValue.sype_isactive,
|
|
179
|
-
sype_entity_id_syen: entityId || formValue.sype_entity_id_syen
|
|
180
|
-
};
|
|
181
|
-
this.loading.set(true);
|
|
182
|
-
this.controlsService.createControl(newControl)
|
|
183
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
184
|
-
.subscribe({
|
|
185
|
-
next: (response) => {
|
|
186
|
-
if (response.success) {
|
|
187
|
-
this.resetForm();
|
|
188
|
-
this.loadControls();
|
|
189
|
-
console.log('Control created successfully');
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
console.error(response.message || 'Failed to create control');
|
|
193
|
-
}
|
|
194
|
-
this.loading.set(false);
|
|
195
|
-
},
|
|
196
|
-
error: (error) => {
|
|
197
|
-
console.error('Error creating control:', error);
|
|
198
|
-
console.error('Failed to create control. Please try again.');
|
|
199
|
-
this.loading.set(false);
|
|
200
|
-
}
|
|
201
|
-
});
|
|
202
|
-
}
|
|
203
|
-
/**
|
|
204
|
-
* Update existing control
|
|
205
|
-
*/
|
|
206
|
-
updateControl() {
|
|
207
|
-
if (!this.editingControlId()) {
|
|
208
|
-
return;
|
|
209
|
-
}
|
|
210
|
-
const formValue = this.controlForm.getRawValue();
|
|
211
|
-
const entityId = this.appState.getActiveEntityId();
|
|
212
|
-
const updatedControl = {
|
|
213
|
-
_id: this.editingControlId(),
|
|
214
|
-
sype_key: formValue.sype_key,
|
|
215
|
-
sype_page_id_sypg: this.pageId(),
|
|
216
|
-
sype_label: formValue.sype_label,
|
|
217
|
-
sype_label_hide: formValue.sype_label_hide,
|
|
218
|
-
sype_auto_complete: Boolean(formValue.sype_auto_complete),
|
|
219
|
-
sype_hide_helper_and_error_text: formValue.sype_hide_helper_and_error_text,
|
|
220
|
-
sype_type: formValue.sype_type,
|
|
221
|
-
sype_option_key: formValue.sype_option_key,
|
|
222
|
-
sype_placeholder: formValue.sype_placeholder,
|
|
223
|
-
sype_min_length: formValue.sype_min_length,
|
|
224
|
-
sype_max_length: formValue.sype_max_length,
|
|
225
|
-
sype_regex: formValue.sype_regex,
|
|
226
|
-
sype_required: formValue.sype_required,
|
|
227
|
-
sype_disabled: formValue.sype_disabled,
|
|
228
|
-
sype_width: formValue.sype_width,
|
|
229
|
-
sype_height: formValue.sype_height,
|
|
230
|
-
sype_label_placement: formValue.sype_label_placement,
|
|
231
|
-
sype_helper_text_collapse: formValue.sype_helper_text_collapse,
|
|
232
|
-
sype_default: formValue.sype_default,
|
|
233
|
-
sype_tooltip: formValue.sype_tooltip,
|
|
234
|
-
sype_size: formValue.sype_size,
|
|
235
|
-
sype_leading_icon: formValue.sype_leading_icon,
|
|
236
|
-
sype_isactive: formValue.sype_isactive,
|
|
237
|
-
sype_entity_id_syen: entityId || formValue.sype_entity_id_syen
|
|
238
|
-
};
|
|
239
|
-
this.loading.set(true);
|
|
240
|
-
this.controlsService.updateControl(updatedControl)
|
|
241
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
242
|
-
.subscribe({
|
|
243
|
-
next: (response) => {
|
|
244
|
-
if (response.success) {
|
|
245
|
-
this.resetForm();
|
|
246
|
-
this.loadControls();
|
|
247
|
-
console.log('Control updated successfully');
|
|
248
|
-
}
|
|
249
|
-
else {
|
|
250
|
-
console.error(response.message || 'Failed to update control');
|
|
251
|
-
}
|
|
252
|
-
this.loading.set(false);
|
|
253
|
-
},
|
|
254
|
-
error: (error) => {
|
|
255
|
-
console.error('Error updating control:', error);
|
|
256
|
-
console.error('Failed to update control. Please try again.');
|
|
257
|
-
this.loading.set(false);
|
|
258
|
-
}
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
/**
|
|
262
|
-
* Edit control
|
|
263
|
-
*/
|
|
264
|
-
editControl(control) {
|
|
265
|
-
this.isEditMode.set(true);
|
|
266
|
-
this.editingControlId.set(control._id || null);
|
|
267
|
-
this.retrievedControl.set(control);
|
|
268
|
-
this.controlForm.patchValue({
|
|
269
|
-
sype_key: control.sype_key,
|
|
270
|
-
sype_label: control.sype_label,
|
|
271
|
-
sype_label_hide: control.sype_label_hide,
|
|
272
|
-
sype_auto_complete: control.sype_auto_complete ? true : false,
|
|
273
|
-
sype_hide_helper_and_error_text: control.sype_hide_helper_and_error_text,
|
|
274
|
-
sype_type: control.sype_type,
|
|
275
|
-
sype_option_key: control.sype_option_key,
|
|
276
|
-
sype_placeholder: control.sype_placeholder,
|
|
277
|
-
sype_min_length: control.sype_min_length,
|
|
278
|
-
sype_max_length: control.sype_max_length,
|
|
279
|
-
sype_regex: control.sype_regex,
|
|
280
|
-
sype_required: control.sype_required,
|
|
281
|
-
sype_disabled: control.sype_disabled,
|
|
282
|
-
sype_width: control.sype_width?.toString() || '',
|
|
283
|
-
sype_height: control.sype_height?.toString() || '',
|
|
284
|
-
sype_label_placement: control.sype_label_placement,
|
|
285
|
-
sype_helper_text_collapse: control.sype_helper_text_collapse,
|
|
286
|
-
sype_default: control.sype_default,
|
|
287
|
-
sype_tooltip: control.sype_tooltip,
|
|
288
|
-
sype_size: control.sype_size,
|
|
289
|
-
sype_leading_icon: control.sype_leading_icon,
|
|
290
|
-
sype_isactive: control.sype_isactive,
|
|
291
|
-
sype_entity_id_syen: String(control.sype_entity_id_syen || '')
|
|
292
|
-
});
|
|
293
|
-
this.controlForm.markAsPristine();
|
|
294
|
-
}
|
|
295
|
-
/**
|
|
296
|
-
* Delete control
|
|
297
|
-
*/
|
|
298
|
-
deleteControl(control) {
|
|
299
|
-
if (confirm(`Are you sure you want to delete the control "${control.sype_label}"?`)) {
|
|
300
|
-
this.loading.set(true);
|
|
301
|
-
this.controlsService.deleteControl(control._id || '')
|
|
302
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
303
|
-
.subscribe({
|
|
304
|
-
next: (response) => {
|
|
305
|
-
if (response.success) {
|
|
306
|
-
this.loadControls();
|
|
307
|
-
console.log('Control deleted successfully');
|
|
308
|
-
}
|
|
309
|
-
else {
|
|
310
|
-
console.error(response.message || 'Failed to delete control');
|
|
311
|
-
}
|
|
312
|
-
this.loading.set(false);
|
|
313
|
-
},
|
|
314
|
-
error: (error) => {
|
|
315
|
-
console.error('Error deleting control:', error);
|
|
316
|
-
console.error('Failed to delete control. Please try again.');
|
|
317
|
-
this.loading.set(false);
|
|
318
|
-
}
|
|
319
|
-
});
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
/**
|
|
323
|
-
* Toggle control status
|
|
324
|
-
*/
|
|
325
|
-
toggleControlStatus(control) {
|
|
326
|
-
this.loading.set(true);
|
|
327
|
-
this.controlsService.toggleControlStatus({ sype_id: control._id || '', sype_isactive: !control.sype_isactive })
|
|
328
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
329
|
-
.subscribe({
|
|
330
|
-
next: (response) => {
|
|
331
|
-
if (response.success) {
|
|
332
|
-
this.loadControls();
|
|
333
|
-
console.log(`Control ${control.sype_isactive ? 'deactivated' : 'activated'} successfully`);
|
|
334
|
-
}
|
|
335
|
-
else {
|
|
336
|
-
console.error(response.message || 'Failed to toggle control status');
|
|
337
|
-
}
|
|
338
|
-
this.loading.set(false);
|
|
339
|
-
},
|
|
340
|
-
error: (error) => {
|
|
341
|
-
console.error('Error toggling control status:', error);
|
|
342
|
-
console.error('Failed to toggle control status. Please try again.');
|
|
343
|
-
this.loading.set(false);
|
|
344
|
-
}
|
|
345
|
-
});
|
|
346
|
-
}
|
|
347
|
-
/**
|
|
348
|
-
* Save control (create or update)
|
|
349
|
-
*/
|
|
350
|
-
saveControl() {
|
|
351
|
-
if (this.isEditMode()) {
|
|
352
|
-
this.updateControl();
|
|
353
|
-
}
|
|
354
|
-
else {
|
|
355
|
-
this.createControl();
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
/**
|
|
359
|
-
* Cancel form
|
|
360
|
-
*/
|
|
361
|
-
cancelForm() {
|
|
362
|
-
this.resetForm();
|
|
363
|
-
}
|
|
364
|
-
/**
|
|
365
|
-
* Go back to page list
|
|
366
|
-
*/
|
|
367
|
-
goBack() {
|
|
368
|
-
this.router.navigate(['/core/page']);
|
|
369
|
-
}
|
|
370
|
-
/**
|
|
371
|
-
* Reset form
|
|
372
|
-
*/
|
|
373
|
-
resetForm() {
|
|
374
|
-
const entityId = this.appState.getActiveEntityId();
|
|
375
|
-
this.controlForm.reset({
|
|
376
|
-
sype_key: '',
|
|
377
|
-
sype_label: '',
|
|
378
|
-
sype_label_hide: false,
|
|
379
|
-
sype_auto_complete: false,
|
|
380
|
-
sype_hide_helper_and_error_text: false,
|
|
381
|
-
sype_type: '',
|
|
382
|
-
sype_option_key: '',
|
|
383
|
-
sype_placeholder: '',
|
|
384
|
-
sype_min_length: 0,
|
|
385
|
-
sype_max_length: 20,
|
|
386
|
-
sype_regex: '',
|
|
387
|
-
sype_required: false,
|
|
388
|
-
sype_disabled: false,
|
|
389
|
-
sype_width: '',
|
|
390
|
-
sype_height: '',
|
|
391
|
-
sype_label_placement: 'floating',
|
|
392
|
-
sype_helper_text_collapse: false,
|
|
393
|
-
sype_default: '',
|
|
394
|
-
sype_tooltip: '',
|
|
395
|
-
sype_size: 'md',
|
|
396
|
-
sype_leading_icon: '',
|
|
397
|
-
sype_isactive: true,
|
|
398
|
-
sype_entity_id_syen: entityId || ''
|
|
399
|
-
});
|
|
400
|
-
this.isEditMode.set(false);
|
|
401
|
-
this.editingControlId.set(null);
|
|
402
|
-
this.retrievedControl.set(null);
|
|
403
|
-
this.controlForm.markAsPristine();
|
|
404
|
-
this.controlForm.markAsUntouched();
|
|
405
|
-
}
|
|
406
|
-
/**
|
|
407
|
-
* Mark form as touched to trigger validation display
|
|
408
|
-
*/
|
|
409
|
-
markFormAsTouched() {
|
|
410
|
-
Object.keys(this.controlForm.controls).forEach(key => {
|
|
411
|
-
const control = this.controlForm.get(key);
|
|
412
|
-
control?.markAsTouched();
|
|
413
|
-
});
|
|
414
|
-
}
|
|
415
|
-
/**
|
|
416
|
-
* Get dropdown items for actions
|
|
417
|
-
*/
|
|
418
|
-
getActionDropdownItems(control) {
|
|
419
|
-
return [
|
|
420
|
-
{
|
|
421
|
-
id: 'edit',
|
|
422
|
-
label: 'Edit',
|
|
423
|
-
icon: 'edit'
|
|
424
|
-
},
|
|
425
|
-
{
|
|
426
|
-
id: 'toggle',
|
|
427
|
-
label: control.sype_isactive ? 'Deactivate' : 'Activate',
|
|
428
|
-
icon: control.sype_isactive ? 'block' : 'check_circle'
|
|
429
|
-
},
|
|
430
|
-
{
|
|
431
|
-
id: 'delete',
|
|
432
|
-
label: 'Delete',
|
|
433
|
-
icon: 'delete'
|
|
434
|
-
}
|
|
435
|
-
];
|
|
436
|
-
}
|
|
437
|
-
/**
|
|
438
|
-
* Handle dropdown item click
|
|
439
|
-
*/
|
|
440
|
-
onDropdownItemClick(item, control) {
|
|
441
|
-
switch (item.id) {
|
|
442
|
-
case 'edit':
|
|
443
|
-
this.editControl(control);
|
|
444
|
-
break;
|
|
445
|
-
case 'toggle':
|
|
446
|
-
this.toggleControlStatus(control);
|
|
447
|
-
break;
|
|
448
|
-
case 'delete':
|
|
449
|
-
this.deleteControl(control);
|
|
450
|
-
break;
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
/**
|
|
454
|
-
* Close all dropdowns
|
|
455
|
-
*/
|
|
456
|
-
closeAllDropdowns() {
|
|
457
|
-
// This method can be used to close dropdowns if needed
|
|
458
|
-
}
|
|
459
|
-
// New methods for the vertical layout
|
|
460
|
-
selectControl(control) {
|
|
461
|
-
this.selectedControlId.set(control._id || null);
|
|
462
|
-
console.log('Selected control:', control);
|
|
463
|
-
}
|
|
464
|
-
trackByControlId(index, control) {
|
|
465
|
-
return control._id || '';
|
|
466
|
-
}
|
|
467
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: PageControlsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
468
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: PageControlsComponent, isStandalone: true, selector: "cide-core-app-page-controls", ngImport: i0, template: "<!-- Page Controls Container -->\n<div class=\"page-controls-container\">\n <!-- Header Section -->\n <div class=\"header\">\n <div class=\"header-content\">\n <div class=\"header-left\">\n <button \n cideEleButton\n variant=\"ghost\"\n size=\"sm\"\n (click)=\"goBack()\"\n class=\"back-button\">\n <cide-ele-icon>arrow_back</cide-ele-icon>\n </button>\n <div class=\"title-section\">\n <cide-ele-icon class=\"title-icon\">settings</cide-ele-icon>\n <div>\n <h1 class=\"title\">Control Management</h1>\n <p class=\"subtitle\">Page: {{ pageTitle() }}</p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Error Message -->\n <div class=\"error-message\" *ngIf=\"error()\">\n <cide-ele-icon>error</cide-ele-icon>\n <div>\n <h3>Error</h3>\n <p>{{ error() }}</p>\n </div>\n </div>\n\n <!-- Main Content Area -->\n <div class=\"main-content\">\n <!-- Form Section -->\n <div class=\"form-section\">\n <div class=\"form-header\">\n <cide-ele-icon>{{ isEditMode() ? 'edit' : 'add' }}</cide-ele-icon>\n <h3>{{ isEditMode() ? 'Edit Control' : 'Quick Add Control' }}</h3>\n </div>\n\n <!-- Form -->\n <form [formGroup]=\"controlForm\" (ngSubmit)=\"saveControl()\" class=\"control-form tw-overflow-y-auto\">\n <div class=\"form-grid\">\n \n <!-- Basic Information Section -->\n <!-- Control Key -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_key\"\n formControlName=\"sype_key\"\n placeholder=\"Enter control key\"\n label=\"Control Key\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Control Label -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_label\"\n formControlName=\"sype_label\"\n placeholder=\"Enter control label\"\n label=\"Control Label\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Control Type -->\n <div class=\"form-group\">\n <cide-ele-select\n id=\"sype_type\"\n formControlName=\"sype_type\"\n [options]=\"[\n { value: 'text', label: 'Text Input' },\n { value: 'textarea', label: 'Text Area' },\n { value: 'select', label: 'Select' },\n { value: 'checkbox', label: 'Checkbox' },\n { value: 'radio', label: 'Radio' },\n { value: 'date', label: 'Date' },\n { value: 'number', label: 'Number' },\n { value: 'email', label: 'Email' },\n { value: 'password', label: 'Password' },\n { value: 'file', label: 'File Upload' }\n ]\"\n label=\"Control Type\"\n size=\"sm\">\n </cide-ele-select>\n </div>\n\n <!-- Status - Checkbox aligned properly -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_isactive\"\n type=\"checkbox\"\n formControlName=\"sype_isactive\"\n label=\"Active Status\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Placeholder -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_placeholder\"\n formControlName=\"sype_placeholder\"\n placeholder=\"Enter placeholder text\"\n label=\"Placeholder\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Auto Complete - Checkbox aligned properly -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_auto_complete\"\n type=\"checkbox\"\n formControlName=\"sype_auto_complete\"\n label=\"Auto Complete\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Tooltip -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_tooltip\"\n formControlName=\"sype_tooltip\"\n placeholder=\"Enter tooltip text\"\n label=\"Tooltip\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Validation & Sizing Section -->\n <!-- Min/Max Length - Side by side -->\n <div class=\"form-group form-group-row\">\n <div class=\"form-group-half\">\n <cide-ele-input\n id=\"sype_min_length\"\n type=\"number\"\n formControlName=\"sype_min_length\"\n placeholder=\"0\"\n label=\"Min Length\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n <div class=\"form-group-half\">\n <cide-ele-input\n id=\"sype_max_length\"\n type=\"number\"\n formControlName=\"sype_max_length\"\n placeholder=\"20\"\n label=\"Max Length\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n </div>\n\n <!-- Size & Label Placement - Side by side -->\n <div class=\"form-group form-group-row\">\n <div class=\"form-group-half\">\n <cide-ele-select\n id=\"sype_size\"\n formControlName=\"sype_size\"\n label=\"Size\"\n size=\"xs\"\n [options]=\"[\n { value: 'xs', label: 'XS' },\n { value: 'sm', label: 'SM' },\n { value: 'md', label: 'MD' },\n { value: 'lg', label: 'LG' },\n { value: 'xl', label: 'XL' },\n { value: 'xxl', label: 'XXL' }\n ]\">\n </cide-ele-select>\n </div>\n <div class=\"form-group-half\">\n <cide-ele-select\n id=\"sype_label_placement\"\n formControlName=\"sype_label_placement\"\n label=\"Label Placement\"\n size=\"xs\"\n [options]=\"[\n { value: 'left', label: 'Left' },\n { value: 'floating', label: 'Floating' },\n { value: 'fixed', label: 'Fixed' }\n ]\">\n </cide-ele-select>\n </div>\n </div>\n\n <!-- Width & Height - Side by side -->\n <div class=\"form-group form-group-row\">\n <div class=\"form-group-half\">\n <cide-ele-input\n id=\"sype_width\"\n type=\"text\"\n formControlName=\"sype_width\"\n placeholder=\"20px\"\n label=\"Width\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n <div class=\"form-group-half\">\n <cide-ele-input\n id=\"sype_height\"\n type=\"text\"\n formControlName=\"sype_height\"\n placeholder=\"20px\"\n label=\"Height\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n </div>\n\n <!-- Leading Icon -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_leading_icon\"\n formControlName=\"sype_leading_icon\"\n placeholder=\"Enter icon name\"\n label=\"Leading Icon\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Default Value -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_default\"\n formControlName=\"sype_default\"\n placeholder=\"Enter default value\"\n label=\"Default Value\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Regex Pattern -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_regex\"\n formControlName=\"sype_regex\"\n placeholder=\"Enter regex pattern\"\n label=\"Regex Pattern\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Option Key -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_option_key\"\n formControlName=\"sype_option_key\"\n placeholder=\"Enter option key\"\n label=\"Option Key\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Entity ID (Auto-assigned from AppState) - Hidden -->\n <div class=\"form-group\" style=\"display: none;\">\n <cide-ele-input\n id=\"sype_entity_id_syen\"\n formControlName=\"sype_entity_id_syen\"\n placeholder=\"Auto-assigned from system\"\n label=\"Entity ID (Auto-assigned)\"\n size=\"sm\"\n readonly>\n </cide-ele-input>\n </div>\n\n <!-- Control Options -->\n <div class=\"form-group full-width\">\n <h6 class=\"options-title\">Control Options</h6>\n <div class=\"options-grid\">\n \n <!-- Required -->\n <div class=\"option-item\">\n <cide-ele-input\n id=\"sype_required\"\n type=\"checkbox\"\n formControlName=\"sype_required\"\n label=\"Required\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n\n <!-- Disabled -->\n <div class=\"option-item\">\n <cide-ele-input\n id=\"sype_disabled\"\n type=\"checkbox\"\n formControlName=\"sype_disabled\"\n label=\"Disabled\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n\n <!-- Hide Label -->\n <div class=\"option-item\">\n <cide-ele-input\n id=\"sype_label_hide\"\n type=\"checkbox\"\n formControlName=\"sype_label_hide\"\n label=\"Hide Label\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n\n <!-- Hide Helper Text -->\n <div class=\"option-item\">\n <cide-ele-input\n id=\"sype_hide_helper_and_error_text\"\n type=\"checkbox\"\n formControlName=\"sype_hide_helper_and_error_text\"\n label=\"Hide Helper Text\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n\n <!-- Helper Text Collapse -->\n <div class=\"option-item\">\n <cide-ele-input\n id=\"sype_helper_text_collapse\"\n type=\"checkbox\"\n formControlName=\"sype_helper_text_collapse\"\n label=\"Collapse Helper\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n\n </div>\n </div>\n\n </div>\n\n <!-- Form Actions -->\n <div class=\"form-actions\">\n <button \n cideEleButton\n type=\"button\"\n variant=\"outline\"\n (click)=\"cancelForm()\"\n [disabled]=\"loading()\">\n Cancel\n </button>\n <button \n cideEleButton\n type=\"submit\"\n variant=\"primary\"\n [disabled]=\"loading()\">\n {{ isEditMode() ? 'Update Control' : 'Create Control' }}\n </button>\n </div>\n </form>\n </div>\n\n <!-- Controls List Section -->\n <div class=\"controls-list-section\">\n <div class=\"controls-header\">\n <h3>Page Controls</h3>\n <p>Controls connected to this page</p>\n </div>\n \n <div class=\"controls-list\" *ngIf=\"!loading() && controls().length > 0\">\n <div \n class=\"control-item\" \n *ngFor=\"let control of controls(); trackBy: trackByControlId\"\n [class.selected]=\"selectedControlId() === control._id\"\n (click)=\"selectControl(control)\"\n (keyup.enter)=\"selectControl(control)\"\n (keyup.space)=\"selectControl(control)\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-label]=\"'Select control ' + (control.sype_label || control.sype_key)\">\n <div class=\"control-header\">\n <div class=\"control-icon\">\n <cide-ele-icon>settings_input_component</cide-ele-icon>\n </div>\n <div class=\"control-info\">\n <h4>{{ control.sype_label || control.sype_key }}</h4>\n <p>{{ control.sype_tooltip || 'No tooltip' }}</p>\n <div class=\"control-meta\">\n <span class=\"control-type\">{{ control.sype_type }}</span>\n <span class=\"control-status\" [class.active]=\"control.sype_isactive\">\n {{ control.sype_isactive ? 'Active' : 'Inactive' }}\n </span>\n </div>\n </div>\n <div class=\"control-actions\">\n <button \n cideEleButton\n variant=\"ghost\"\n size=\"sm\"\n (click)=\"editControl(control); $event.stopPropagation()\">\n <cide-ele-icon>edit</cide-ele-icon>\n </button>\n <button \n cideEleButton\n variant=\"ghost\"\n size=\"sm\"\n (click)=\"deleteControl(control); $event.stopPropagation()\">\n <cide-ele-icon>delete</cide-ele-icon>\n </button>\n </div>\n </div>\n \n \n </div>\n </div>\n\n <div class=\"controls-list-empty\" *ngIf=\"!loading() && controls().length === 0\">\n <cide-ele-icon>settings_input_component</cide-ele-icon>\n <p>No controls available</p>\n <small>Create controls using the form on the left</small>\n </div>\n\n <div class=\"controls-list-loading\" *ngIf=\"loading()\">\n <cide-ele-icon class=\"spinning\">refresh</cide-ele-icon>\n <p>Loading controls...</p>\n </div>\n </div>\n </div>\n</div>\n\n ", styles: [".page-controls-container{@apply tw-flex tw-flex-col tw-h-full tw-bg-gray-50;}.header{@apply tw-bg-white tw-border-b tw-border-gray-200 tw-px-6 tw-py-4;}.header-content{@apply tw-flex tw-items-center tw-justify-between;}.header-left{@apply tw-flex tw-items-center tw-space-x-4;}.back-button{@apply tw-flex tw-items-center tw-justify-center tw-w-8 tw-h-8 tw-text-gray-600 hover:tw-text-gray-900 hover:tw-bg-gray-100 tw-rounded-md tw-transition-colors;}.title-section{@apply tw-flex tw-items-center tw-space-x-3;}.title-icon{@apply tw-text-blue-600 tw-text-xl;}.title{@apply tw-text-xl tw-font-semibold tw-text-gray-900 tw-mb-0;}.subtitle{@apply tw-text-sm tw-text-gray-500 tw-mb-0;}.error-message{@apply tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-md tw-p-4 tw-mx-6 tw-mt-4 tw-flex tw-items-start tw-space-x-3;}.error-message cide-ele-icon{@apply tw-text-red-500 tw-flex-shrink-0 tw-mt-0.5;}.error-message h3{@apply tw-text-red-800 tw-font-medium tw-mb-1;}.error-message p{@apply tw-text-red-700 tw-text-sm tw-mb-0;}.main-content{@apply tw-flex tw-flex-1 tw-gap-6 tw-p-6 tw-overflow-hidden;}.form-section{@apply tw-w-3/5 tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-flex tw-flex-col;}.form-header{@apply tw-flex tw-items-center tw-space-x-3 tw-p-6 tw-border-b tw-border-gray-200;}.form-header cide-ele-icon{@apply tw-text-blue-600;}.form-header h3{@apply tw-text-lg tw-font-medium tw-text-gray-900 tw-mb-0;}.control-form{@apply tw-flex tw-flex-col tw-flex-1 tw-p-6;}.form-grid{@apply tw-grid tw-grid-cols-2 tw-gap-4 tw-mb-6;}.form-group{@apply tw-space-y-1;}.form-group.full-width{@apply tw-col-span-2;}.form-group.compact-number,.form-group.compact-select,.form-group.compact-dimension{@apply tw-max-w-32;}.form-group.compact-number{@apply tw-min-w-20;}.form-group.compact-dimension{@apply tw-min-w-24;}.form-group.compact-select{@apply tw-min-w-28;}.form-group.form-group-row{@apply tw-col-span-2 tw-flex tw-gap-4;}.form-group-half{@apply tw-flex-1 tw-space-y-1;}.checkbox-field{margin:.25rem 0}.checkbox-label{display:flex;flex-direction:column;gap:.25rem;cursor:pointer;padding:.75rem 0;background:transparent;border:none;border-radius:0;transition:all .2s ease}.checkbox-label:hover{background:#667eea05}.checkbox-label .checkbox-input{width:1rem;height:1rem;accent-color:#667eea;border-radius:3px;margin-bottom:.125rem}.checkbox-label .checkbox-text{font-weight:600;color:#374151;font-size:.875rem}.checkbox-label .checkbox-description{font-size:.75rem;color:#6b7280;margin-top:.125rem}.options-title{@apply tw-text-sm tw-font-medium tw-text-gray-900 tw-mb-3;}.options-grid{@apply tw-grid tw-grid-cols-3 tw-gap-3;}.option-item{@apply tw-flex tw-items-center tw-space-x-2;}.option-checkbox{@apply tw-rounded tw-border-gray-300 tw-text-blue-600 focus:tw-ring-blue-500 focus:tw-border-blue-500;}.option-item label{@apply tw-text-sm tw-text-gray-700 tw-cursor-pointer;}.form-actions{@apply tw-flex tw-justify-end tw-space-x-3 tw-pt-4 tw-border-t tw-border-gray-200 tw-mt-auto;}.controls-list-section{@apply tw-w-2/5 tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-flex tw-flex-col;}.controls-header{@apply tw-p-6 tw-border-b tw-border-gray-200;}.controls-header h3{@apply tw-text-lg tw-font-medium tw-text-gray-900 tw-mb-1;}.controls-header p{@apply tw-text-sm tw-text-gray-500 tw-mb-0;}.controls-list{@apply tw-flex-1 tw-overflow-y-auto tw-p-4;}.control-item{@apply tw-bg-gray-50 tw-border tw-border-gray-200 tw-rounded-lg tw-p-4 tw-mb-3 tw-cursor-pointer tw-transition-all tw-duration-200;}.control-item:hover{@apply tw-shadow-md tw-border-gray-300;}.control-item.selected{@apply tw-bg-blue-50 tw-border-blue-300 tw-shadow-md;}.control-item:focus{@apply tw-outline-none tw-ring-2 tw-ring-blue-500 tw-ring-offset-2;}.control-item:last-child{@apply tw-mb-0;}.control-header{@apply tw-flex tw-items-start tw-space-x-3;}.control-icon{@apply tw-flex-shrink-0 tw-w-10 tw-h-10 tw-bg-blue-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center;}.control-icon cide-ele-icon{@apply tw-text-blue-600;}.control-info{@apply tw-flex-1 tw-min-w-0;}.control-info h4{@apply tw-text-sm tw-font-medium tw-text-gray-900 tw-mb-1 tw-truncate;}.control-info p{@apply tw-text-xs tw-text-gray-500 tw-mb-2 tw-truncate;}.control-meta{@apply tw-flex tw-items-center tw-space-x-2;}.control-type{@apply tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-gray-100 tw-text-gray-800;}.control-status{@apply tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-red-100 tw-text-red-800;}.control-status.active{@apply tw-bg-green-100 tw-text-green-800;}.control-actions{@apply tw-flex tw-items-center tw-space-x-1 tw-opacity-0 tw-transition-opacity tw-duration-200;}.control-item:hover .control-actions,.control-item.selected .control-actions{@apply tw-opacity-100;}.controls-list-empty{@apply tw-flex tw-flex-col tw-items-center tw-justify-center tw-py-12 tw-text-center;}.controls-list-empty cide-ele-icon{@apply tw-text-4xl tw-text-gray-300 tw-mb-4;}.controls-list-empty p{@apply tw-text-gray-500 tw-font-medium tw-mb-1;}.controls-list-empty small{@apply tw-text-gray-400;}.controls-list-loading{@apply tw-flex tw-flex-col tw-items-center tw-justify-center tw-py-12 tw-text-center;}.controls-list-loading cide-ele-icon{@apply tw-text-2xl tw-text-blue-500 tw-mb-4;}.controls-list-loading p{@apply tw-text-gray-500;}.spinning{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@media (max-width: 1024px){.main-content{@apply tw-flex-col;}.form-section{@apply tw-w-full;}.controls-list-section{@apply tw-w-full tw-max-h-96;}.form-grid{@apply tw-grid-cols-1;}.options-grid{@apply tw-grid-cols-2;}}@media (max-width: 640px){.main-content{@apply tw-p-4 tw-gap-4;}.form-grid{@apply tw-gap-3;}.form-actions{@apply tw-flex-col tw-space-x-0 tw-space-y-2;}.options-grid{@apply tw-grid-cols-1;}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton]", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated"], outputs: ["btnClick", "doubleClick"] }, { kind: "component", type: CideInputComponent, selector: "cide-ele-input", inputs: ["fill", "label", "labelHide", "disabled", "clearInput", "labelPlacement", "labelDir", "placeholder", "leadingIcon", "trailingIcon", "helperText", "helperTextCollapse", "hideHelperAndErrorText", "errorText", "maxlength", "minlength", "required", "autocapitalize", "autocomplete", "type", "width", "id", "ngModel", "option", "min", "max", "size"], outputs: ["ngModelChange"] }, { kind: "component", type: CideSelectComponent, selector: "cide-ele-select", inputs: ["label", "labelHide", "placeholder", "helperText", "errorText", "required", "disabled", "id", "ngModel", "size", "fill", "labelPlacement", "labelDir", "leadingIcon", "trailingIcon", "clearInput", "options", "multiple", "searchable", "showSearchInput", "loading"], outputs: ["ngModelChange", "change", "searchChange"] }, { kind: "component", type: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }] }); }
|
|
469
|
-
}
|
|
470
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: PageControlsComponent, decorators: [{
|
|
471
|
-
type: Component,
|
|
472
|
-
args: [{ selector: 'cide-core-app-page-controls', standalone: true, imports: [
|
|
473
|
-
CommonModule,
|
|
474
|
-
ReactiveFormsModule,
|
|
475
|
-
FormsModule,
|
|
476
|
-
CideEleButtonComponent,
|
|
477
|
-
CideInputComponent,
|
|
478
|
-
CideSelectComponent,
|
|
479
|
-
CideIconComponent,
|
|
480
|
-
CideEleDropdownComponent
|
|
481
|
-
], template: "<!-- Page Controls Container -->\n<div class=\"page-controls-container\">\n <!-- Header Section -->\n <div class=\"header\">\n <div class=\"header-content\">\n <div class=\"header-left\">\n <button \n cideEleButton\n variant=\"ghost\"\n size=\"sm\"\n (click)=\"goBack()\"\n class=\"back-button\">\n <cide-ele-icon>arrow_back</cide-ele-icon>\n </button>\n <div class=\"title-section\">\n <cide-ele-icon class=\"title-icon\">settings</cide-ele-icon>\n <div>\n <h1 class=\"title\">Control Management</h1>\n <p class=\"subtitle\">Page: {{ pageTitle() }}</p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Error Message -->\n <div class=\"error-message\" *ngIf=\"error()\">\n <cide-ele-icon>error</cide-ele-icon>\n <div>\n <h3>Error</h3>\n <p>{{ error() }}</p>\n </div>\n </div>\n\n <!-- Main Content Area -->\n <div class=\"main-content\">\n <!-- Form Section -->\n <div class=\"form-section\">\n <div class=\"form-header\">\n <cide-ele-icon>{{ isEditMode() ? 'edit' : 'add' }}</cide-ele-icon>\n <h3>{{ isEditMode() ? 'Edit Control' : 'Quick Add Control' }}</h3>\n </div>\n\n <!-- Form -->\n <form [formGroup]=\"controlForm\" (ngSubmit)=\"saveControl()\" class=\"control-form tw-overflow-y-auto\">\n <div class=\"form-grid\">\n \n <!-- Basic Information Section -->\n <!-- Control Key -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_key\"\n formControlName=\"sype_key\"\n placeholder=\"Enter control key\"\n label=\"Control Key\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Control Label -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_label\"\n formControlName=\"sype_label\"\n placeholder=\"Enter control label\"\n label=\"Control Label\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Control Type -->\n <div class=\"form-group\">\n <cide-ele-select\n id=\"sype_type\"\n formControlName=\"sype_type\"\n [options]=\"[\n { value: 'text', label: 'Text Input' },\n { value: 'textarea', label: 'Text Area' },\n { value: 'select', label: 'Select' },\n { value: 'checkbox', label: 'Checkbox' },\n { value: 'radio', label: 'Radio' },\n { value: 'date', label: 'Date' },\n { value: 'number', label: 'Number' },\n { value: 'email', label: 'Email' },\n { value: 'password', label: 'Password' },\n { value: 'file', label: 'File Upload' }\n ]\"\n label=\"Control Type\"\n size=\"sm\">\n </cide-ele-select>\n </div>\n\n <!-- Status - Checkbox aligned properly -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_isactive\"\n type=\"checkbox\"\n formControlName=\"sype_isactive\"\n label=\"Active Status\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Placeholder -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_placeholder\"\n formControlName=\"sype_placeholder\"\n placeholder=\"Enter placeholder text\"\n label=\"Placeholder\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Auto Complete - Checkbox aligned properly -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_auto_complete\"\n type=\"checkbox\"\n formControlName=\"sype_auto_complete\"\n label=\"Auto Complete\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Tooltip -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_tooltip\"\n formControlName=\"sype_tooltip\"\n placeholder=\"Enter tooltip text\"\n label=\"Tooltip\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Validation & Sizing Section -->\n <!-- Min/Max Length - Side by side -->\n <div class=\"form-group form-group-row\">\n <div class=\"form-group-half\">\n <cide-ele-input\n id=\"sype_min_length\"\n type=\"number\"\n formControlName=\"sype_min_length\"\n placeholder=\"0\"\n label=\"Min Length\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n <div class=\"form-group-half\">\n <cide-ele-input\n id=\"sype_max_length\"\n type=\"number\"\n formControlName=\"sype_max_length\"\n placeholder=\"20\"\n label=\"Max Length\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n </div>\n\n <!-- Size & Label Placement - Side by side -->\n <div class=\"form-group form-group-row\">\n <div class=\"form-group-half\">\n <cide-ele-select\n id=\"sype_size\"\n formControlName=\"sype_size\"\n label=\"Size\"\n size=\"xs\"\n [options]=\"[\n { value: 'xs', label: 'XS' },\n { value: 'sm', label: 'SM' },\n { value: 'md', label: 'MD' },\n { value: 'lg', label: 'LG' },\n { value: 'xl', label: 'XL' },\n { value: 'xxl', label: 'XXL' }\n ]\">\n </cide-ele-select>\n </div>\n <div class=\"form-group-half\">\n <cide-ele-select\n id=\"sype_label_placement\"\n formControlName=\"sype_label_placement\"\n label=\"Label Placement\"\n size=\"xs\"\n [options]=\"[\n { value: 'left', label: 'Left' },\n { value: 'floating', label: 'Floating' },\n { value: 'fixed', label: 'Fixed' }\n ]\">\n </cide-ele-select>\n </div>\n </div>\n\n <!-- Width & Height - Side by side -->\n <div class=\"form-group form-group-row\">\n <div class=\"form-group-half\">\n <cide-ele-input\n id=\"sype_width\"\n type=\"text\"\n formControlName=\"sype_width\"\n placeholder=\"20px\"\n label=\"Width\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n <div class=\"form-group-half\">\n <cide-ele-input\n id=\"sype_height\"\n type=\"text\"\n formControlName=\"sype_height\"\n placeholder=\"20px\"\n label=\"Height\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n </div>\n\n <!-- Leading Icon -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_leading_icon\"\n formControlName=\"sype_leading_icon\"\n placeholder=\"Enter icon name\"\n label=\"Leading Icon\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Default Value -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_default\"\n formControlName=\"sype_default\"\n placeholder=\"Enter default value\"\n label=\"Default Value\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Regex Pattern -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_regex\"\n formControlName=\"sype_regex\"\n placeholder=\"Enter regex pattern\"\n label=\"Regex Pattern\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Option Key -->\n <div class=\"form-group\">\n <cide-ele-input\n id=\"sype_option_key\"\n formControlName=\"sype_option_key\"\n placeholder=\"Enter option key\"\n label=\"Option Key\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n\n <!-- Entity ID (Auto-assigned from AppState) - Hidden -->\n <div class=\"form-group\" style=\"display: none;\">\n <cide-ele-input\n id=\"sype_entity_id_syen\"\n formControlName=\"sype_entity_id_syen\"\n placeholder=\"Auto-assigned from system\"\n label=\"Entity ID (Auto-assigned)\"\n size=\"sm\"\n readonly>\n </cide-ele-input>\n </div>\n\n <!-- Control Options -->\n <div class=\"form-group full-width\">\n <h6 class=\"options-title\">Control Options</h6>\n <div class=\"options-grid\">\n \n <!-- Required -->\n <div class=\"option-item\">\n <cide-ele-input\n id=\"sype_required\"\n type=\"checkbox\"\n formControlName=\"sype_required\"\n label=\"Required\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n\n <!-- Disabled -->\n <div class=\"option-item\">\n <cide-ele-input\n id=\"sype_disabled\"\n type=\"checkbox\"\n formControlName=\"sype_disabled\"\n label=\"Disabled\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n\n <!-- Hide Label -->\n <div class=\"option-item\">\n <cide-ele-input\n id=\"sype_label_hide\"\n type=\"checkbox\"\n formControlName=\"sype_label_hide\"\n label=\"Hide Label\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n\n <!-- Hide Helper Text -->\n <div class=\"option-item\">\n <cide-ele-input\n id=\"sype_hide_helper_and_error_text\"\n type=\"checkbox\"\n formControlName=\"sype_hide_helper_and_error_text\"\n label=\"Hide Helper Text\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n\n <!-- Helper Text Collapse -->\n <div class=\"option-item\">\n <cide-ele-input\n id=\"sype_helper_text_collapse\"\n type=\"checkbox\"\n formControlName=\"sype_helper_text_collapse\"\n label=\"Collapse Helper\"\n size=\"xs\">\n </cide-ele-input>\n </div>\n\n </div>\n </div>\n\n </div>\n\n <!-- Form Actions -->\n <div class=\"form-actions\">\n <button \n cideEleButton\n type=\"button\"\n variant=\"outline\"\n (click)=\"cancelForm()\"\n [disabled]=\"loading()\">\n Cancel\n </button>\n <button \n cideEleButton\n type=\"submit\"\n variant=\"primary\"\n [disabled]=\"loading()\">\n {{ isEditMode() ? 'Update Control' : 'Create Control' }}\n </button>\n </div>\n </form>\n </div>\n\n <!-- Controls List Section -->\n <div class=\"controls-list-section\">\n <div class=\"controls-header\">\n <h3>Page Controls</h3>\n <p>Controls connected to this page</p>\n </div>\n \n <div class=\"controls-list\" *ngIf=\"!loading() && controls().length > 0\">\n <div \n class=\"control-item\" \n *ngFor=\"let control of controls(); trackBy: trackByControlId\"\n [class.selected]=\"selectedControlId() === control._id\"\n (click)=\"selectControl(control)\"\n (keyup.enter)=\"selectControl(control)\"\n (keyup.space)=\"selectControl(control)\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-label]=\"'Select control ' + (control.sype_label || control.sype_key)\">\n <div class=\"control-header\">\n <div class=\"control-icon\">\n <cide-ele-icon>settings_input_component</cide-ele-icon>\n </div>\n <div class=\"control-info\">\n <h4>{{ control.sype_label || control.sype_key }}</h4>\n <p>{{ control.sype_tooltip || 'No tooltip' }}</p>\n <div class=\"control-meta\">\n <span class=\"control-type\">{{ control.sype_type }}</span>\n <span class=\"control-status\" [class.active]=\"control.sype_isactive\">\n {{ control.sype_isactive ? 'Active' : 'Inactive' }}\n </span>\n </div>\n </div>\n <div class=\"control-actions\">\n <button \n cideEleButton\n variant=\"ghost\"\n size=\"sm\"\n (click)=\"editControl(control); $event.stopPropagation()\">\n <cide-ele-icon>edit</cide-ele-icon>\n </button>\n <button \n cideEleButton\n variant=\"ghost\"\n size=\"sm\"\n (click)=\"deleteControl(control); $event.stopPropagation()\">\n <cide-ele-icon>delete</cide-ele-icon>\n </button>\n </div>\n </div>\n \n \n </div>\n </div>\n\n <div class=\"controls-list-empty\" *ngIf=\"!loading() && controls().length === 0\">\n <cide-ele-icon>settings_input_component</cide-ele-icon>\n <p>No controls available</p>\n <small>Create controls using the form on the left</small>\n </div>\n\n <div class=\"controls-list-loading\" *ngIf=\"loading()\">\n <cide-ele-icon class=\"spinning\">refresh</cide-ele-icon>\n <p>Loading controls...</p>\n </div>\n </div>\n </div>\n</div>\n\n ", styles: [".page-controls-container{@apply tw-flex tw-flex-col tw-h-full tw-bg-gray-50;}.header{@apply tw-bg-white tw-border-b tw-border-gray-200 tw-px-6 tw-py-4;}.header-content{@apply tw-flex tw-items-center tw-justify-between;}.header-left{@apply tw-flex tw-items-center tw-space-x-4;}.back-button{@apply tw-flex tw-items-center tw-justify-center tw-w-8 tw-h-8 tw-text-gray-600 hover:tw-text-gray-900 hover:tw-bg-gray-100 tw-rounded-md tw-transition-colors;}.title-section{@apply tw-flex tw-items-center tw-space-x-3;}.title-icon{@apply tw-text-blue-600 tw-text-xl;}.title{@apply tw-text-xl tw-font-semibold tw-text-gray-900 tw-mb-0;}.subtitle{@apply tw-text-sm tw-text-gray-500 tw-mb-0;}.error-message{@apply tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-md tw-p-4 tw-mx-6 tw-mt-4 tw-flex tw-items-start tw-space-x-3;}.error-message cide-ele-icon{@apply tw-text-red-500 tw-flex-shrink-0 tw-mt-0.5;}.error-message h3{@apply tw-text-red-800 tw-font-medium tw-mb-1;}.error-message p{@apply tw-text-red-700 tw-text-sm tw-mb-0;}.main-content{@apply tw-flex tw-flex-1 tw-gap-6 tw-p-6 tw-overflow-hidden;}.form-section{@apply tw-w-3/5 tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-flex tw-flex-col;}.form-header{@apply tw-flex tw-items-center tw-space-x-3 tw-p-6 tw-border-b tw-border-gray-200;}.form-header cide-ele-icon{@apply tw-text-blue-600;}.form-header h3{@apply tw-text-lg tw-font-medium tw-text-gray-900 tw-mb-0;}.control-form{@apply tw-flex tw-flex-col tw-flex-1 tw-p-6;}.form-grid{@apply tw-grid tw-grid-cols-2 tw-gap-4 tw-mb-6;}.form-group{@apply tw-space-y-1;}.form-group.full-width{@apply tw-col-span-2;}.form-group.compact-number,.form-group.compact-select,.form-group.compact-dimension{@apply tw-max-w-32;}.form-group.compact-number{@apply tw-min-w-20;}.form-group.compact-dimension{@apply tw-min-w-24;}.form-group.compact-select{@apply tw-min-w-28;}.form-group.form-group-row{@apply tw-col-span-2 tw-flex tw-gap-4;}.form-group-half{@apply tw-flex-1 tw-space-y-1;}.checkbox-field{margin:.25rem 0}.checkbox-label{display:flex;flex-direction:column;gap:.25rem;cursor:pointer;padding:.75rem 0;background:transparent;border:none;border-radius:0;transition:all .2s ease}.checkbox-label:hover{background:#667eea05}.checkbox-label .checkbox-input{width:1rem;height:1rem;accent-color:#667eea;border-radius:3px;margin-bottom:.125rem}.checkbox-label .checkbox-text{font-weight:600;color:#374151;font-size:.875rem}.checkbox-label .checkbox-description{font-size:.75rem;color:#6b7280;margin-top:.125rem}.options-title{@apply tw-text-sm tw-font-medium tw-text-gray-900 tw-mb-3;}.options-grid{@apply tw-grid tw-grid-cols-3 tw-gap-3;}.option-item{@apply tw-flex tw-items-center tw-space-x-2;}.option-checkbox{@apply tw-rounded tw-border-gray-300 tw-text-blue-600 focus:tw-ring-blue-500 focus:tw-border-blue-500;}.option-item label{@apply tw-text-sm tw-text-gray-700 tw-cursor-pointer;}.form-actions{@apply tw-flex tw-justify-end tw-space-x-3 tw-pt-4 tw-border-t tw-border-gray-200 tw-mt-auto;}.controls-list-section{@apply tw-w-2/5 tw-bg-white tw-rounded-lg tw-border tw-border-gray-200 tw-shadow-sm tw-flex tw-flex-col;}.controls-header{@apply tw-p-6 tw-border-b tw-border-gray-200;}.controls-header h3{@apply tw-text-lg tw-font-medium tw-text-gray-900 tw-mb-1;}.controls-header p{@apply tw-text-sm tw-text-gray-500 tw-mb-0;}.controls-list{@apply tw-flex-1 tw-overflow-y-auto tw-p-4;}.control-item{@apply tw-bg-gray-50 tw-border tw-border-gray-200 tw-rounded-lg tw-p-4 tw-mb-3 tw-cursor-pointer tw-transition-all tw-duration-200;}.control-item:hover{@apply tw-shadow-md tw-border-gray-300;}.control-item.selected{@apply tw-bg-blue-50 tw-border-blue-300 tw-shadow-md;}.control-item:focus{@apply tw-outline-none tw-ring-2 tw-ring-blue-500 tw-ring-offset-2;}.control-item:last-child{@apply tw-mb-0;}.control-header{@apply tw-flex tw-items-start tw-space-x-3;}.control-icon{@apply tw-flex-shrink-0 tw-w-10 tw-h-10 tw-bg-blue-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center;}.control-icon cide-ele-icon{@apply tw-text-blue-600;}.control-info{@apply tw-flex-1 tw-min-w-0;}.control-info h4{@apply tw-text-sm tw-font-medium tw-text-gray-900 tw-mb-1 tw-truncate;}.control-info p{@apply tw-text-xs tw-text-gray-500 tw-mb-2 tw-truncate;}.control-meta{@apply tw-flex tw-items-center tw-space-x-2;}.control-type{@apply tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-gray-100 tw-text-gray-800;}.control-status{@apply tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-red-100 tw-text-red-800;}.control-status.active{@apply tw-bg-green-100 tw-text-green-800;}.control-actions{@apply tw-flex tw-items-center tw-space-x-1 tw-opacity-0 tw-transition-opacity tw-duration-200;}.control-item:hover .control-actions,.control-item.selected .control-actions{@apply tw-opacity-100;}.controls-list-empty{@apply tw-flex tw-flex-col tw-items-center tw-justify-center tw-py-12 tw-text-center;}.controls-list-empty cide-ele-icon{@apply tw-text-4xl tw-text-gray-300 tw-mb-4;}.controls-list-empty p{@apply tw-text-gray-500 tw-font-medium tw-mb-1;}.controls-list-empty small{@apply tw-text-gray-400;}.controls-list-loading{@apply tw-flex tw-flex-col tw-items-center tw-justify-center tw-py-12 tw-text-center;}.controls-list-loading cide-ele-icon{@apply tw-text-2xl tw-text-blue-500 tw-mb-4;}.controls-list-loading p{@apply tw-text-gray-500;}.spinning{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@media (max-width: 1024px){.main-content{@apply tw-flex-col;}.form-section{@apply tw-w-full;}.controls-list-section{@apply tw-w-full tw-max-h-96;}.form-grid{@apply tw-grid-cols-1;}.options-grid{@apply tw-grid-cols-2;}}@media (max-width: 640px){.main-content{@apply tw-p-4 tw-gap-4;}.form-grid{@apply tw-gap-3;}.form-actions{@apply tw-flex-col tw-space-x-0 tw-space-y-2;}.options-grid{@apply tw-grid-cols-1;}}\n"] }]
|
|
482
|
-
}] });
|
|
483
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1jb250cm9scy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtY29yZS9zcmMvbGliL2NvcmUvcGFnZS1tYW5hZ2VtZW50L2NvbXBvbmVudHMvcGFnZS1jb250cm9scy9wYWdlLWNvbnRyb2xzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nsb3VkLWlkZS1jb3JlL3NyYy9saWIvY29yZS9wYWdlLW1hbmFnZW1lbnQvY29tcG9uZW50cy9wYWdlLWNvbnRyb2xzL3BhZ2UtY29udHJvbHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDeEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBZ0IsTUFBTSxtQkFBbUIsQ0FBQztBQUMvSixPQUFPLEVBQWUsd0JBQXdCLEVBQXlFLE1BQU0scUJBQXFCLENBQUM7Ozs7QUFrQm5KLE1BQU0sT0FB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LENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7UUFDaEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBYSxFQUFFLE9BQWtCO1FBQ2hELE9BQU8sT0FBTyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQzs4R0ExZVUscUJBQXFCO2tHQUFyQixxQkFBcUIsdUZDM0JsQywwaGRBNGFDLDgzTEQ3WkcsWUFBWSwrUEFDWixtQkFBbUIsNHJCQUNuQixXQUFXLCtCQUNYLHNCQUFzQixrWEFDdEIsa0JBQWtCLDBiQUNsQixtQkFBbUIsbVlBQ25CLGlCQUFpQjs7MkZBTVIscUJBQXFCO2tCQWhCakMsU0FBUzsrQkFDRSw2QkFBNkIsY0FDM0IsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osbUJBQW1CO3dCQUNuQixXQUFXO3dCQUNYLHNCQUFzQjt3QkFDdEIsa0JBQWtCO3dCQUNsQixtQkFBbUI7d0JBQ25CLGlCQUFpQjt3QkFDakIsd0JBQXdCO3FCQUN6QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgc2lnbmFsLCBjb21wdXRlZCwgRGVzdHJveVJlZiwgaW5qZWN0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSwgTm9uTnVsbGFibGVGb3JtQnVpbGRlciwgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XHJcblxyXG5pbXBvcnQgeyBQYWdlQ29udHJvbHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcGFnZS1jb250cm9scy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXBwU3RhdGVIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnY2xvdWQtaWRlLWxheW91dCc7XHJcbmltcG9ydCB7IENpZGVFbGVCdXR0b25Db21wb25lbnQsIENpZGVJY29uQ29tcG9uZW50LCBDaWRlSW5wdXRDb21wb25lbnQsIENpZGVTZWxlY3RDb21wb25lbnQsIENpZGVFbGVEcm9wZG93bkNvbXBvbmVudCwgRHJvcGRvd25JdGVtIH0gZnJvbSAnY2xvdWQtaWRlLWVsZW1lbnQnO1xyXG5pbXBvcnQgeyBjb250cm9sVHlwZSwgZ2VuZXJhdGVPYmplY3RGcm9tU3RyaW5nLCBJQ29yZVN5cGUsIE1QYWdlRWxlbWVudHMsIE1QYWdlRWxlbWVudHNJbnNlcnRVcGRhdGVQYXlsb2FkLCB0aGVtZVNpemUgfSBmcm9tICdjbG91ZC1pZGUtbG1zLW1vZGVsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY2lkZS1jb3JlLWFwcC1wYWdlLWNvbnRyb2xzJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIENpZGVFbGVCdXR0b25Db21wb25lbnQsXHJcbiAgICBDaWRlSW5wdXRDb21wb25lbnQsXHJcbiAgICBDaWRlU2VsZWN0Q29tcG9uZW50LFxyXG4gICAgQ2lkZUljb25Db21wb25lbnQsXHJcbiAgICBDaWRlRWxlRHJvcGRvd25Db21wb25lbnRcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wYWdlLWNvbnRyb2xzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9wYWdlLWNvbnRyb2xzLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFBhZ2VDb250cm9sc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgLy8gRGVwZW5kZW5jeSBpbmplY3Rpb25cclxuICBwcml2YXRlIGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XHJcbiAgcHJpdmF0ZSBjb250cm9sc1NlcnZpY2UgPSBpbmplY3QoUGFnZUNvbnRyb2xzU2VydmljZSk7XHJcbiAgcHJpdmF0ZSBhcHBTdGF0ZSA9IGluamVjdChBcHBTdGF0ZUhlbHBlclNlcnZpY2UpO1xyXG4gIHByaXZhdGUgZmIgPSBpbmplY3QoTm9uTnVsbGFibGVGb3JtQnVpbGRlcik7XHJcbiAgcHJpdmF0ZSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcclxuICBwcml2YXRlIHJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcclxuXHJcblxyXG5cclxuICAvLyBNYWtlIE1hdGggYXZhaWxhYmxlIGluIHRlbXBsYXRlXHJcbiAgTWF0aCA9IE1hdGg7XHJcblxyXG4gIC8vIFNpZ25hbHMgZm9yIHJlYWN0aXZlIHN0YXRlIG1hbmFnZW1lbnRcclxuICBjb250cm9scyA9IHNpZ25hbDxJQ29yZVN5cGVbXT4oW10pO1xyXG4gIGxvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xyXG4gIGVycm9yID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xyXG4gIHNlbGVjdGVkSXRlbXMgPSBzaWduYWw8c3RyaW5nW10+KFtdKTtcclxuICBzZWFyY2hUZXJtID0gc2lnbmFsKCcnKTtcclxuXHJcbiAgLy8gUGFnZSBpbmZvcm1hdGlvblxyXG4gIHBhZ2VJZCA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcclxuICBwYWdlVGl0bGUgPSBzaWduYWw8c3RyaW5nPignJyk7XHJcblxyXG4gIC8vIEZvcm0gc3RhdGVcclxuICBpc0VkaXRNb2RlID0gc2lnbmFsKGZhbHNlKTtcclxuICBlZGl0aW5nQ29udHJvbElkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xyXG4gIHJldHJpZXZlZENvbnRyb2wgPSBzaWduYWw8SUNvcmVTeXBlIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gIC8vIENvbnRyb2wgc2VsZWN0aW9uIGZvciBuZXcgbGF5b3V0XHJcbiAgc2VsZWN0ZWRDb250cm9sSWQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gIC8vIFBhZ2luYXRpb24gc2lnbmFsc1xyXG4gIGN1cnJlbnRQYWdlID0gc2lnbmFsKDEpO1xyXG4gIHBhZ2VTaXplID0gc2lnbmFsKDEwKTtcclxuICB0b3RhbEl0ZW1zID0gc2lnbmFsKDApO1xyXG5cclxuICAvLyBNb2Rlcm4gcmVhY3RpdmUgZm9ybXMgd2l0aCBzaWduYWxzIC0gTm8gdmFsaWRhdG9ycyBmb3Igc2ltcGxpY2l0eVxyXG4gIGNvbnRyb2xGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICBzeXBlX2tleTogWycnXSxcclxuICAgIHN5cGVfbGFiZWw6IFsnJ10sXHJcbiAgICBzeXBlX2xhYmVsX2hpZGU6IFtmYWxzZV0sXHJcbiAgICBzeXBlX2F1dG9fY29tcGxldGU6IFtmYWxzZV0sIC8vIENoYW5nZWQgdG8gYm9vbGVhbiBmb3IgY2hlY2tib3hcclxuICAgIHN5cGVfaGlkZV9oZWxwZXJfYW5kX2Vycm9yX3RleHQ6IFtmYWxzZV0sXHJcbiAgICBzeXBlX3R5cGU6IFsnJ10sIC8vIGNvbnRyb2xUeXBlXHJcbiAgICBzeXBlX29wdGlvbl9rZXk6IFsnJ10sXHJcbiAgICBzeXBlX3BsYWNlaG9sZGVyOiBbJyddLFxyXG4gICAgc3lwZV9taW5fbGVuZ3RoOiBbMF0sXHJcbiAgICBzeXBlX21heF9sZW5ndGg6IFsyMF0sXHJcbiAgICBzeXBlX3JlZ2V4OiBbJyddLFxyXG4gICAgc3lwZV9yZXF1aXJlZDogW2ZhbHNlXSxcclxuICAgIHN5cGVfZGlzYWJsZWQ6IFtmYWxzZV0sXHJcbiAgICBzeXBlX3dpZHRoOiBbJyddLCAvLyBDaGFuZ2VkIHRvIHN0cmluZyBmb3IgcHggdmFsdWVzIGxpa2UgXCIyMHB4XCJcclxuICAgIHN5cGVfaGVpZ2h0OiBbJyddLCAvLyBDaGFuZ2VkIHRvIHN0cmluZyBmb3IgcHggdmFsdWVzIGxpa2UgXCIyMHB4XCJcclxuICAgIHN5cGVfbGFiZWxfcGxhY2VtZW50OiBbJ2xlZnQnIGFzICdmbG9hdGluZycgfCAnZml4ZWQnXSxcclxuICAgIHN5cGVfaGVscGVyX3RleHRfY29sbGFwc2U6IFtmYWxzZV0sXHJcbiAgICBzeXBlX2RlZmF1bHQ6IFsnJyBhcyBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuXSxcclxuICAgIHN5cGVfdG9vbHRpcDogWycnXSxcclxuICAgIHN5cGVfc2l6ZTogWydzbScgYXMgdGhlbWVTaXplXSwgLy8gQ2hhbmdlZCBkZWZhdWx0IHRvIHNtYWxsXHJcbiAgICBzeXBlX2xlYWRpbmdfaWNvbjogWycnXSxcclxuICAgIHN5cGVfaXNhY3RpdmU6IFt0cnVlXSxcclxuICAgIHN5cGVfZW50aXR5X2lkX3N5ZW46IFsnJ11cclxuICB9KTtcclxuXHJcbiAgLy8gQ29tcHV0ZWQgdmFsdWVzXHJcbiAgaXNGb3JtRGlydHkgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbnRyb2xGb3JtLmRpcnR5KTtcclxuXHJcblxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbXBvbmVudCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5pdGlhbGl6ZSBjb21wb25lbnRcclxuICAgKi9cclxuICBwcml2YXRlIGluaXRpYWxpemVDb21wb25lbnQoKTogdm9pZCB7XHJcbiAgICAvLyBHZXQgcGFnZSBpbmZvcm1hdGlvbiBmcm9tIHJvdXRlXHJcbiAgICB0aGlzLnJvdXRlLnBhcmFtcy5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKS5zdWJzY3JpYmUocGFyYW1zID0+IHtcclxuICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSBwYXJhbXNbJ3F1ZXJ5J107XHJcbiAgICAgIGNvbnN0IHF1ZXJ5RGF0YSA9IGdlbmVyYXRlT2JqZWN0RnJvbVN0cmluZyhxdWVyeVBhcmFtcyk7XHJcbiAgICAgIHRoaXMucGFnZUlkLnNldChxdWVyeURhdGE/LnN5cGdfaWQgfHwgJycpO1xyXG4gICAgICB0aGlzLnBhZ2VUaXRsZS5zZXQocXVlcnlEYXRhPy5zeXBnX3RpdGxlIHx8ICcnKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnBhZ2VJZCgpKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkQ29udHJvbHMoKTtcclxuICAgICAgICB0aGlzLnNldHVwRm9ybVN1YnNjcmlwdGlvbnMoKTtcclxuICAgICAgICB0aGlzLnNldEVudGl0eUlkRnJvbUFwcFN0YXRlKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5lcnJvci5zZXQoJ05vIHBhZ2UgSUQgcHJvdmlkZWQnKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgZW50aXR5IElEIGZyb20gYXBwIHN0YXRlIC0gYXV0by1hc3NpZ25lZCBpbnRlcm5hbGx5XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRFbnRpdHlJZEZyb21BcHBTdGF0ZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVudGl0eUlkID0gdGhpcy5hcHBTdGF0ZS5nZXRBY3RpdmVFbnRpdHlJZCgpO1xyXG4gICAgaWYgKGVudGl0eUlkKSB7XHJcbiAgICAgIHRoaXMuY29udHJvbEZvcm0ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgc3lwZV9lbnRpdHlfaWRfc3llbjogZW50aXR5SWRcclxuICAgICAgfSk7XHJcbiAgICAgIC8vIERpc2FibGUgdGhlIGVudGl0eSBmaWVsZCBzaW5jZSBpdCdzIGF1dG8tYXNzaWduZWRcclxuICAgICAgdGhpcy5jb250cm9sRm9ybS5nZXQoJ3N5cGVfZW50aXR5X2lkX3N5ZW4nKT8uZGlzYWJsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZCBjb250cm9scyBmcm9tIEFQSVxyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9hZENvbnRyb2xzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcclxuICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xyXG5cclxuICAgIGNvbnN0IHJlcXVlc3Q6IE1QYWdlRWxlbWVudHMgPSB7XHJcbiAgICAgIHN5cGVfcGFnZV9pZF9zeXBnOiB0aGlzLnBhZ2VJZCgpXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuY29udHJvbHNTZXJ2aWNlLmdldENvbnRyb2xMaXN0KHJlcXVlc3QpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbHMuc2V0KHJlc3BvbnNlLmRhdGEgfHwgW10pO1xyXG4gICAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMuc2V0KHJlc3BvbnNlLnRvdGFsIHx8IDApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvci5zZXQocmVzcG9uc2UubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGxvYWQgY29udHJvbHMnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBjb250cm9sczonLCBlcnJvcik7XHJcbiAgICAgICAgICB0aGlzLmVycm9yLnNldCgnRmFpbGVkIHRvIGxvYWQgY29udHJvbHMuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0dXAgZm9ybSBzdWJzY3JpcHRpb25zXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXR1cEZvcm1TdWJzY3JpcHRpb25zKCk6IHZvaWQge1xyXG4gICAgLy8gV2F0Y2ggZm9yIGZvcm0gY2hhbmdlcyB0byBlbmFibGUvZGlzYWJsZSBzYXZlIGJ1dHRvblxyXG4gICAgdGhpcy5jb250cm9sRm9ybS52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIC8vIEZvcm0gdmFsaWRhdGlvbiBpcyBoYW5kbGVkIGJ5IGNvbXB1dGVkIHNpZ25hbHNcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBuZXcgY29udHJvbFxyXG4gICAqL1xyXG4gIGNyZWF0ZUNvbnRyb2woKTogdm9pZCB7XHJcblxyXG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5jb250cm9sRm9ybS5nZXRSYXdWYWx1ZSgpO1xyXG4gICAgY29uc3QgZW50aXR5SWQgPSB0aGlzLmFwcFN0YXRlLmdldEFjdGl2ZUVudGl0eUlkKCk7XHJcblxyXG4gICAgY29uc3QgbmV3Q29udHJvbDogTVBhZ2VFbGVtZW50c0luc2VydFVwZGF0ZVBheWxvYWQgPSB7XHJcbiAgICAgIF9pZDogJycsXHJcbiAgICAgIHN5cGVfa2V5OiBmb3JtVmFsdWUuc3lwZV9rZXksXHJcbiAgICAgIHN5cGVfcGFnZV9pZF9zeXBnOiB0aGlzLnBhZ2VJZCgpLFxyXG4gICAgICBzeXBlX2xhYmVsOiBmb3JtVmFsdWUuc3lwZV9sYWJlbCxcclxuICAgICAgc3lwZV9sYWJlbF9oaWRlOiBmb3JtVmFsdWUuc3lwZV9sYWJlbF9oaWRlLFxyXG4gICAgICBzeXBlX2F1dG9fY29tcGxldGU6IGZvcm1WYWx1ZS5zeXBlX2F1dG9fY29tcGxldGUsXHJcbiAgICAgIHN5cGVfaGlkZV9oZWxwZXJfYW5kX2Vycm9yX3RleHQ6IGZvcm1WYWx1ZS5zeXBlX2hpZGVfaGVscGVyX2FuZF9lcnJvcl90ZXh0LFxyXG4gICAgICBzeXBlX3R5cGU6IGZvcm1WYWx1ZS5zeXBlX3R5cGUgYXMgY29udHJvbFR5cGUsXHJcbiAgICAgIHN5cGVfb3B0aW9uX2tleTogZm9ybVZhbHVlLnN5cGVfb3B0aW9uX2tleSxcclxuICAgICAgc3lwZV9wbGFjZWhvbGRlcjogZm9ybVZhbHVlLnN5cGVfcGxhY2Vob2xkZXIsXHJcbiAgICAgIHN5cGVfbWluX2xlbmd0aDogZm9ybVZhbHVlLnN5cGVfbWluX2xlbmd0aCxcclxuICAgICAgc3lwZV9tYXhfbGVuZ3RoOiBmb3JtVmFsdWUuc3lwZV9tYXhfbGVuZ3RoLFxyXG4gICAgICBzeXBlX3JlZ2V4OiBmb3JtVmFsdWUuc3lwZV9yZWdleCxcclxuICAgICAgc3lwZV9yZXF1aXJlZDogZm9ybVZhbHVlLnN5cGVfcmVxdWlyZWQsXHJcbiAgICAgIHN5cGVfZGlzYWJsZWQ6IGZvcm1WYWx1ZS5zeXBlX2Rpc2FibGVkLFxyXG4gICAgICBzeXBlX3dpZHRoOiBmb3JtVmFsdWUuc3lwZV93aWR0aCxcclxuICAgICAgc3lwZV9oZWlnaHQ6IGZvcm1WYWx1ZS5zeXBlX2hlaWdodCxcclxuICAgICAgc3lwZV9sYWJlbF9wbGFjZW1lbnQ6IGZvcm1WYWx1ZS5zeXBlX2xhYmVsX3BsYWNlbWVudCxcclxuICAgICAgc3lwZV9oZWxwZXJfdGV4dF9jb2xsYXBzZTogZm9ybVZhbHVlLnN5cGVfaGVscGVyX3RleHRfY29sbGFwc2UsXHJcbiAgICAgIHN5cGVfZGVmYXVsdDogZm9ybVZhbHVlLnN5cGVfZGVmYXVsdCxcclxuICAgICAgc3lwZV90b29sdGlwOiBmb3JtVmFsdWUuc3lwZV90b29sdGlwLFxyXG4gICAgICBzeXBlX3NpemU6IGZvcm1WYWx1ZS5zeXBlX3NpemUsXHJcbiAgICAgIHN5cGVfbGVhZGluZ19pY29uOiBmb3JtVmFsdWUuc3lwZV9sZWFkaW5nX2ljb24sXHJcbiAgICAgIHN5cGVfaXNhY3RpdmU6IGZvcm1WYWx1ZS5zeXBlX2lzYWN0aXZlLFxyXG4gICAgICBzeXBlX2VudGl0eV9pZF9zeWVuOiBlbnRpdHlJZCB8fCBmb3JtVmFsdWUuc3lwZV9lbnRpdHlfaWRfc3llblxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xyXG4gICAgdGhpcy5jb250cm9sc1NlcnZpY2UuY3JlYXRlQ29udHJvbChuZXdDb250cm9sKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybSgpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRDb250cm9scygpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQ29udHJvbCBjcmVhdGVkIHN1Y2Nlc3NmdWxseScpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihyZXNwb25zZS5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gY3JlYXRlIGNvbnRyb2wnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgY3JlYXRpbmcgY29udHJvbDonLCBlcnJvcik7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGNvbnRyb2wuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIGV4aXN0aW5nIGNvbnRyb2xcclxuICAgKi9cclxuICB1cGRhdGVDb250cm9sKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmVkaXRpbmdDb250cm9sSWQoKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5jb250cm9sRm9ybS5nZXRSYXdWYWx1ZSgpO1xyXG4gICAgY29uc3QgZW50aXR5SWQgPSB0aGlzLmFwcFN0YXRlLmdldEFjdGl2ZUVudGl0eUlkKCk7XHJcblxyXG4gICAgY29uc3QgdXBkYXRlZENvbnRyb2w6IE1QYWdlRWxlbWVudHNJbnNlcnRVcGRhdGVQYXlsb2FkID0ge1xyXG4gICAgICBfaWQ6IHRoaXMuZWRpdGluZ0NvbnRyb2xJZCgpISxcclxuICAgICAgc3lwZV9rZXk6IGZvcm1WYWx1ZS5zeXBlX2tleSxcclxuICAgICAgc3lwZV9wYWdlX2lkX3N5cGc6IHRoaXMucGFnZUlkKCksXHJcbiAgICAgIHN5cGVfbGFiZWw6IGZvcm1WYWx1ZS5zeXBlX2xhYmVsLFxyXG4gICAgICBzeXBlX2xhYmVsX2hpZGU6IGZvcm1WYWx1ZS5zeXBlX2xhYmVsX2hpZGUsXHJcbiAgICAgIHN5cGVfYXV0b19jb21wbGV0ZTogQm9vbGVhbihmb3JtVmFsdWUuc3lwZV9hdXRvX2NvbXBsZXRlKSxcclxuICAgICAgc3lwZV9oaWRlX2hlbHBlcl9hbmRfZXJyb3JfdGV4dDogZm9ybVZhbHVlLnN5cGVfaGlkZV9oZWxwZXJfYW5kX2Vycm9yX3RleHQsXHJcbiAgICAgIHN5cGVfdHlwZTogZm9ybVZhbHVlLnN5cGVfdHlwZSBhcyBjb250cm9sVHlwZSxcclxuICAgICAgc3lwZV9vcHRpb25fa2V5OiBmb3JtVmFsdWUuc3lwZV9vcHRpb25fa2V5LFxyXG4gICAgICBzeXBlX3BsYWNlaG9sZGVyOiBmb3JtVmFsdWUuc3lwZV9wbGFjZWhvbGRlcixcclxuICAgICAgc3lwZV9taW5fbGVuZ3RoOiBmb3JtVmFsdWUuc3lwZV9taW5fbGVuZ3RoLFxyXG4gICAgICBzeXBlX21heF9sZW5ndGg6IGZvcm1WYWx1ZS5zeXBlX21heF9sZW5ndGgsXHJcbiAgICAgIHN5cGVfcmVnZXg6IGZvcm1WYWx1ZS5zeXBlX3JlZ2V4LFxyXG4gICAgICBzeXBlX3JlcXVpcmVkOiBmb3JtVmFsdWUuc3lwZV9yZXF1aXJlZCxcclxuICAgICAgc3lwZV9kaXNhYmxlZDogZm9ybVZhbHVlLnN5cGVfZGlzYWJsZWQsXHJcbiAgICAgIHN5cGVfd2lkdGg6IGZvcm1WYWx1ZS5zeXBlX3dpZHRoLFxyXG4gICAgICBzeXBlX2hlaWdodDogZm9ybVZhbHVlLnN5cGVfaGVpZ2h0LFxyXG4gICAgICBzeXBlX2xhYmVsX3BsYWNlbWVudDogZm9ybVZhbHVlLnN5cGVfbGFiZWxfcGxhY2VtZW50LFxyXG4gICAgICBzeXBlX2hlbHBlcl90ZXh0X2NvbGxhcHNlOiBmb3JtVmFsdWUuc3lwZV9oZWxwZXJfdGV4dF9jb2xsYXBzZSxcclxuICAgICAgc3lwZV9kZWZhdWx0OiBmb3JtVmFsdWUuc3lwZV9kZWZhdWx0LFxyXG4gICAgICBzeXBlX3Rvb2x0aXA6IGZvcm1WYWx1ZS5zeXBlX3Rvb2x0aXAsXHJcbiAgICAgIHN5cGVfc2l6ZTogZm9ybVZhbHVlLnN5cGVfc2l6ZSxcclxuICAgICAgc3lwZV9sZWFkaW5nX2ljb246IGZvcm1WYWx1ZS5zeXBlX2xlYWRpbmdfaWNvbixcclxuICAgICAgc3lwZV9pc2FjdGl2ZTogZm9ybVZhbHVlLnN5cGVfaXNhY3RpdmUsXHJcbiAgICAgIHN5cGVfZW50aXR5X2lkX3N5ZW46IGVudGl0eUlkIHx8IGZvcm1WYWx1ZS5zeXBlX2VudGl0eV9pZF9zeWVuXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XHJcbiAgICB0aGlzLmNvbnRyb2xzU2VydmljZS51cGRhdGVDb250cm9sKHVwZGF0ZWRDb250cm9sKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybSgpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRDb250cm9scygpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQ29udHJvbCB1cGRhdGVkIHN1Y2Nlc3NmdWxseScpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihyZXNwb25zZS5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gdXBkYXRlIGNvbnRyb2wnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgdXBkYXRpbmcgY29udHJvbDonLCBlcnJvcik7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gdXBkYXRlIGNvbnRyb2wuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRWRpdCBjb250cm9sXHJcbiAgICovXHJcbiAgZWRpdENvbnRyb2woY29udHJvbDogSUNvcmVTeXBlKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzRWRpdE1vZGUuc2V0KHRydWUpO1xyXG4gICAgdGhpcy5lZGl0aW5nQ29udHJvbElkLnNldChjb250cm9sLl9pZCB8fCBudWxsKTtcclxuICAgIHRoaXMucmV0cmlldmVkQ29udHJvbC5zZXQoY29udHJvbCk7XHJcblxyXG4gICAgdGhpcy5jb250cm9sRm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgc3lwZV9rZXk6IGNvbnRyb2wuc3lwZV9rZXksXHJcbiAgICAgIHN5cGVfbGFiZWw6IGNvbnRyb2wuc3lwZV9sYWJlbCxcclxuICAgICAgc3lwZV9sYWJlbF9oaWRlOiBjb250cm9sLnN5cGVfbGFiZWxfaGlkZSxcclxuICAgICAgc3lwZV9hdXRvX2NvbXBsZXRlOiBjb250cm9sLnN5cGVfYXV0b19jb21wbGV0ZSA/IHRydWUgOiBmYWxzZSxcclxuICAgICAgc3lwZV9oaWRlX2hlbHBlcl9hbmRfZXJyb3JfdGV4dDogY29udHJvbC5zeXBlX2hpZGVfaGVscGVyX2FuZF9lcnJvcl90ZXh0LFxyXG4gICAgICBzeXBlX3R5cGU6IGNvbnRyb2wuc3lwZV90eXBlLFxyXG4gICAgICBzeXBlX29wdGlvbl9rZXk6IGNvbnRyb2wuc3lwZV9vcHRpb25fa2V5LFxyXG4gICAgICBzeXBlX3BsYWNlaG9sZGVyOiBjb250cm9sLnN5cGVfcGxhY2Vob2xkZXIsXHJcbiAgICAgIHN5cGVfbWluX2xlbmd0aDogY29udHJvbC5zeXBlX21pbl9sZW5ndGgsXHJcbiAgICAgIHN5cGVfbWF4X2xlbmd0aDogY29udHJvbC5zeXBlX21heF9sZW5ndGgsXHJcbiAgICAgIHN5cGVfcmVnZXg6IGNvbnRyb2wuc3lwZV9yZWdleCxcclxuICAgICAgc3lwZV9yZXF1aXJlZDogY29udHJvbC5zeXBlX3JlcXVpcmVkLFxyXG4gICAgICBzeXBlX2Rpc2FibGVkOiBjb250cm9sLnN5cGVfZGlzYWJsZWQsXHJcbiAgICAgIHN5cGVfd2lkdGg6IGNvbnRyb2wuc3lwZV93aWR0aD8udG9TdHJpbmcoKSB8fCAnJyxcclxuICAgICAgc3lwZV9oZWlnaHQ6IGNvbnRyb2wuc3lwZV9oZWlnaHQ/LnRvU3RyaW5nKCkgfHwgJycsXHJcbiAgICAgIHN5cGVfbGFiZWxfcGxhY2VtZW50OiBjb250cm9sLnN5cGVfbGFiZWxfcGxhY2VtZW50LFxyXG4gICAgICBzeXBlX2hlbHBlcl90ZXh0X2NvbGxhcHNlOiBjb250cm9sLnN5cGVfaGVscGVyX3RleHRfY29sbGFwc2UsXHJcbiAgICAgIHN5cGVfZGVmYXVsdDogY29udHJvbC5zeXBlX2RlZmF1bHQgYXMgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbixcclxuICAgICAgc3lwZV90b29sdGlwOiBjb250cm9sLnN5cGVfdG9vbHRpcCxcclxuICAgICAgc3lwZV9zaXplOiBjb250cm9sLnN5cGVfc2l6ZSBhcyB0aGVtZVNpemUsXHJcbiAgICAgIHN5cGVfbGVhZGluZ19pY29uOiBjb250cm9sLnN5cGVfbGVhZGluZ19pY29uLFxyXG4gICAgICBzeXBlX2lzYWN0aXZlOiBjb250cm9sLnN5cGVfaXNhY3RpdmUsXHJcbiAgICAgIHN5cGVfZW50aXR5X2lkX3N5ZW46IFN0cmluZyhjb250cm9sLnN5cGVfZW50aXR5X2lkX3N5ZW4gfHwgJycpXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNvbnRyb2xGb3JtLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgY29udHJvbFxyXG4gICAqL1xyXG4gIGRlbGV0ZUNvbnRyb2woY29udHJvbDogSUNvcmVTeXBlKTogdm9pZCB7XHJcbiAgICBpZiAoY29uZmlybShgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgY29udHJvbCBcIiR7Y29udHJvbC5zeXBlX2xhYmVsfVwiP2ApKSB7XHJcbiAgICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XHJcbiAgICAgIHRoaXMuY29udHJvbHNTZXJ2aWNlLmRlbGV0ZUNvbnRyb2woY29udHJvbC5faWQgfHwgJycpXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXHJcbiAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICB0aGlzLmxvYWRDb250cm9scygpO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb250cm9sIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihyZXNwb25zZS5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gZGVsZXRlIGNvbnRyb2wnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGRlbGV0aW5nIGNvbnRyb2w6JywgZXJyb3IpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGVsZXRlIGNvbnRyb2wuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVG9nZ2xlIGNvbnRyb2wgc3RhdHVzXHJcbiAgICovXHJcbiAgdG9nZ2xlQ29udHJvbFN0YXR1cyhjb250cm9sOiBJQ29yZVN5cGUpOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XHJcbiAgICB0aGlzLmNvbnRyb2xzU2VydmljZS50b2dnbGVDb250cm9sU3RhdHVzKHsgc3lwZV9pZDogY29udHJvbC5faWQgfHwgJycsIHN5cGVfaXNhY3RpdmU6ICFjb250cm9sLnN5cGVfaXNhY3RpdmUgfSlcclxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkQ29udHJvbHMoKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYENvbnRyb2wgJHtjb250cm9sLnN5cGVfaXNhY3RpdmUgPyAnZGVhY3RpdmF0ZWQnIDogJ2FjdGl2YXRlZCd9IHN1Y2Nlc3NmdWxseWApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihyZXNwb25zZS5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gdG9nZ2xlIGNvbnRyb2wgc3RhdHVzJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHRvZ2dsaW5nIGNvbnRyb2wgc3RhdHVzOicsIGVycm9yKTtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byB0b2dnbGUgY29udHJvbCBzdGF0dXMuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2F2ZSBjb250cm9sIChjcmVhdGUgb3IgdXBkYXRlKVxyXG4gICAqL1xyXG4gIHNhdmVDb250cm9sKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNFZGl0TW9kZSgpKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlQ29udHJvbCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jcmVhdGVDb250cm9sKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYW5jZWwgZm9ybVxyXG4gICAqL1xyXG4gIGNhbmNlbEZvcm0oKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlc2V0Rm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR28gYmFjayB0byBwYWdlIGxpc3RcclxuICAgKi9cclxuICBnb0JhY2soKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9jb3JlL3BhZ2UnXSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXNldCBmb3JtXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZXNldEZvcm0oKTogdm9pZCB7XHJcbiAgICBjb25zdCBlbnRpdHlJZCA9IHRoaXMuYXBwU3RhdGUuZ2V0QWN0aXZlRW50aXR5SWQoKTtcclxuXHJcbiAgICB0aGlzLmNvbnRyb2xGb3JtLnJlc2V0KHtcclxuICAgICAgc3lwZV9rZXk6ICcnLFxyXG4gICAgICBzeXBlX2xhYmVsOiAnJyxcclxuICAgICAgc3lwZV9sYWJlbF9oaWRlOiBmYWxzZSxcclxuICAgICAgc3lwZV9hdXRvX2NvbXBsZXRlOiBmYWxzZSxcclxuICAgICAgc3lwZV9oaWRlX2hlbHBlcl9hbmRfZXJyb3JfdGV4dDogZmFsc2UsXHJcbiAgICAgIHN5cGVfdHlwZTogJycsXHJcbiAgICAgIHN5cGVfb3B0aW9uX2tleTogJycsXHJcbiAgICAgIHN5cGVfcGxhY2Vob2xkZXI6ICcnLFxyXG4gICAgICBzeXBlX21pbl9sZW5ndGg6IDAsXHJcbiAgICAgIHN5cGVfbWF4X2xlbmd0aDogMjAsXHJcbiAgICAgIHN5cGVfcmVnZXg6ICcnLFxyXG4gICAgICBzeXBlX3JlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgc3lwZV9kaXNhYmxlZDogZmFsc2UsXHJcbiAgICAgIHN5cGVfd2lkdGg6ICcnLFxyXG4gICAgICBzeXBlX2hlaWdodDogJycsXHJcbiAgICAgIHN5cGVfbGFiZWxfcGxhY2VtZW50OiAnZmxvYXRpbmcnLFxyXG4gICAgICBzeXBlX2hlbHBlcl90ZXh0X2NvbGxhcHNlOiBmYWxzZSxcclxuICAgICAgc3lwZV9kZWZhdWx0OiAnJyBhcyBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuLFxyXG4gICAgICBzeXBlX3Rvb2x0aXA6ICcnLFxyXG4gICAgICBzeXBlX3NpemU6ICdtZCcsXHJcbiAgICAgIHN5cGVfbGVhZGluZ19pY29uOiAnJyxcclxuICAgICAgc3lwZV9pc2FjdGl2ZTogdHJ1ZSxcclxuICAgICAgc3lwZV9lbnRpdHlfaWRfc3llbjogZW50aXR5SWQgfHwgJydcclxuICAgIH0pO1xyXG4gICAgdGhpcy5pc0VkaXRNb2RlLnNldChmYWxzZSk7XHJcbiAgICB0aGlzLmVkaXRpbmdDb250cm9sSWQuc2V0KG51bGwpO1xyXG4gICAgdGhpcy5yZXRyaWV2ZWRDb250cm9sLnNldChudWxsKTtcclxuICAgIHRoaXMuY29udHJvbEZvcm0ubWFya0FzUHJpc3RpbmUoKTtcclxuICAgIHRoaXMuY29udHJvbEZvcm0ubWFya0FzVW50b3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYXJrIGZvcm0gYXMgdG91Y2hlZCB0byB0cmlnZ2VyIHZhbGlkYXRpb24gZGlzcGxheVxyXG4gICAqL1xyXG4gIHByaXZhdGUgbWFya0Zvcm1Bc1RvdWNoZWQoKTogdm9pZCB7XHJcbiAgICBPYmplY3Qua2V5cyh0aGlzLmNvbnRyb2xGb3JtLmNvbnRyb2xzKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmNvbnRyb2xGb3JtLmdldChrZXkpO1xyXG4gICAgICBjb250cm9sPy5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBkcm9wZG93biBpdGVtcyBmb3IgYWN0aW9uc1xyXG4gICAqL1xyXG4gIGdldEFjdGlvbkRyb3Bkb3duSXRlbXMoY29udHJvbDogSUNvcmVTeXBlKTogRHJvcGRvd25JdGVtW10ge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAge1xyXG4gICAgICAgIGlkOiAnZWRpdCcsXHJcbiAgICAgICAgbGFiZWw6ICdFZGl0JyxcclxuICAgICAgICBpY29uOiAnZWRpdCdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGlkOiAndG9nZ2xlJyxcclxuICAgICAgICBsYWJlbDogY29udHJvbC5zeXBlX2lzYWN0aXZlID8gJ0RlYWN0aXZhdGUnIDogJ0FjdGl2YXRlJyxcclxuICAgICAgICBpY29uOiBjb250cm9sLnN5cGVfaXNhY3RpdmUgPyAnYmxvY2snIDogJ2NoZWNrX2NpcmNsZSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGlkOiAnZGVsZXRlJyxcclxuICAgICAgICBsYWJlbDogJ0RlbGV0ZScsXHJcbiAgICAgICAgaWNvbjogJ2RlbGV0ZSdcclxuICAgICAgfVxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBkcm9wZG93biBpdGVtIGNsaWNrXHJcbiAgICovXHJcbiAgb25Ecm9wZG93bkl0ZW1DbGljayhpdGVtOiBEcm9wZG93bkl0ZW0sIGNvbnRyb2w6IElDb3JlU3lwZSk6IHZvaWQge1xyXG4gICAgc3dpdGNoIChpdGVtLmlkKSB7XHJcbiAgICAgIGNhc2UgJ2VkaXQnOlxyXG4gICAgICAgIHRoaXMuZWRpdENvbnRyb2woY29udHJvbCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3RvZ2dsZSc6XHJcbiAgICAgICAgdGhpcy50b2dnbGVDb250cm9sU3RhdHVzKGNvbnRyb2wpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdkZWxldGUnOlxyXG4gICAgICAgIHRoaXMuZGVsZXRlQ29udHJvbChjb250cm9sKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsb3NlIGFsbCBkcm9wZG93bnNcclxuICAgKi9cclxuICBjbG9zZUFsbERyb3Bkb3ducygpOiB2b2lkIHtcclxuICAgIC8vIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNsb3NlIGRyb3Bkb3ducyBpZiBuZWVkZWRcclxuICB9XHJcblxyXG4gIC8vIE5ldyBtZXRob2RzIGZvciB0aGUgdmVydGljYWwgbGF5b3V0XHJcbiAgc2VsZWN0Q29udHJvbChjb250cm9sOiBJQ29yZVN5cGUpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb250cm9sSWQuc2V0KGNvbnRyb2wuX2lkIHx8IG51bGwpO1xyXG4gICAgY29uc29sZS5sb2coJ1NlbGVjdGVkIGNvbnRyb2w6JywgY29udHJvbCk7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5Q29udHJvbElkKGluZGV4OiBudW1iZXIsIGNvbnRyb2w6IElDb3JlU3lwZSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gY29udHJvbC5faWQgfHwgJyc7XHJcbiAgfVxyXG59ICIsIjwhLS0gUGFnZSBDb250cm9scyBDb250YWluZXIgLS0+XG48ZGl2IGNsYXNzPVwicGFnZS1jb250cm9scy1jb250YWluZXJcIj5cbiAgPCEtLSBIZWFkZXIgU2VjdGlvbiAtLT5cbiAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItY29udGVudFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1sZWZ0XCI+XG4gICAgICAgIDxidXR0b24gXG4gICAgICAgICAgY2lkZUVsZUJ1dHRvblxuICAgICAgICAgIHZhcmlhbnQ9XCJnaG9zdFwiXG4gICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAoY2xpY2spPVwiZ29CYWNrKClcIlxuICAgICAgICAgIGNsYXNzPVwiYmFjay1idXR0b25cIj5cbiAgICAgICAgICA8Y2lkZS1lbGUtaWNvbj5hcnJvd19iYWNrPC9jaWRlLWVsZS1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlLXNlY3Rpb25cIj5cbiAgICAgICAgICA8Y2lkZS1lbGUtaWNvbiBjbGFzcz1cInRpdGxlLWljb25cIj5zZXR0aW5nczwvY2lkZS1lbGUtaWNvbj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGgxIGNsYXNzPVwidGl0bGVcIj5Db250cm9sIE1hbmFnZW1lbnQ8L2gxPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJzdWJ0aXRsZVwiPlBhZ2U6IHt7IHBhZ2VUaXRsZSgpIH19PC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEVycm9yIE1lc3NhZ2UgLS0+XG4gIDxkaXYgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCIgKm5nSWY9XCJlcnJvcigpXCI+XG4gICAgPGNpZGUtZWxlLWljb24+ZXJyb3I8L2NpZGUtZWxlLWljb24+XG4gICAgPGRpdj5cbiAgICAgIDxoMz5FcnJvcjwvaDM+XG4gICAgICA8cD57eyBlcnJvcigpIH19PC9wPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIE1haW4gQ29udGVudCBBcmVhIC0tPlxuICA8ZGl2IGNsYXNzPVwibWFpbi1jb250ZW50XCI+XG4gICAgPCEtLSBGb3JtIFNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0taGVhZGVyXCI+XG4gICAgICAgIDxjaWRlLWVsZS1pY29uPnt7IGlzRWRpdE1vZGUoKSA/ICdlZGl0JyA6ICdhZGQnIH19PC9jaWRlLWVsZS1pY29uPlxuICAgICAgICA8aDM+e3sgaXNFZGl0TW9kZSgpID8gJ0VkaXQgQ29udHJvbCcgOiAnUXVpY2sgQWRkIENvbnRyb2wnIH19PC9oMz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEZvcm0gLS0+XG4gICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImNvbnRyb2xGb3JtXCIgKG5nU3VibWl0KT1cInNhdmVDb250cm9sKClcIiBjbGFzcz1cImNvbnRyb2wtZm9ybSB0dy1vdmVyZmxvdy15LWF1dG9cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JpZFwiPlxuICAgICAgICAgIFxuICAgICAgICAgIDwhLS0gQmFzaWMgSW5mb3JtYXRpb24gU2VjdGlvbiAtLT5cbiAgICAgICAgICA8IS0tIENvbnRyb2wgS2V5IC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJzeXBlX2tleVwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5cGVfa2V5XCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBjb250cm9sIGtleVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiQ29udHJvbCBLZXlcIlxuICAgICAgICAgICAgICBzaXplPVwic21cIj5cbiAgICAgICAgICAgIDwvY2lkZS1lbGUtaW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIENvbnRyb2wgTGFiZWwgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dFxuICAgICAgICAgICAgICBpZD1cInN5cGVfbGFiZWxcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeXBlX2xhYmVsXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBjb250cm9sIGxhYmVsXCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJDb250cm9sIExhYmVsXCJcbiAgICAgICAgICAgICAgc2l6ZT1cInNtXCI+XG4gICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBDb250cm9sIFR5cGUgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxjaWRlLWVsZS1zZWxlY3RcbiAgICAgICAgICAgICAgaWQ9XCJzeXBlX3R5cGVcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeXBlX3R5cGVcIlxuICAgICAgICAgICAgICBbb3B0aW9uc109XCJbXG4gICAgICAgICAgICAgICAgeyB2YWx1ZTogJ3RleHQnLCBsYWJlbDogJ1RleHQgSW5wdXQnIH0sXG4gICAgICAgICAgICAgICAgeyB2YWx1ZTogJ3RleHRhcmVhJywgbGFiZWw6ICdUZXh0IEFyZWEnIH0sXG4gICAgICAgICAgICAgICAgeyB2YWx1ZTogJ3NlbGVjdCcsIGxhYmVsOiAnU2VsZWN0JyB9LFxuICAgICAgICAgICAgICAgIHsgdmFsdWU6ICdjaGVja2JveCcsIGxhYmVsOiAnQ2hlY2tib3gnIH0sXG4gICAgICAgICAgICAgICAgeyB2YWx1ZTogJ3JhZGlvJywgbGFiZWw6ICdSYWRpbycgfSxcbiAgICAgICAgICAgICAgICB7IHZhbHVlOiAnZGF0ZScsIGxhYmVsOiAnRGF0ZScgfSxcbiAgICAgICAgICAgICAgICB7IHZhbHVlOiAnbnVtYmVyJywgbGFiZWw6ICdOdW1iZXInIH0sXG4gICAgICAgICAgICAgICAgeyB2YWx1ZTogJ2VtYWlsJywgbGFiZWw6ICdFbWFpbCcgfSxcbiAgICAgICAgICAgICAgICB7IHZhbHVlOiAncGFzc3dvcmQnLCBsYWJlbDogJ1Bhc3N3b3JkJyB9LFxuICAgICAgICAgICAgICAgIHsgdmFsdWU6ICdmaWxlJywgbGFiZWw6ICdGaWxlIFVwbG9hZCcgfVxuICAgICAgICAgICAgICBdXCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJDb250cm9sIFR5cGVcIlxuICAgICAgICAgICAgICBzaXplPVwic21cIj5cbiAgICAgICAgICAgIDwvY2lkZS1lbGUtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBTdGF0dXMgLSBDaGVja2JveCBhbGlnbmVkIHByb3Blcmx5IC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJzeXBlX2lzYWN0aXZlXCJcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3lwZV9pc2FjdGl2ZVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiQWN0aXZlIFN0YXR1c1wiXG4gICAgICAgICAgICAgIHNpemU9XCJzbVwiPlxuICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gUGxhY2Vob2xkZXIgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dFxuICAgICAgICAgICAgICBpZD1cInN5cGVfcGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeXBlX3BsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBwbGFjZWhvbGRlciB0ZXh0XCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJQbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIHNpemU9XCJzbVwiPlxuICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gQXV0byBDb21wbGV0ZSAtIENoZWNrYm94IGFsaWduZWQgcHJvcGVybHkgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dFxuICAgICAgICAgICAgICBpZD1cInN5cGVfYXV0b19jb21wbGV0ZVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5cGVfYXV0b19jb21wbGV0ZVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiQXV0byBDb21wbGV0ZVwiXG4gICAgICAgICAgICAgIHNpemU9XCJzbVwiPlxuICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gVG9vbHRpcCAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0XG4gICAgICAgICAgICAgIGlkPVwic3lwZV90b29sdGlwXCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3lwZV90b29sdGlwXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciB0b29sdGlwIHRleHRcIlxuICAgICAgICAgICAgICBsYWJlbD1cIlRvb2x0aXBcIlxuICAgICAgICAgICAgICBzaXplPVwic21cIj5cbiAgICAgICAgICAgIDwvY2lkZS1lbGUtaW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFZhbGlkYXRpb24gJiBTaXppbmcgU2VjdGlvbiAtLT5cbiAgICAgICAgICA8IS0tIE1pbi9NYXggTGVuZ3RoIC0gU2lkZSBieSBzaWRlIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGZvcm0tZ3JvdXAtcm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cC1oYWxmXCI+XG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dFxuICAgICAgICAgICAgICAgIGlkPVwic3lwZV9taW5fbGVuZ3RoXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeXBlX21pbl9sZW5ndGhcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJNaW4gTGVuZ3RoXCJcbiAgICAgICAgICAgICAgICBzaXplPVwieHNcIj5cbiAgICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAtaGFsZlwiPlxuICAgICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXRcbiAgICAgICAgICAgICAgICBpZD1cInN5cGVfbWF4X2xlbmd0aFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3lwZV9tYXhfbGVuZ3RoXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjIwXCJcbiAgICAgICAgICAgICAgICBsYWJlbD1cIk1heCBMZW5ndGhcIlxuICAgICAgICAgICAgICAgIHNpemU9XCJ4c1wiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFNpemUgJiBMYWJlbCBQbGFjZW1lbnQgLSBTaWRlIGJ5IHNpZGUgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgZm9ybS1ncm91cC1yb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwLWhhbGZcIj5cbiAgICAgICAgICAgICAgPGNpZGUtZWxlLXNlbGVjdFxuICAgICAgICAgICAgICAgIGlkPVwic3lwZV9zaXplXCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeXBlX3NpemVcIlxuICAgICAgICAgICAgICAgIGxhYmVsPVwiU2l6ZVwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInhzXCJcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJbXG4gICAgICAgICAgICAgICAgICB7IHZhbHVlOiAneHMnLCBsYWJlbDogJ1hTJyB9LFxuICAgICAgICAgICAgICAgICAgeyB2YWx1ZTogJ3NtJywgbGFiZWw6ICdTTScgfSxcbiAgICAgICAgICAgICAgICAgIHsgdmFsdWU6ICdtZCcsIGxhYmVsOiAnTUQnIH0sXG4gICAgICAgICAgICAgICAgICB7IHZhbHVlOiAnbGcnLCBsYWJlbDogJ0xHJyB9LFxuICAgICAgICAgICAgICAgICAgeyB2YWx1ZTogJ3hsJywgbGFiZWw6ICdYTCcgfSxcbiAgICAgICAgICAgICAgICAgIHsgdmFsdWU6ICd4eGwnLCBsYWJlbDogJ1hYTCcgfVxuICAgICAgICAgICAgICAgIF1cIj5cbiAgICAgICAgICAgICAgPC9jaWRlLWVsZS1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwLWhhbGZcIj5cbiAgICAgICAgICAgICAgPGNpZGUtZWxlLXNlbGVjdFxuICAgICAgICAgICAgICAgIGlkPVwic3lwZV9sYWJlbF9wbGFjZW1lbnRcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5cGVfbGFiZWxfcGxhY2VtZW50XCJcbiAgICAgICAgICAgICAgICBsYWJlbD1cIkxhYmVsIFBsYWNlbWVudFwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInhzXCJcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJbXG4gICAgICAgICAgICAgICAgICB7IHZhbHVlOiAnbGVmdCcsIGxhYmVsOiAnTGVmdCcgfSxcbiAgICAgICAgICAgICAgICAgIHsgdmFsdWU6ICdmbG9hdGluZycsIGxhYmVsOiAnRmxvYXRpbmcnIH0sXG4gICAgICAgICAgICAgICAgICB7IHZhbHVlOiAnZml4ZWQnLCBsYWJlbDogJ0ZpeGVkJyB9XG4gICAgICAgICAgICAgICAgXVwiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBXaWR0aCAmIEhlaWdodCAtIFNpZGUgYnkgc2lkZSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBmb3JtLWdyb3VwLXJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAtaGFsZlwiPlxuICAgICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXRcbiAgICAgICAgICAgICAgICBpZD1cInN5cGVfd2lkdGhcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeXBlX3dpZHRoXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjIwcHhcIlxuICAgICAgICAgICAgICAgIGxhYmVsPVwiV2lkdGhcIlxuICAgICAgICAgICAgICAgIHNpemU9XCJ4c1wiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cC1oYWxmXCI+XG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dFxuICAgICAgICAgICAgICAgIGlkPVwic3lwZV9oZWlnaHRcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeXBlX2hlaWdodFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIyMHB4XCJcbiAgICAgICAgICAgICAgICBsYWJlbD1cIkhlaWdodFwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInhzXCI+XG4gICAgICAgICAgICAgIDwvY2lkZS1lbGUtaW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gTGVhZGluZyBJY29uIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJzeXBlX2xlYWRpbmdfaWNvblwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5cGVfbGVhZGluZ19pY29uXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBpY29uIG5hbWVcIlxuICAgICAgICAgICAgICBsYWJlbD1cIkxlYWRpbmcgSWNvblwiXG4gICAgICAgICAgICAgIHNpemU9XCJzbVwiPlxuICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gRGVmYXVsdCBWYWx1ZSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0XG4gICAgICAgICAgICAgIGlkPVwic3lwZV9kZWZhdWx0XCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3lwZV9kZWZhdWx0XCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBkZWZhdWx0IHZhbHVlXCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJEZWZhdWx0IFZhbHVlXCJcbiAgICAgICAgICAgICAgc2l6ZT1cInNtXCI+XG4gICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBSZWdleCBQYXR0ZXJuIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJzeXBlX3JlZ2V4XCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3lwZV9yZWdleFwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgcmVnZXggcGF0dGVyblwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiUmVnZXggUGF0dGVyblwiXG4gICAgICAgICAgICAgIHNpemU9XCJzbVwiPlxuICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gT3B0aW9uIEtleSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0XG4gICAgICAgICAgICAgIGlkPVwic3lwZV9vcHRpb25fa2V5XCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3lwZV9vcHRpb25fa2V5XCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBvcHRpb24ga2V5XCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJPcHRpb24gS2V5XCJcbiAgICAgICAgICAgICAgc2l6ZT1cInNtXCI+XG4gICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBFbnRpdHkgSUQgKEF1dG8tYXNzaWduZWQgZnJvbSBBcHBTdGF0ZSkgLSBIaWRkZW4gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXRcbiAgICAgICAgICAgICAgaWQ9XCJzeXBlX2VudGl0eV9pZF9zeWVuXCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3lwZV9lbnRpdHlfaWRfc3llblwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQXV0by1hc3NpZ25lZCBmcm9tIHN5c3RlbVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiRW50aXR5IElEIChBdXRvLWFzc2lnbmVkKVwiXG4gICAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgIHJlYWRvbmx5PlxuICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gQ29udHJvbCBPcHRpb25zIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgIDxoNiBjbGFzcz1cIm9wdGlvbnMtdGl0bGVcIj5Db250cm9sIE9wdGlvbnM8L2g2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbnMtZ3JpZFwiPlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPCEtLSBSZXF1aXJlZCAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbi1pdGVtXCI+XG4gICAgICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0XG4gICAgICAgICAgICAgICAgICBpZD1cInN5cGVfcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5cGVfcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgbGFiZWw9XCJSZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICBzaXplPVwieHNcIj5cbiAgICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIERpc2FibGVkIC0tPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXRcbiAgICAgICAgICAgICAgICAgIGlkPVwic3lwZV9kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3lwZV9kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICBsYWJlbD1cIkRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgIHNpemU9XCJ4c1wiPlxuICAgICAgICAgICAgICAgIDwvY2lkZS1lbGUtaW5wdXQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwhLS0gSGlkZSBMYWJlbCAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbi1pdGVtXCI+XG4gICAgICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0XG4gICAgICAgICAgICAgICAgICBpZD1cInN5cGVfbGFiZWxfaGlkZVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3lwZV9sYWJlbF9oaWRlXCJcbiAgICAgICAgICAgICAgICAgIGxhYmVsPVwiSGlkZSBMYWJlbFwiXG4gICAgICAgICAgICAgICAgICBzaXplPVwieHNcIj5cbiAgICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIEhpZGUgSGVscGVyIFRleHQgLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvcHRpb24taXRlbVwiPlxuICAgICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dFxuICAgICAgICAgICAgICAgICAgaWQ9XCJzeXBlX2hpZGVfaGVscGVyX2FuZF9lcnJvcl90ZXh0XCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeXBlX2hpZGVfaGVscGVyX2FuZF9lcnJvcl90ZXh0XCJcbiAgICAgICAgICAgICAgICAgIGxhYmVsPVwiSGlkZSBIZWxwZXIgVGV4dFwiXG4gICAgICAgICAgICAgICAgICBzaXplPVwieHNcIj5cbiAgICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIEhlbHBlciBUZXh0IENvbGxhcHNlIC0tPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXRcbiAgICAgICAgICAgICAgICAgIGlkPVwic3lwZV9oZWxwZXJfdGV4dF9jb2xsYXBzZVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3lwZV9oZWxwZXJfdGV4dF9jb2xsYXBzZVwiXG4gICAgICAgICAgICAgICAgICBsYWJlbD1cIkNvbGxhcHNlIEhlbHBlclwiXG4gICAgICAgICAgICAgICAgICBzaXplPVwieHNcIj5cbiAgICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBGb3JtIEFjdGlvbnMgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWFjdGlvbnNcIj5cbiAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgY2lkZUVsZUJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsRm9ybSgpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nKClcIj5cbiAgICAgICAgICAgIENhbmNlbFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICBjaWRlRWxlQnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgIHZhcmlhbnQ9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nKClcIj5cbiAgICAgICAgICAgIHt7IGlzRWRpdE1vZGUoKSA/ICdVcGRhdGUgQ29udHJvbCcgOiAnQ3JlYXRlIENvbnRyb2wnIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9mb3JtPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBDb250cm9scyBMaXN0IFNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRyb2xzLWxpc3Qtc2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xzLWhlYWRlclwiPlxuICAgICAgICA8aDM+UGFnZSBDb250cm9sczwvaDM+XG4gICAgICAgIDxwPkNvbnRyb2xzIGNvbm5lY3RlZCB0byB0aGlzIHBhZ2U8L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9scy1saXN0XCIgKm5nSWY9XCIhbG9hZGluZygpICYmIGNvbnRyb2xzKCkubGVuZ3RoID4gMFwiPlxuICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgY2xhc3M9XCJjb250cm9sLWl0ZW1cIiBcbiAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbnRyb2wgb2YgY29udHJvbHMoKTsgdHJhY2tCeTogdHJhY2tCeUNvbnRyb2xJZFwiXG4gICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJzZWxlY3RlZENvbnRyb2xJZCgpID09PSBjb250cm9sLl9pZFwiXG4gICAgICAgICAgIChjbGljayk9XCJzZWxlY3RDb250cm9sKGNvbnRyb2wpXCJcbiAgICAgICAgICAgKGtleXVwLmVudGVyKT1cInNlbGVjdENvbnRyb2woY29udHJvbClcIlxuICAgICAgICAgICAoa2V5dXAuc3BhY2UpPVwic2VsZWN0Q29udHJvbChjb250cm9sKVwiXG4gICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidTZWxlY3QgY29udHJvbCAnICsgKGNvbnRyb2wuc3lwZV9sYWJlbCB8fCBjb250cm9sLnN5cGVfa2V5KVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sLWhlYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2wtaWNvblwiPlxuICAgICAgICAgICAgICA8Y2lkZS1lbGUtaWNvbj5zZXR0aW5nc19pbnB1dF9jb21wb25lbnQ8L2NpZGUtZWxlLWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sLWluZm9cIj5cbiAgICAgICAgICAgICAgPGg0Pnt7IGNvbnRyb2wuc3lwZV9sYWJlbCB8fCBjb250cm9sLnN5cGVfa2V5IH19PC9oND5cbiAgICAgICAgICAgICAgPHA+e3sgY29udHJvbC5zeXBlX3Rvb2x0aXAgfHwgJ05vIHRvb2x0aXAnIH19PC9wPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbC1tZXRhXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb250cm9sLXR5cGVcIj57eyBjb250cm9sLnN5cGVfdHlwZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbnRyb2wtc3RhdHVzXCIgW2NsYXNzLmFjdGl2ZV09XCJjb250cm9sLnN5cGVfaXNhY3RpdmVcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGNvbnRyb2wuc3lwZV9pc2FjdGl2ZSA/ICdBY3RpdmUnIDogJ0luYWN0aXZlJyB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgICBjaWRlRWxlQnV0dG9uXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0Q29udHJvbChjb250cm9sKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgPGNpZGUtZWxlLWljb24+ZWRpdDwvY2lkZS1lbGUtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgICAgY2lkZUVsZUJ1dHRvblxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJnaG9zdFwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlQ29udHJvbChjb250cm9sKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgPGNpZGUtZWxlLWljb24+ZGVsZXRlPC9jaWRlLWVsZS1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIFxuICAgICAgICAgIFxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbHMtbGlzdC1lbXB0eVwiICpuZ0lmPVwiIWxvYWRpbmcoKSAmJiBjb250cm9scygpLmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICA8Y2lkZS1lbGUtaWNvbj5zZXR0aW5nc19pbnB1dF9jb21wb25lbnQ8L2NpZGUtZWxlLWljb24+XG4gICAgICAgIDxwPk5vIGNvbnRyb2xzIGF2YWlsYWJsZTwvcD5cbiAgICAgICAgPHNtYWxsPkNyZWF0ZSBjb250cm9scyB1c2luZyB0aGUgZm9ybSBvbiB0aGUgbGVmdDwvc21hbGw+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xzLWxpc3QtbG9hZGluZ1wiICpuZ0lmPVwibG9hZGluZygpXCI+XG4gICAgICAgIDxjaWRlLWVsZS1pY29uIGNsYXNzPVwic3Bpbm5pbmdcIj5yZWZyZXNoPC9jaWRlLWVsZS1pY29uPlxuICAgICAgICA8cD5Mb2FkaW5nIGNvbnRyb2xzLi4uPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbiAiXX0=
|