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.
Files changed (73) hide show
  1. package/README.md +49 -10
  2. package/fesm2022/{cloud-ide-core-general-master-type.component-B26auJZw.mjs → cloud-ide-core-general-master-type.component-BNYoP_bS.mjs} +132 -134
  3. 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
  4. package/fesm2022/{cloud-ide-core-general-master-type.service-Ab64Jjps.mjs → cloud-ide-core-general-master-type.service-8JWTVijZ.mjs} +7 -7
  5. package/fesm2022/{cloud-ide-core-general-master-type.service-Ab64Jjps.mjs.map → cloud-ide-core-general-master-type.service-8JWTVijZ.mjs.map} +1 -1
  6. package/fesm2022/{cloud-ide-core-general-master.component-B6llTVoV.mjs → cloud-ide-core-general-master.component-CFGGHinl.mjs} +152 -154
  7. package/fesm2022/{cloud-ide-core-general-master.component-B6llTVoV.mjs.map → cloud-ide-core-general-master.component-CFGGHinl.mjs.map} +1 -1
  8. package/fesm2022/{cloud-ide-core-page-form.component-CaEca3mB.mjs → cloud-ide-core-page-form.component-vfE-LkTS.mjs} +25 -25
  9. package/fesm2022/{cloud-ide-core-page-form.component-CaEca3mB.mjs.map → cloud-ide-core-page-form.component-vfE-LkTS.mjs.map} +1 -1
  10. package/fesm2022/cloud-ide-core.mjs +1113 -1110
  11. package/fesm2022/cloud-ide-core.mjs.map +1 -1
  12. package/index.d.ts +1736 -3
  13. package/package.json +3 -5
  14. package/esm2022/cloud-ide-core.mjs +0 -5
  15. package/esm2022/lib/cloud-ide-core.component.mjs +0 -19
  16. package/esm2022/lib/cloud-ide-core.routes.mjs +0 -137
  17. package/esm2022/lib/cloud-ide-core.service.mjs +0 -14
  18. package/esm2022/lib/core/department-management/components/department-list/department-list.component.mjs +0 -768
  19. package/esm2022/lib/core/department-management/index.mjs +0 -5
  20. package/esm2022/lib/core/department-management/services/department-management.service.mjs +0 -187
  21. package/esm2022/lib/core/designation-management/components/designation-list/designation-list.component.mjs +0 -1122
  22. package/esm2022/lib/core/designation-management/index.mjs +0 -5
  23. package/esm2022/lib/core/designation-management/services/designation-management.service.mjs +0 -194
  24. package/esm2022/lib/core/general-master-management/components/general-master/general-master.component.mjs +0 -738
  25. package/esm2022/lib/core/general-master-management/components/general-master-type/general-master-type.component.mjs +0 -608
  26. package/esm2022/lib/core/general-master-management/services/general-master-type.service.mjs +0 -203
  27. package/esm2022/lib/core/general-master-management/services/general-master.service.mjs +0 -166
  28. package/esm2022/lib/core/grade-level-management/components/grade-level-list/grade-level-list.component.mjs +0 -794
  29. package/esm2022/lib/core/grade-level-management/index.mjs +0 -5
  30. package/esm2022/lib/core/grade-level-management/services/grade-level-management.service.mjs +0 -172
  31. package/esm2022/lib/core/menu-management/components/menu-list/menu-list.component.mjs +0 -1135
  32. package/esm2022/lib/core/menu-management/index.mjs +0 -10
  33. package/esm2022/lib/core/menu-management/interfaces/menu-item.interface.mjs +0 -11
  34. package/esm2022/lib/core/menu-management/mock-data/menu-items.json +0 -311
  35. package/esm2022/lib/core/menu-management/services/menu-management.service.mjs +0 -230
  36. package/esm2022/lib/core/page-management/components/page-controls/page-controls.component.mjs +0 -483
  37. package/esm2022/lib/core/page-management/components/page-form/page-form.component.mjs +0 -212
  38. package/esm2022/lib/core/page-management/components/page-list/page-list.component.mjs +0 -393
  39. package/esm2022/lib/core/page-management/components/page-theme/page-theme.component.mjs +0 -767
  40. package/esm2022/lib/core/page-management/index.mjs +0 -10
  41. package/esm2022/lib/core/page-management/services/page-controls.service.mjs +0 -136
  42. package/esm2022/lib/core/page-management/services/page-management.service.mjs +0 -98
  43. package/esm2022/lib/core/page-management/services/page-theme.service.mjs +0 -107
  44. package/esm2022/public-api.mjs +0 -17
  45. package/lib/cloud-ide-core.component.d.ts +0 -5
  46. package/lib/cloud-ide-core.routes.d.ts +0 -2
  47. package/lib/cloud-ide-core.service.d.ts +0 -6
  48. package/lib/core/department-management/components/department-list/department-list.component.d.ts +0 -178
  49. package/lib/core/department-management/index.d.ts +0 -2
  50. package/lib/core/department-management/services/department-management.service.d.ts +0 -68
  51. package/lib/core/designation-management/components/designation-list/designation-list.component.d.ts +0 -242
  52. package/lib/core/designation-management/index.d.ts +0 -2
  53. package/lib/core/designation-management/services/designation-management.service.d.ts +0 -69
  54. package/lib/core/general-master-management/components/general-master/general-master.component.d.ts +0 -167
  55. package/lib/core/general-master-management/components/general-master-type/general-master-type.component.d.ts +0 -129
  56. package/lib/core/general-master-management/services/general-master-type.service.d.ts +0 -75
  57. package/lib/core/general-master-management/services/general-master.service.d.ts +0 -62
  58. package/lib/core/grade-level-management/components/grade-level-list/grade-level-list.component.d.ts +0 -199
  59. package/lib/core/grade-level-management/index.d.ts +0 -2
  60. package/lib/core/grade-level-management/services/grade-level-management.service.d.ts +0 -69
  61. package/lib/core/menu-management/components/menu-list/menu-list.component.d.ts +0 -278
  62. package/lib/core/menu-management/index.d.ts +0 -3
  63. package/lib/core/menu-management/interfaces/menu-item.interface.d.ts +0 -30
  64. package/lib/core/menu-management/services/menu-management.service.d.ts +0 -85
  65. package/lib/core/page-management/components/page-controls/page-controls.component.d.ts +0 -126
  66. package/lib/core/page-management/components/page-form/page-form.component.d.ts +0 -35
  67. package/lib/core/page-management/components/page-list/page-list.component.d.ts +0 -91
  68. package/lib/core/page-management/components/page-theme/page-theme.component.d.ts +0 -189
  69. package/lib/core/page-management/index.d.ts +0 -6
  70. package/lib/core/page-management/services/page-controls.service.d.ts +0 -54
  71. package/lib/core/page-management/services/page-management.service.d.ts +0 -42
  72. package/lib/core/page-management/services/page-theme.service.d.ts +0 -43
  73. package/public-api.d.ts +0 -8
@@ -1,212 +0,0 @@
1
- import { Component, signal, computed, inject, DestroyRef } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { Validators, ReactiveFormsModule, NonNullableFormBuilder, FormsModule } from '@angular/forms';
4
- import { ActivatedRoute, Router } from '@angular/router';
5
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
- import { PageManagementService } from '../../services/page-management.service';
7
- import { AppStateHelperService } from 'cloud-ide-layout';
8
- import { CideEleButtonComponent, CideInputComponent, CideSelectComponent, CideTextareaComponent, CideIconComponent, CideEleFileInputComponent, CideEleJsonEditorComponent } 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/forms";
12
- export class PageFormComponent {
13
- constructor() {
14
- this.destroyRef = inject(DestroyRef);
15
- this.pageService = inject(PageManagementService);
16
- this.appState = inject(AppStateHelperService);
17
- this.fb = inject(NonNullableFormBuilder);
18
- this.router = inject(Router);
19
- this.route = inject(ActivatedRoute);
20
- this.loading = signal(false);
21
- this.error = signal(null);
22
- this.success = signal(null);
23
- // Page information
24
- this.pageId = signal(null);
25
- this.isEditMode = signal(false);
26
- this.pageForm = this.fb.group({
27
- sypg_title: ['', [Validators.required, Validators.maxLength(100)]],
28
- sypg_desc: ['', [Validators.maxLength(255)]],
29
- sypg_page_code: ['', [Validators.required, Validators.maxLength(40), Validators.pattern(/^[a-zA-Z0-9_]+$/)]],
30
- sypg_configuration: ['{}', [Validators.required]],
31
- sypg_isactive: [true]
32
- });
33
- // Computed values
34
- this.isFormDirty = computed(() => this.pageForm.dirty);
35
- this.setupFormSubscriptions();
36
- }
37
- ngOnInit() {
38
- // Check for page ID in query parameters
39
- this.checkForPageId();
40
- }
41
- // Check for page ID in query parameters
42
- checkForPageId() {
43
- console.log('🔍 Checking for page ID in query parameters', this.route.params);
44
- this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {
45
- console.log('🔍 Query params:', params);
46
- // Check for pageId, id, or page parameter
47
- const queryParams = params['query'];
48
- const queryData = generateObjectFromString(queryParams);
49
- // If pageId is an object string (from generateStringFromObject), try to parse it
50
- const pageId = queryData.sypg_id;
51
- if (pageId) {
52
- console.log('🔍 Page ID found in query params:', pageId);
53
- this.pageId.set(pageId);
54
- this.isEditMode.set(true);
55
- this.loadPageData(pageId);
56
- }
57
- else {
58
- console.log('🆕 No page ID found - creating new page');
59
- this.isEditMode.set(false);
60
- this.pageId.set(null);
61
- }
62
- });
63
- }
64
- // Load page data for editing
65
- loadPageData(pageId) {
66
- this.loading.set(true);
67
- this.error.set(null);
68
- console.log('📥 Loading page data for ID:', pageId);
69
- this.pageService.getPageById(pageId).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({
70
- next: (response) => {
71
- console.log('✅ Page data loaded:', response);
72
- if (response?.success && response?.data) {
73
- const pageData = response.data;
74
- if (pageData) {
75
- this.populateFormWithPageData(pageData);
76
- this.success.set('Page data loaded successfully');
77
- }
78
- else {
79
- this.error.set('Page data not found');
80
- console.error('❌ Page data not found in response:', response);
81
- }
82
- }
83
- else {
84
- this.error.set('Failed to load page data');
85
- console.error('❌ Page data response invalid:', response);
86
- }
87
- this.loading.set(false);
88
- },
89
- error: (err) => {
90
- console.error('❌ Failed to load page data:', err);
91
- let errorMessage = 'Failed to load page data.';
92
- if (err?.error?.message) {
93
- errorMessage = err.error.message;
94
- }
95
- else if (err?.message) {
96
- errorMessage = err.message;
97
- }
98
- else if (err?.status === 404) {
99
- errorMessage = 'Page not found.';
100
- }
101
- else if (err?.status === 500) {
102
- errorMessage = 'Server error. Please try again later.';
103
- }
104
- this.error.set(errorMessage);
105
- this.loading.set(false);
106
- }
107
- });
108
- }
109
- // Populate form with page data
110
- populateFormWithPageData(pageData) {
111
- try {
112
- console.log('📝 Populating form with page data:', pageData);
113
- const formData = {
114
- sypg_title: pageData.sypg_title || '',
115
- sypg_desc: pageData.sypg_desc || '',
116
- sypg_page_code: pageData.sypg_page_code || '',
117
- sypg_configuration: pageData.sypg_configuration ? JSON.stringify(pageData.sypg_configuration) : '{}',
118
- sypg_isactive: pageData.sypg_isactive !== undefined ? pageData.sypg_isactive : true
119
- };
120
- // Patch the form with the page data
121
- this.pageForm.patchValue(formData, { emitEvent: false });
122
- console.log('✅ Form populated successfully');
123
- }
124
- catch (error) {
125
- console.error('💥 Error populating form with page data:', error);
126
- this.error.set('Error loading page data into form');
127
- }
128
- }
129
- setupFormSubscriptions() {
130
- // Watch for form changes to enable/disable save button
131
- this.pageForm.valueChanges
132
- .pipe(takeUntilDestroyed(this.destroyRef))
133
- .subscribe(() => {
134
- // Form validation is handled by computed signals
135
- });
136
- }
137
- // Form submission
138
- savePage() {
139
- if (!this.pageForm.valid) {
140
- this.markFormAsTouched();
141
- return;
142
- }
143
- const formValue = this.pageForm.getRawValue();
144
- const pageData = {
145
- _id: this.pageId() || '',
146
- sypg_title: formValue.sypg_title,
147
- sypg_desc: formValue.sypg_desc,
148
- sypg_page_code: formValue.sypg_page_code,
149
- sypg_configuration: formValue.sypg_configuration,
150
- sypg_isactive: formValue.sypg_isactive
151
- };
152
- this.loading.set(true);
153
- this.error.set(null);
154
- this.pageService.createOrUpdatePage(pageData)
155
- .pipe(takeUntilDestroyed(this.destroyRef))
156
- .subscribe({
157
- next: (response) => {
158
- if (response.success) {
159
- this.success.set(this.isEditMode() ? 'Page updated successfully' : 'Page created successfully');
160
- console.log('✅ Page saved successfully');
161
- // Navigate back to page list after a short delay
162
- setTimeout(() => {
163
- this.router.navigate(['/control-panel/page']);
164
- }, 1500);
165
- }
166
- else {
167
- this.error.set(response.message || 'Failed to save page');
168
- console.error('❌ Failed to save page:', response.message);
169
- }
170
- this.loading.set(false);
171
- },
172
- error: (error) => {
173
- console.error('❌ Error saving page:', error);
174
- this.error.set('Failed to save page. Please try again.');
175
- this.loading.set(false);
176
- }
177
- });
178
- }
179
- // Cancel form
180
- cancelForm() {
181
- this.router.navigate(['/control-panel/page']);
182
- }
183
- // Go back to page list
184
- goBack() {
185
- this.router.navigate(['/control-panel/page']);
186
- }
187
- // Mark form as touched to trigger validation display
188
- markFormAsTouched() {
189
- Object.keys(this.pageForm.controls).forEach(key => {
190
- const control = this.pageForm.get(key);
191
- control?.markAsTouched();
192
- });
193
- }
194
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: PageFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
195
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: PageFormComponent, isStandalone: true, selector: "cide-core-page-form", ngImport: i0, template: "<div class=\"page-form-fullscreen\">\n <div class=\"page-form-container\">\n <form class=\"page-form\" [formGroup]=\"pageForm\" [class.loading]=\"loading()\" (ngSubmit)=\"savePage()\">\n \n <!-- Header Section -->\n <div class=\"form-header\">\n <h2 class=\"form-title\">{{ isEditMode() ? 'Edit Page' : 'Create Page' }}</h2>\n <p class=\"form-subtitle\">\n {{ isEditMode() ? 'Update page information and configuration' : 'Create a new page with configuration' }}\n </p>\n </div>\n\n <!-- Success and Error Messages -->\n @if (success()) {\n <div class=\"alert alert-success\">\n <svg class=\"alert-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\"></path>\n </svg>\n {{ success() }}\n </div>\n }\n @if (error()) {\n <div class=\"alert alert-error\">\n <svg class=\"alert-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"></path>\n </svg>\n {{ error() }}\n </div>\n }\n\n <!-- Form Content -->\n <div class=\"form-section\">\n <div class=\"grid grid-2 gap-md lg-grid-2 md-grid-1\">\n <cide-ele-input \n id=\"sypg_title\"\n label=\"Page Title *\" \n formControlName=\"sypg_title\"\n placeholder=\"Enter page title\"\n size=\"md\">\n </cide-ele-input>\n \n <cide-ele-input \n id=\"sypg_page_code\"\n label=\"Page Code *\" \n formControlName=\"sypg_page_code\"\n placeholder=\"Enter page code (alphanumeric and underscore only)\"\n size=\"md\">\n </cide-ele-input>\n </div>\n\n <div class=\"grid grid-1 gap-md\">\n <cide-ele-textarea \n id=\"sypg_desc\"\n label=\"Page Description\" \n formControlName=\"sypg_desc\"\n placeholder=\"Enter page description\"\n [rows]=\"3\"\n size=\"md\">\n </cide-ele-textarea>\n </div>\n\n <div class=\"grid grid-1 gap-md\">\n <cide-ele-json-editor\n id=\"sypg_configuration\"\n label=\"Configuration JSON *\"\n formControlName=\"sypg_configuration\"\n placeholder='{\"key\": \"value\"}'>\n </cide-ele-json-editor>\n </div>\n\n <div class=\"grid grid-1 gap-sm\">\n <cide-ele-input\n id=\"sypg_isactive\"\n type=\"checkbox\"\n formControlName=\"sypg_isactive\"\n label=\"Active Status\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n </div>\n\n <!-- Form Actions -->\n <div class=\"form-actions\">\n <button cideEleButton\n type=\"button\" \n variant=\"secondary\" \n (click)=\"cancelForm()\" \n leftIcon=\"close\"\n [disabled]=\"loading()\">\n Cancel\n </button>\n \n <button cideEleButton\n type=\"submit\" \n variant=\"primary\" \n [disabled]=\"loading() || !pageForm.valid\"\n [loading]=\"loading()\"\n leftIcon=\"save\">\n {{ isEditMode() ? 'Update Page' : 'Create Page' }}\n </button>\n </div>\n </form>\n </div>\n</div>\n", styles: [".page-form-container{background:transparent;padding:1rem;width:100%;box-sizing:border-box}.page-form{max-width:1200px;margin:0 auto;background:transparent;border:none;box-shadow:none;width:100%}.page-form.loading{opacity:.6;pointer-events:none}.form-header{background:transparent;color:#1f2937;padding:1.25rem 0;text-align:left}.form-header .form-title{font-size:1.5rem;font-weight:700;margin:0 0 .25rem;color:#1f2937}.form-header .form-subtitle{font-size:.95rem;opacity:.7;margin:0;font-weight:400;color:#6b7280}.form-section{padding:1.25rem 0;border-bottom:none;margin-bottom:1.5rem}.form-section:last-of-type{margin-bottom:0}.grid{display:grid;gap:1rem;margin-bottom:.75rem;transition:all .3s ease}.grid:last-child{margin-bottom:0}.grid.grid-1{grid-template-columns:1fr}.grid.grid-2{grid-template-columns:repeat(2,1fr)}.grid.grid-3{grid-template-columns:repeat(3,1fr)}.grid.grid-4{grid-template-columns:repeat(4,1fr)}.grid.gap-sm{gap:.5rem}.grid.gap-md{gap:1rem}.grid.gap-lg{gap:1.5rem}.grid.gap-xl{gap:2rem}@media (max-width: 1199px) and (min-width: 992px){.grid.lg-grid-1{grid-template-columns:1fr}.grid.lg-grid-2{grid-template-columns:repeat(2,1fr)}.grid.lg-grid-3{grid-template-columns:repeat(3,1fr)}}@media (max-width: 991px) and (min-width: 768px){.grid.md-grid-1{grid-template-columns:1fr}.grid.md-grid-2{grid-template-columns:repeat(2,1fr)}.grid.md-grid-3{grid-template-columns:repeat(3,1fr)}}@media (max-width: 1024px){.grid.grid-4:not([class*=lg-grid]):not([class*=md-grid]){grid-template-columns:repeat(2,1fr)}}@media (max-width: 768px){.grid{gap:.75rem}.grid.grid-2:not([class*=sm-grid]):not([class*=xs-grid]),.grid.grid-3:not([class*=sm-grid]):not([class*=xs-grid]),.grid.grid-4:not([class*=sm-grid]):not([class*=xs-grid]){grid-template-columns:1fr}.grid.gap-lg{gap:1rem}.grid.gap-xl{gap:1.25rem}}@media (max-width: 480px){.grid{gap:.5rem}.grid:not([class*=xs-grid]){grid-template-columns:1fr!important}.grid.gap-md{gap:.75rem}.grid.gap-lg,.grid.gap-xl{gap:1rem}}.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}.alert{display:flex;align-items:center;gap:.5rem;padding:.75rem 0;margin:1rem 0;border-radius:0;font-weight:500;font-size:.875rem;border-left:3px solid}.alert .alert-icon{width:1rem;height:1rem;flex-shrink:0}.alert.alert-success{background:#dcfce74d;border-left-color:#22c55e;color:#166534}.alert.alert-error{background:#fef2f24d;border-left-color:#ef4444;color:#dc2626}.form-actions{display:flex;justify-content:flex-end;gap:.75rem;padding:1rem 0;background:#fff;border-top:1px solid #e5e7eb;margin-top:2rem;position:sticky;bottom:0}@media (max-width: 640px){.form-actions{flex-direction:column-reverse}}cide-ele-input,cide-ele-select,cide-ele-textarea,cide-ele-json-editor{transition:all .2s ease}@media (max-width: 768px){.page-form-container{padding:.75rem}.form-header{padding:1rem 0}.form-header .form-title{font-size:1.25rem}.form-header .form-subtitle{font-size:.875rem}.form-section{padding:1rem 0}.form-actions{padding:1rem 0;margin-top:1.5rem}}@media (max-width: 480px){.page-form-container{padding:.25rem}.form-header,.form-section{padding:.75rem 0}.form-actions{padding:.75rem 0;margin-top:1rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "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: CideTextareaComponent, selector: "cide-ele-textarea", inputs: ["label", "labelHide", "placeholder", "helperText", "errorText", "required", "disabled", "minlength", "maxlength", "rows", "id", "ngModel", "size", "fill", "labelPlacement", "labelDir", "leadingIcon", "trailingIcon", "clearInput"], outputs: ["ngModelChange"] }, { kind: "component", type: CideEleJsonEditorComponent, selector: "cide-ele-json-editor", inputs: ["label", "helperText", "required", "disabled", "showCharacterCount", "config"], outputs: ["valueChange", "objectChange", "errorsChange", "validChange"] }] }); }
196
- }
197
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: PageFormComponent, decorators: [{
198
- type: Component,
199
- args: [{ selector: 'cide-core-page-form', standalone: true, imports: [
200
- CommonModule,
201
- ReactiveFormsModule,
202
- FormsModule,
203
- CideEleButtonComponent,
204
- CideInputComponent,
205
- CideSelectComponent,
206
- CideTextareaComponent,
207
- CideIconComponent,
208
- CideEleFileInputComponent,
209
- CideEleJsonEditorComponent
210
- ], template: "<div class=\"page-form-fullscreen\">\n <div class=\"page-form-container\">\n <form class=\"page-form\" [formGroup]=\"pageForm\" [class.loading]=\"loading()\" (ngSubmit)=\"savePage()\">\n \n <!-- Header Section -->\n <div class=\"form-header\">\n <h2 class=\"form-title\">{{ isEditMode() ? 'Edit Page' : 'Create Page' }}</h2>\n <p class=\"form-subtitle\">\n {{ isEditMode() ? 'Update page information and configuration' : 'Create a new page with configuration' }}\n </p>\n </div>\n\n <!-- Success and Error Messages -->\n @if (success()) {\n <div class=\"alert alert-success\">\n <svg class=\"alert-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\"></path>\n </svg>\n {{ success() }}\n </div>\n }\n @if (error()) {\n <div class=\"alert alert-error\">\n <svg class=\"alert-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"></path>\n </svg>\n {{ error() }}\n </div>\n }\n\n <!-- Form Content -->\n <div class=\"form-section\">\n <div class=\"grid grid-2 gap-md lg-grid-2 md-grid-1\">\n <cide-ele-input \n id=\"sypg_title\"\n label=\"Page Title *\" \n formControlName=\"sypg_title\"\n placeholder=\"Enter page title\"\n size=\"md\">\n </cide-ele-input>\n \n <cide-ele-input \n id=\"sypg_page_code\"\n label=\"Page Code *\" \n formControlName=\"sypg_page_code\"\n placeholder=\"Enter page code (alphanumeric and underscore only)\"\n size=\"md\">\n </cide-ele-input>\n </div>\n\n <div class=\"grid grid-1 gap-md\">\n <cide-ele-textarea \n id=\"sypg_desc\"\n label=\"Page Description\" \n formControlName=\"sypg_desc\"\n placeholder=\"Enter page description\"\n [rows]=\"3\"\n size=\"md\">\n </cide-ele-textarea>\n </div>\n\n <div class=\"grid grid-1 gap-md\">\n <cide-ele-json-editor\n id=\"sypg_configuration\"\n label=\"Configuration JSON *\"\n formControlName=\"sypg_configuration\"\n placeholder='{\"key\": \"value\"}'>\n </cide-ele-json-editor>\n </div>\n\n <div class=\"grid grid-1 gap-sm\">\n <cide-ele-input\n id=\"sypg_isactive\"\n type=\"checkbox\"\n formControlName=\"sypg_isactive\"\n label=\"Active Status\"\n size=\"sm\">\n </cide-ele-input>\n </div>\n </div>\n\n <!-- Form Actions -->\n <div class=\"form-actions\">\n <button cideEleButton\n type=\"button\" \n variant=\"secondary\" \n (click)=\"cancelForm()\" \n leftIcon=\"close\"\n [disabled]=\"loading()\">\n Cancel\n </button>\n \n <button cideEleButton\n type=\"submit\" \n variant=\"primary\" \n [disabled]=\"loading() || !pageForm.valid\"\n [loading]=\"loading()\"\n leftIcon=\"save\">\n {{ isEditMode() ? 'Update Page' : 'Create Page' }}\n </button>\n </div>\n </form>\n </div>\n</div>\n", styles: [".page-form-container{background:transparent;padding:1rem;width:100%;box-sizing:border-box}.page-form{max-width:1200px;margin:0 auto;background:transparent;border:none;box-shadow:none;width:100%}.page-form.loading{opacity:.6;pointer-events:none}.form-header{background:transparent;color:#1f2937;padding:1.25rem 0;text-align:left}.form-header .form-title{font-size:1.5rem;font-weight:700;margin:0 0 .25rem;color:#1f2937}.form-header .form-subtitle{font-size:.95rem;opacity:.7;margin:0;font-weight:400;color:#6b7280}.form-section{padding:1.25rem 0;border-bottom:none;margin-bottom:1.5rem}.form-section:last-of-type{margin-bottom:0}.grid{display:grid;gap:1rem;margin-bottom:.75rem;transition:all .3s ease}.grid:last-child{margin-bottom:0}.grid.grid-1{grid-template-columns:1fr}.grid.grid-2{grid-template-columns:repeat(2,1fr)}.grid.grid-3{grid-template-columns:repeat(3,1fr)}.grid.grid-4{grid-template-columns:repeat(4,1fr)}.grid.gap-sm{gap:.5rem}.grid.gap-md{gap:1rem}.grid.gap-lg{gap:1.5rem}.grid.gap-xl{gap:2rem}@media (max-width: 1199px) and (min-width: 992px){.grid.lg-grid-1{grid-template-columns:1fr}.grid.lg-grid-2{grid-template-columns:repeat(2,1fr)}.grid.lg-grid-3{grid-template-columns:repeat(3,1fr)}}@media (max-width: 991px) and (min-width: 768px){.grid.md-grid-1{grid-template-columns:1fr}.grid.md-grid-2{grid-template-columns:repeat(2,1fr)}.grid.md-grid-3{grid-template-columns:repeat(3,1fr)}}@media (max-width: 1024px){.grid.grid-4:not([class*=lg-grid]):not([class*=md-grid]){grid-template-columns:repeat(2,1fr)}}@media (max-width: 768px){.grid{gap:.75rem}.grid.grid-2:not([class*=sm-grid]):not([class*=xs-grid]),.grid.grid-3:not([class*=sm-grid]):not([class*=xs-grid]),.grid.grid-4:not([class*=sm-grid]):not([class*=xs-grid]){grid-template-columns:1fr}.grid.gap-lg{gap:1rem}.grid.gap-xl{gap:1.25rem}}@media (max-width: 480px){.grid{gap:.5rem}.grid:not([class*=xs-grid]){grid-template-columns:1fr!important}.grid.gap-md{gap:.75rem}.grid.gap-lg,.grid.gap-xl{gap:1rem}}.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}.alert{display:flex;align-items:center;gap:.5rem;padding:.75rem 0;margin:1rem 0;border-radius:0;font-weight:500;font-size:.875rem;border-left:3px solid}.alert .alert-icon{width:1rem;height:1rem;flex-shrink:0}.alert.alert-success{background:#dcfce74d;border-left-color:#22c55e;color:#166534}.alert.alert-error{background:#fef2f24d;border-left-color:#ef4444;color:#dc2626}.form-actions{display:flex;justify-content:flex-end;gap:.75rem;padding:1rem 0;background:#fff;border-top:1px solid #e5e7eb;margin-top:2rem;position:sticky;bottom:0}@media (max-width: 640px){.form-actions{flex-direction:column-reverse}}cide-ele-input,cide-ele-select,cide-ele-textarea,cide-ele-json-editor{transition:all .2s ease}@media (max-width: 768px){.page-form-container{padding:.75rem}.form-header{padding:1rem 0}.form-header .form-title{font-size:1.25rem}.form-header .form-subtitle{font-size:.875rem}.form-section{padding:1rem 0}.form-actions{padding:1rem 0;margin-top:1.5rem}}@media (max-width: 480px){.page-form-container{padding:.25rem}.form-header,.form-section{padding:.75rem 0}.form-actions{padding:.75rem 0;margin-top:1rem}}\n"] }]
211
- }], ctorParameters: () => [] });
212
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nsb3VkLWlkZS1jb3JlL3NyYy9saWIvY29yZS9wYWdlLW1hbmFnZW1lbnQvY29tcG9uZW50cy9wYWdlLWZvcm0vcGFnZS1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nsb3VkLWlkZS1jb3JlL3NyYy9saWIvY29yZS9wYWdlLW1hbmFnZW1lbnQvY29tcG9uZW50cy9wYWdlLWZvcm0vcGFnZS1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQVUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixFQUFFLHNCQUFzQixFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFaEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLGlCQUFpQixFQUFFLHlCQUF5QixFQUFFLDBCQUEwQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDck0sT0FBTyxFQUE4Qyx3QkFBd0IsRUFBZ0YsTUFBTSxxQkFBcUIsQ0FBQzs7O0FB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R0FBRyxDQUFDLEVBQUU7WUFDaEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0E5TVUsaUJBQWlCO2tHQUFqQixpQkFBaUIsK0VDN0I5QixtZ0hBd0dBLDBsSER6RkksWUFBWSw4QkFDWixtQkFBbUIsNHJCQUNuQixXQUFXLCtCQUNYLHNCQUFzQixrWEFDdEIsa0JBQWtCLDBiQUVsQixxQkFBcUIsMFVBR3JCLDBCQUEwQjs7MkZBS2pCLGlCQUFpQjtrQkFsQjdCLFNBQVM7K0JBQ0UscUJBQXFCLGNBQ25CLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLG1CQUFtQjt3QkFDbkIsV0FBVzt3QkFDWCxzQkFBc0I7d0JBQ3RCLGtCQUFrQjt3QkFDbEIsbUJBQW1CO3dCQUNuQixxQkFBcUI7d0JBQ3JCLGlCQUFpQjt3QkFDakIseUJBQXlCO3dCQUN6QiwwQkFBMEI7cUJBQzNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBzaWduYWwsIGNvbXB1dGVkLCBpbmplY3QsIE9uSW5pdCwgRGVzdHJveVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFZhbGlkYXRvcnMsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIE5vbk51bGxhYmxlRm9ybUJ1aWxkZXIsIEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbmltcG9ydCB7IFBhZ2VNYW5hZ2VtZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3BhZ2UtbWFuYWdlbWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcFN0YXRlSGVscGVyU2VydmljZSB9IGZyb20gJ2Nsb3VkLWlkZS1sYXlvdXQnO1xuaW1wb3J0IHsgQ2lkZUVsZUJ1dHRvbkNvbXBvbmVudCwgQ2lkZUlucHV0Q29tcG9uZW50LCBDaWRlU2VsZWN0Q29tcG9uZW50LCBDaWRlVGV4dGFyZWFDb21wb25lbnQsIENpZGVJY29uQ29tcG9uZW50LCBDaWRlRWxlRmlsZUlucHV0Q29tcG9uZW50LCBDaWRlRWxlSnNvbkVkaXRvckNvbXBvbmVudCB9IGZyb20gJ2Nsb3VkLWlkZS1lbGVtZW50JztcbmltcG9ydCB7IElDb3JlU3lwZywgTVN5c3RlbVBhZ2VzSW5zZXJ0VXBkYXRlUGF5bG9hZCwgZ2VuZXJhdGVPYmplY3RGcm9tU3RyaW5nLCBzeXN0ZW1QYWdlc0J5SWRDb250cm9sbGVyUmVzcG9uc2UsIHN5c3RlbVBhZ2VzSW5zZXJ0VXBkYXRlQ29udHJvbGxlclJlc3BvbnNlIH0gZnJvbSAnY2xvdWQtaWRlLWxtcy1tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NpZGUtY29yZS1wYWdlLWZvcm0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgQ2lkZUVsZUJ1dHRvbkNvbXBvbmVudCxcbiAgICBDaWRlSW5wdXRDb21wb25lbnQsXG4gICAgQ2lkZVNlbGVjdENvbXBvbmVudCxcbiAgICBDaWRlVGV4dGFyZWFDb21wb25lbnQsXG4gICAgQ2lkZUljb25Db21wb25lbnQsXG4gICAgQ2lkZUVsZUZpbGVJbnB1dENvbXBvbmVudCxcbiAgICBDaWRlRWxlSnNvbkVkaXRvckNvbXBvbmVudFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vcGFnZS1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGFnZS1mb3JtLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgUGFnZUZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHByaXZhdGUgcGFnZVNlcnZpY2UgPSBpbmplY3QoUGFnZU1hbmFnZW1lbnRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBhcHBTdGF0ZSA9IGluamVjdChBcHBTdGF0ZUhlbHBlclNlcnZpY2UpO1xuICBwcml2YXRlIGZiID0gaW5qZWN0KE5vbk51bGxhYmxlRm9ybUJ1aWxkZXIpO1xuICBwcml2YXRlIHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xuICBwcml2YXRlIHJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcblxuICBsb2FkaW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgZXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHN1Y2Nlc3MgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gUGFnZSBpbmZvcm1hdGlvblxuICBwYWdlSWQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGlzRWRpdE1vZGUgPSBzaWduYWwoZmFsc2UpO1xuXG4gIHBhZ2VGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgc3lwZ190aXRsZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTAwKV1dLFxuICAgIHN5cGdfZGVzYzogWycnLCBbVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjU1KV1dLFxuICAgIHN5cGdfcGFnZV9jb2RlOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCg0MCksIFZhbGlkYXRvcnMucGF0dGVybigvXlthLXpBLVowLTlfXSskLyldXSxcbiAgICBzeXBnX2NvbmZpZ3VyYXRpb246IFsne30nLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgIHN5cGdfaXNhY3RpdmU6IFt0cnVlXVxuICB9KTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnNldHVwRm9ybVN1YnNjcmlwdGlvbnMoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIENoZWNrIGZvciBwYWdlIElEIGluIHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICB0aGlzLmNoZWNrRm9yUGFnZUlkKCk7XG4gIH1cblxuXG5cbiAgLy8gQ2hlY2sgZm9yIHBhZ2UgSUQgaW4gcXVlcnkgcGFyYW1ldGVyc1xuICBwcml2YXRlIGNoZWNrRm9yUGFnZUlkKCkge1xuICAgIGNvbnNvbGUubG9nKCfwn5SNIENoZWNraW5nIGZvciBwYWdlIElEIGluIHF1ZXJ5IHBhcmFtZXRlcnMnLCB0aGlzLnJvdXRlLnBhcmFtcyk7XG4gICAgdGhpcy5yb3V0ZS5wYXJhbXMucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKHBhcmFtcyA9PiB7XG4gICAgICBjb25zb2xlLmxvZygn8J+UjSBRdWVyeSBwYXJhbXM6JywgcGFyYW1zKTtcbiAgICAgIC8vIENoZWNrIGZvciBwYWdlSWQsIGlkLCBvciBwYWdlIHBhcmFtZXRlclxuICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSBwYXJhbXNbJ3F1ZXJ5J107XG4gICAgICBjb25zdCBxdWVyeURhdGEgPSBnZW5lcmF0ZU9iamVjdEZyb21TdHJpbmcocXVlcnlQYXJhbXMpO1xuXG4gICAgICAvLyBJZiBwYWdlSWQgaXMgYW4gb2JqZWN0IHN0cmluZyAoZnJvbSBnZW5lcmF0ZVN0cmluZ0Zyb21PYmplY3QpLCB0cnkgdG8gcGFyc2UgaXRcbiAgICAgIGNvbnN0IHBhZ2VJZCA9IHF1ZXJ5RGF0YS5zeXBnX2lkO1xuICAgICAgaWYgKHBhZ2VJZCkge1xuICAgICAgICBjb25zb2xlLmxvZygn8J+UjSBQYWdlIElEIGZvdW5kIGluIHF1ZXJ5IHBhcmFtczonLCBwYWdlSWQpO1xuICAgICAgICB0aGlzLnBhZ2VJZC5zZXQocGFnZUlkKTtcbiAgICAgICAgdGhpcy5pc0VkaXRNb2RlLnNldCh0cnVlKTtcbiAgICAgICAgdGhpcy5sb2FkUGFnZURhdGEocGFnZUlkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCfwn4aVIE5vIHBhZ2UgSUQgZm91bmQgLSBjcmVhdGluZyBuZXcgcGFnZScpO1xuICAgICAgICB0aGlzLmlzRWRpdE1vZGUuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5wYWdlSWQuc2V0KG51bGwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gTG9hZCBwYWdlIGRhdGEgZm9yIGVkaXRpbmdcbiAgcHJpdmF0ZSBsb2FkUGFnZURhdGEocGFnZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xuXG4gICAgY29uc29sZS5sb2coJ/Cfk6UgTG9hZGluZyBwYWdlIGRhdGEgZm9yIElEOicsIHBhZ2VJZCk7XG5cbiAgICB0aGlzLnBhZ2VTZXJ2aWNlLmdldFBhZ2VCeUlkKHBhZ2VJZCkucGlwZShcbiAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlc3BvbnNlOiBzeXN0ZW1QYWdlc0J5SWRDb250cm9sbGVyUmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ+KchSBQYWdlIGRhdGEgbG9hZGVkOicsIHJlc3BvbnNlKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChyZXNwb25zZT8uc3VjY2VzcyAmJiByZXNwb25zZT8uZGF0YSkge1xuICAgICAgICAgIGNvbnN0IHBhZ2VEYXRhID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICBpZiAocGFnZURhdGEpIHtcbiAgICAgICAgICAgIHRoaXMucG9wdWxhdGVGb3JtV2l0aFBhZ2VEYXRhKHBhZ2VEYXRhKTtcbiAgICAgICAgICAgIHRoaXMuc3VjY2Vzcy5zZXQoJ1BhZ2UgZGF0YSBsb2FkZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3Iuc2V0KCdQYWdlIGRhdGEgbm90IGZvdW5kJyk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgUGFnZSBkYXRhIG5vdCBmb3VuZCBpbiByZXNwb25zZTonLCByZXNwb25zZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZXJyb3Iuc2V0KCdGYWlsZWQgdG8gbG9hZCBwYWdlIGRhdGEnKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgUGFnZSBkYXRhIHJlc3BvbnNlIGludmFsaWQ6JywgcmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBGYWlsZWQgdG8gbG9hZCBwYWdlIGRhdGE6JywgZXJyKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSAnRmFpbGVkIHRvIGxvYWQgcGFnZSBkYXRhLic7XG4gICAgICAgIFxuICAgICAgICBpZiAoZXJyPy5lcnJvcj8ubWVzc2FnZSkge1xuICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGVyci5lcnJvci5tZXNzYWdlO1xuICAgICAgICB9IGVsc2UgaWYgKGVycj8ubWVzc2FnZSkge1xuICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGVyci5tZXNzYWdlO1xuICAgICAgICB9IGVsc2UgaWYgKGVycj8uc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAnUGFnZSBub3QgZm91bmQuJztcbiAgICAgICAgfSBlbHNlIGlmIChlcnI/LnN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ1NlcnZlciBlcnJvci4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0aGlzLmVycm9yLnNldChlcnJvck1lc3NhZ2UpO1xuICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIFBvcHVsYXRlIGZvcm0gd2l0aCBwYWdlIGRhdGFcbiAgcHJpdmF0ZSBwb3B1bGF0ZUZvcm1XaXRoUGFnZURhdGEocGFnZURhdGE6IElDb3JlU3lwZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmxvZygn8J+TnSBQb3B1bGF0aW5nIGZvcm0gd2l0aCBwYWdlIGRhdGE6JywgcGFnZURhdGEpO1xuXG4gICAgICBjb25zdCBmb3JtRGF0YSA9IHtcbiAgICAgICAgc3lwZ190aXRsZTogcGFnZURhdGEuc3lwZ190aXRsZSB8fCAnJyxcbiAgICAgICAgc3lwZ19kZXNjOiBwYWdlRGF0YS5zeXBnX2Rlc2MgfHwgJycsXG4gICAgICAgIHN5cGdfcGFnZV9jb2RlOiBwYWdlRGF0YS5zeXBnX3BhZ2VfY29kZSB8fCAnJyxcbiAgICAgICAgc3lwZ19jb25maWd1cmF0aW9uOiBwYWdlRGF0YS5zeXBnX2NvbmZpZ3VyYXRpb24gPyBKU09OLnN0cmluZ2lmeShwYWdlRGF0YS5zeXBnX2NvbmZpZ3VyYXRpb24pIDogJ3t9JyxcbiAgICAgICAgc3lwZ19pc2FjdGl2ZTogcGFnZURhdGEuc3lwZ19pc2FjdGl2ZSAhPT0gdW5kZWZpbmVkID8gcGFnZURhdGEuc3lwZ19pc2FjdGl2ZSA6IHRydWVcbiAgICAgIH07XG5cbiAgICAgIC8vIFBhdGNoIHRoZSBmb3JtIHdpdGggdGhlIHBhZ2UgZGF0YVxuICAgICAgdGhpcy5wYWdlRm9ybS5wYXRjaFZhbHVlKGZvcm1EYXRhLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG5cbiAgICAgIGNvbnNvbGUubG9nKCfinIUgRm9ybSBwb3B1bGF0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ/CfkqUgRXJyb3IgcG9wdWxhdGluZyBmb3JtIHdpdGggcGFnZSBkYXRhOicsIGVycm9yKTtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KCdFcnJvciBsb2FkaW5nIHBhZ2UgZGF0YSBpbnRvIGZvcm0nKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwRm9ybVN1YnNjcmlwdGlvbnMoKTogdm9pZCB7XG4gICAgLy8gV2F0Y2ggZm9yIGZvcm0gY2hhbmdlcyB0byBlbmFibGUvZGlzYWJsZSBzYXZlIGJ1dHRvblxuICAgIHRoaXMucGFnZUZvcm0udmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAvLyBGb3JtIHZhbGlkYXRpb24gaXMgaGFuZGxlZCBieSBjb21wdXRlZCBzaWduYWxzXG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIENvbXB1dGVkIHZhbHVlc1xuXG4gIGlzRm9ybURpcnR5ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5wYWdlRm9ybS5kaXJ0eSk7XG5cbiAgLy8gRm9ybSBzdWJtaXNzaW9uXG4gIHNhdmVQYWdlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wYWdlRm9ybS52YWxpZCkge1xuICAgICAgdGhpcy5tYXJrRm9ybUFzVG91Y2hlZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMucGFnZUZvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICBcbiAgICBjb25zdCBwYWdlRGF0YTogTVN5c3RlbVBhZ2VzSW5zZXJ0VXBkYXRlUGF5bG9hZCA9IHtcbiAgICAgIF9pZDogdGhpcy5wYWdlSWQoKSB8fCAnJyxcbiAgICAgIHN5cGdfdGl0bGU6IGZvcm1WYWx1ZS5zeXBnX3RpdGxlLFxuICAgICAgc3lwZ19kZXNjOiBmb3JtVmFsdWUuc3lwZ19kZXNjLFxuICAgICAgc3lwZ19wYWdlX2NvZGU6IGZvcm1WYWx1ZS5zeXBnX3BhZ2VfY29kZSxcbiAgICAgIHN5cGdfY29uZmlndXJhdGlvbjogZm9ybVZhbHVlLnN5cGdfY29uZmlndXJhdGlvbixcbiAgICAgIHN5cGdfaXNhY3RpdmU6IGZvcm1WYWx1ZS5zeXBnX2lzYWN0aXZlXG4gICAgfTtcblxuICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG5cbiAgICAgICAgdGhpcy5wYWdlU2VydmljZS5jcmVhdGVPclVwZGF0ZVBhZ2UocGFnZURhdGEpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzcG9uc2U6IHN5c3RlbVBhZ2VzSW5zZXJ0VXBkYXRlQ29udHJvbGxlclJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHRoaXMuc3VjY2Vzcy5zZXQodGhpcy5pc0VkaXRNb2RlKCkgPyAnUGFnZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseScgOiAnUGFnZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ+KchSBQYWdlIHNhdmVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgICAgLy8gTmF2aWdhdGUgYmFjayB0byBwYWdlIGxpc3QgYWZ0ZXIgYSBzaG9ydCBkZWxheVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2NvbnRyb2wtcGFuZWwvcGFnZSddKTtcbiAgICAgICAgICAgIH0sIDE1MDApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yLnNldChyZXNwb25zZS5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gc2F2ZSBwYWdlJyk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRmFpbGVkIHRvIHNhdmUgcGFnZTonLCByZXNwb25zZS5tZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRXJyb3Igc2F2aW5nIHBhZ2U6JywgZXJyb3IpO1xuICAgICAgICAgIHRoaXMuZXJyb3Iuc2V0KCdGYWlsZWQgdG8gc2F2ZSBwYWdlLiBQbGVhc2UgdHJ5IGFnYWluLicpO1xuICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIENhbmNlbCBmb3JtXG4gIGNhbmNlbEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvY29udHJvbC1wYW5lbC9wYWdlJ10pO1xuICB9XG5cbiAgLy8gR28gYmFjayB0byBwYWdlIGxpc3RcbiAgZ29CYWNrKCk6IHZvaWQge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2NvbnRyb2wtcGFuZWwvcGFnZSddKTtcbiAgfVxuXG4gIC8vIE1hcmsgZm9ybSBhcyB0b3VjaGVkIHRvIHRyaWdnZXIgdmFsaWRhdGlvbiBkaXNwbGF5XG4gIHByaXZhdGUgbWFya0Zvcm1Bc1RvdWNoZWQoKTogdm9pZCB7XG4gICAgT2JqZWN0LmtleXModGhpcy5wYWdlRm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMucGFnZUZvcm0uZ2V0KGtleSk7XG4gICAgICBjb250cm9sPy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJwYWdlLWZvcm0tZnVsbHNjcmVlblwiPlxuICA8ZGl2IGNsYXNzPVwicGFnZS1mb3JtLWNvbnRhaW5lclwiPlxuICAgIDxmb3JtIGNsYXNzPVwicGFnZS1mb3JtXCIgW2Zvcm1Hcm91cF09XCJwYWdlRm9ybVwiIFtjbGFzcy5sb2FkaW5nXT1cImxvYWRpbmcoKVwiIChuZ1N1Ym1pdCk9XCJzYXZlUGFnZSgpXCI+XG4gICAgICBcbiAgICAgIDwhLS0gSGVhZGVyIFNlY3Rpb24gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oZWFkZXJcIj5cbiAgICAgICAgPGgyIGNsYXNzPVwiZm9ybS10aXRsZVwiPnt7IGlzRWRpdE1vZGUoKSA/ICdFZGl0IFBhZ2UnIDogJ0NyZWF0ZSBQYWdlJyB9fTwvaDI+XG4gICAgICAgIDxwIGNsYXNzPVwiZm9ybS1zdWJ0aXRsZVwiPlxuICAgICAgICAgIHt7IGlzRWRpdE1vZGUoKSA/ICdVcGRhdGUgcGFnZSBpbmZvcm1hdGlvbiBhbmQgY29uZmlndXJhdGlvbicgOiAnQ3JlYXRlIGEgbmV3IHBhZ2Ugd2l0aCBjb25maWd1cmF0aW9uJyB9fVxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTdWNjZXNzIGFuZCBFcnJvciBNZXNzYWdlcyAtLT5cbiAgICAgIEBpZiAoc3VjY2VzcygpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1zdWNjZXNzXCI+XG4gICAgICAgICAgPHN2ZyBjbGFzcz1cImFsZXJ0LWljb25cIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgIDxwYXRoIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS13aWR0aD1cIjJcIiBkPVwiTTUgMTNsNCA0TDE5IDdcIj48L3BhdGg+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAge3sgc3VjY2VzcygpIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChlcnJvcigpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1lcnJvclwiPlxuICAgICAgICAgIDxzdmcgY2xhc3M9XCJhbGVydC1pY29uXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2Utd2lkdGg9XCIyXCIgZD1cIk02IDE4TDE4IDZNNiA2bDEyIDEyXCI+PC9wYXRoPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIHt7IGVycm9yKCkgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gRm9ybSBDb250ZW50IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLTIgZ2FwLW1kIGxnLWdyaWQtMiBtZC1ncmlkLTFcIj5cbiAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXQgXG4gICAgICAgICAgICBpZD1cInN5cGdfdGl0bGVcIlxuICAgICAgICAgICAgbGFiZWw9XCJQYWdlIFRpdGxlICpcIiBcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5cGdfdGl0bGVcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBwYWdlIHRpdGxlXCJcbiAgICAgICAgICAgIHNpemU9XCJtZFwiPlxuICAgICAgICAgIDwvY2lkZS1lbGUtaW5wdXQ+XG4gICAgICAgICAgXG4gICAgICAgICAgPGNpZGUtZWxlLWlucHV0IFxuICAgICAgICAgICAgaWQ9XCJzeXBnX3BhZ2VfY29kZVwiXG4gICAgICAgICAgICBsYWJlbD1cIlBhZ2UgQ29kZSAqXCIgXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeXBnX3BhZ2VfY29kZVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHBhZ2UgY29kZSAoYWxwaGFudW1lcmljIGFuZCB1bmRlcnNjb3JlIG9ubHkpXCJcbiAgICAgICAgICAgIHNpemU9XCJtZFwiPlxuICAgICAgICAgIDwvY2lkZS1lbGUtaW5wdXQ+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtMSBnYXAtbWRcIj5cbiAgICAgICAgICA8Y2lkZS1lbGUtdGV4dGFyZWEgXG4gICAgICAgICAgICBpZD1cInN5cGdfZGVzY1wiXG4gICAgICAgICAgICBsYWJlbD1cIlBhZ2UgRGVzY3JpcHRpb25cIiBcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5cGdfZGVzY1wiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHBhZ2UgZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgW3Jvd3NdPVwiM1wiXG4gICAgICAgICAgICBzaXplPVwibWRcIj5cbiAgICAgICAgICA8L2NpZGUtZWxlLXRleHRhcmVhPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLTEgZ2FwLW1kXCI+XG4gICAgICAgICAgPGNpZGUtZWxlLWpzb24tZWRpdG9yXG4gICAgICAgICAgICBpZD1cInN5cGdfY29uZmlndXJhdGlvblwiXG4gICAgICAgICAgICBsYWJlbD1cIkNvbmZpZ3VyYXRpb24gSlNPTiAqXCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5cGdfY29uZmlndXJhdGlvblwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj0ne1wia2V5XCI6IFwidmFsdWVcIn0nPlxuICAgICAgICAgIDwvY2lkZS1lbGUtanNvbi1lZGl0b3I+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtMSBnYXAtc21cIj5cbiAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXRcbiAgICAgICAgICAgIGlkPVwic3lwZ19pc2FjdGl2ZVwiXG4gICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3lwZ19pc2FjdGl2ZVwiXG4gICAgICAgICAgICBsYWJlbD1cIkFjdGl2ZSBTdGF0dXNcIlxuICAgICAgICAgICAgc2l6ZT1cInNtXCI+XG4gICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBGb3JtIEFjdGlvbnMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1hY3Rpb25zXCI+XG4gICAgICAgIDxidXR0b24gY2lkZUVsZUJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICB2YXJpYW50PVwic2Vjb25kYXJ5XCIgXG4gICAgICAgICAgKGNsaWNrKT1cImNhbmNlbEZvcm0oKVwiIFxuICAgICAgICAgIGxlZnRJY29uPVwiY2xvc2VcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nKClcIj5cbiAgICAgICAgICBDYW5jZWxcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIFxuICAgICAgICA8YnV0dG9uIGNpZGVFbGVCdXR0b25cbiAgICAgICAgICB0eXBlPVwic3VibWl0XCIgXG4gICAgICAgICAgdmFyaWFudD1cInByaW1hcnlcIiBcbiAgICAgICAgICBbZGlzYWJsZWRdPVwibG9hZGluZygpIHx8ICFwYWdlRm9ybS52YWxpZFwiXG4gICAgICAgICAgW2xvYWRpbmddPVwibG9hZGluZygpXCJcbiAgICAgICAgICBsZWZ0SWNvbj1cInNhdmVcIj5cbiAgICAgICAgICB7eyBpc0VkaXRNb2RlKCkgPyAnVXBkYXRlIFBhZ2UnIDogJ0NyZWF0ZSBQYWdlJyB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==