cloud-ide-admin 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +24 -0
  2. package/esm2022/cloud-ide-admin.mjs +5 -0
  3. package/esm2022/lib/admin-module/entity/create/cide-adm-entity.component.mjs +834 -0
  4. package/esm2022/lib/admin-module/entity/create/cide-adm-entity.service.mjs +79 -0
  5. package/esm2022/lib/admin-module/entity/create/country-select.service.mjs +33 -0
  6. package/esm2022/lib/admin-module/entity/create/currency-select.service.mjs +48 -0
  7. package/esm2022/lib/admin-module/entity/create/general-master-select.service.mjs +44 -0
  8. package/esm2022/lib/admin-module/entity/create/pin-code-select.service.mjs +60 -0
  9. package/esm2022/lib/admin-module/entity/create/user-select.service.mjs +58 -0
  10. package/esm2022/lib/admin-module/entity/list/cide-adm-entity-list.component.mjs +600 -0
  11. package/esm2022/lib/admin-module/entity/list/cide-adm-entity-list.service.mjs +52 -0
  12. package/esm2022/lib/admin-module/home/home-wrapper/cide-adm-home-wrapper.component.mjs +21 -0
  13. package/esm2022/lib/cide-adm-admin.component.mjs +29 -0
  14. package/esm2022/lib/cide-adm-admin.service.mjs +14 -0
  15. package/esm2022/lib/cloud-ide-admin.routes.mjs +38 -0
  16. package/esm2022/public-api.mjs +10 -0
  17. package/fesm2022/cloud-ide-admin-cide-adm-home-wrapper.component-Cu0sr3ST.mjs +24 -0
  18. package/fesm2022/cloud-ide-admin-cide-adm-home-wrapper.component-Cu0sr3ST.mjs.map +1 -0
  19. package/fesm2022/cloud-ide-admin.mjs +1867 -0
  20. package/fesm2022/cloud-ide-admin.mjs.map +1 -0
  21. package/index.d.ts +5 -0
  22. package/lib/admin-module/entity/create/cide-adm-entity.component.d.ts +73 -0
  23. package/lib/admin-module/entity/create/cide-adm-entity.service.d.ts +39 -0
  24. package/lib/admin-module/entity/create/country-select.service.d.ts +13 -0
  25. package/lib/admin-module/entity/create/currency-select.service.d.ts +19 -0
  26. package/lib/admin-module/entity/create/general-master-select.service.d.ts +24 -0
  27. package/lib/admin-module/entity/create/pin-code-select.service.d.ts +31 -0
  28. package/lib/admin-module/entity/create/user-select.service.d.ts +31 -0
  29. package/lib/admin-module/entity/list/cide-adm-entity-list.component.d.ts +94 -0
  30. package/lib/admin-module/entity/list/cide-adm-entity-list.service.d.ts +25 -0
  31. package/lib/admin-module/home/home-wrapper/cide-adm-home-wrapper.component.d.ts +9 -0
  32. package/lib/cide-adm-admin.component.d.ts +9 -0
  33. package/lib/cide-adm-admin.service.d.ts +6 -0
  34. package/lib/cloud-ide-admin.routes.d.ts +2 -0
  35. package/package.json +25 -0
  36. package/public-api.d.ts +6 -0
@@ -0,0 +1,834 @@
1
+ import { Component, signal, inject } from '@angular/core';
2
+ import { ReactiveFormsModule, FormBuilder, Validators } from '@angular/forms';
3
+ import { ActivatedRoute } from '@angular/router';
4
+ import { CideAdmEntityService } from './cide-adm-entity.service';
5
+ import { CideInputComponent, CideSelectComponent, CideEleTabComponent, CideEleButtonComponent } from 'cloud-ide-element';
6
+ import { CideEleFileInputComponent, CideTextareaComponent } from 'cloud-ide-element';
7
+ import { GeneralMasterSelectService } from './general-master-select.service';
8
+ import { PinCodeSelectService } from './pin-code-select.service';
9
+ import { UserSelectService } from './user-select.service';
10
+ import { CurrencySelectService } from './currency-select.service';
11
+ import { CountrySelectService } from './country-select.service';
12
+ import { generateObjectFromString } from 'cloud-ide-lms-model';
13
+ import { Subject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "@angular/forms";
16
+ export class CideAdmEntityComponent {
17
+ constructor() {
18
+ this.entityTypes = signal([]);
19
+ this.currencies = signal([]);
20
+ this.users = signal([]);
21
+ this.postalCodes = signal([]);
22
+ this.photoIdDocuments = signal([]);
23
+ this.countries = signal([]);
24
+ // Store the full pin code data for auto-population
25
+ this.pinCodeDataMap = new Map();
26
+ this.loading = signal(false);
27
+ this.error = signal(null);
28
+ this.success = signal(null);
29
+ // Loading states for individual dropdowns
30
+ this.postalCodesLoading = signal(false);
31
+ this.usersLoading = signal(false);
32
+ this.countriesLoading = signal(false);
33
+ // Entity mode and ID
34
+ this.isEditMode = signal(false);
35
+ this.entityId = signal(null);
36
+ // Tab configuration
37
+ this.activeTab = signal('basic');
38
+ this.entityTabs = signal([
39
+ { id: 'basic', label: 'Basic Information', icon: 'â„šī¸' },
40
+ { id: 'corporate', label: 'Corporate Address', icon: 'đŸĸ' },
41
+ { id: 'contact', label: 'Contact Information', icon: '📧' },
42
+ { id: 'registered', label: 'Registered Address', icon: '🏠' },
43
+ { id: 'documents', label: 'Documents & Media', icon: '📄' }
44
+ ]);
45
+ // Modern dependency injection using inject()
46
+ this.entityService = inject(CideAdmEntityService);
47
+ this.generalMasterService = inject(GeneralMasterSelectService);
48
+ this.pinCodeService = inject(PinCodeSelectService);
49
+ this.userService = inject(UserSelectService);
50
+ this.currencyService = inject(CurrencySelectService);
51
+ this.countryService = inject(CountrySelectService);
52
+ this.fb = inject(FormBuilder);
53
+ this.route = inject(ActivatedRoute);
54
+ this.destroy$ = new Subject();
55
+ this.entityForm = this.fb.group({
56
+ // Basic Information
57
+ syen_name: ['', [Validators.required]],
58
+ syen_entity_code: ['', [Validators.required, Validators.maxLength(40)]],
59
+ syen_entity_type_gmst: ['', [Validators.required]],
60
+ syen_udise_no: [''],
61
+ syen_affiliation_no: [''],
62
+ syen_isactive: [true],
63
+ // Corporate Address
64
+ syen_corporate_address: [''],
65
+ syen_corporate_city_sypin: [''],
66
+ syen_corporate_state_sypin: [''],
67
+ syen_corporate_country_syctr: [''],
68
+ syen_corporate_pin_sypin: [''],
69
+ // Contact Information
70
+ syen_corporate_contact_person_user: [''],
71
+ syen_corporate_phone: [''],
72
+ syen_corporate_phone_alt: [''],
73
+ syen_corporate_fax: [''],
74
+ syen_corporate_email: ['', [Validators.email]],
75
+ syen_corporate_email_alt: ['', [Validators.email]],
76
+ syen_website: ['', [Validators.pattern(/^https?:\/\/.+/)]],
77
+ syen_currency_sycr: [''],
78
+ // Registered Address
79
+ syen_registered_address: [''],
80
+ syen_registered_city_sypin: [''],
81
+ syen_registered_state_sypin: [''],
82
+ syen_registered_country_syctr: [''],
83
+ syen_registered_pin_sypin: [''],
84
+ syen_registered_contact_person_user: [''],
85
+ syen_registered_phone: [''],
86
+ syen_registered_email: ['', [Validators.email]],
87
+ syen_registered_fax: [''],
88
+ // Documents
89
+ syen_photo_id_cyfm: ['']
90
+ });
91
+ // Listen for postal code changes to auto-populate address fields
92
+ this.setupPostalCodeListeners();
93
+ }
94
+ ngOnInit() {
95
+ // Add global error handler to catch any unhandled errors
96
+ const errorHandler = (event) => {
97
+ console.error('đŸ’Ĩ GLOBAL ERROR:', event.error);
98
+ };
99
+ const rejectionHandler = (event) => {
100
+ console.error('đŸ’Ĩ UNHANDLED PROMISE REJECTION:', event.reason);
101
+ };
102
+ window.addEventListener('error', errorHandler);
103
+ window.addEventListener('unhandledrejection', rejectionHandler);
104
+ // Store handlers for cleanup
105
+ this.globalErrorHandler = errorHandler;
106
+ this.globalRejectionHandler = rejectionHandler;
107
+ // Check for entity ID in query parameters
108
+ this.checkForEntityId();
109
+ this.loadDropdowns();
110
+ }
111
+ ngOnDestroy() {
112
+ // Clean up global event listeners
113
+ if (this.globalErrorHandler) {
114
+ window.removeEventListener('error', this.globalErrorHandler);
115
+ }
116
+ if (this.globalRejectionHandler) {
117
+ window.removeEventListener('unhandledrejection', this.globalRejectionHandler);
118
+ }
119
+ // Clean up RxJS subscriptions
120
+ this.destroy$.next();
121
+ this.destroy$.complete();
122
+ }
123
+ // Check for entity ID in query parameters
124
+ checkForEntityId() {
125
+ console.log('🔍 Checking for entity ID in query parameters', this.route.params);
126
+ this.route.params.pipe(takeUntil(this.destroy$)).subscribe(params => {
127
+ console.log('🔍 Query params:', params);
128
+ // Check for entityId, id, or entity parameter
129
+ const queryParams = params['query'];
130
+ const queryData = generateObjectFromString(queryParams);
131
+ // If entityId is an object string (from generateStringFromObject), try to parse it
132
+ const entityId = queryData.syen_id;
133
+ if (entityId) {
134
+ console.log('🔍 Entity ID found in query params:', entityId);
135
+ this.entityId.set(entityId);
136
+ this.isEditMode.set(true);
137
+ this.loadEntityData(entityId);
138
+ }
139
+ else {
140
+ console.log('🆕 No entity ID found - creating new entity');
141
+ this.isEditMode.set(false);
142
+ this.entityId.set(null);
143
+ }
144
+ });
145
+ }
146
+ // Load entity data for editing
147
+ loadEntityData(entityId) {
148
+ this.loading.set(true);
149
+ this.error.set(null);
150
+ console.log('đŸ“Ĩ Loading entity data for ID:', entityId);
151
+ this.entityService.getEntityById(entityId).pipe(takeUntil(this.destroy$)).subscribe({
152
+ next: (response) => {
153
+ console.log('✅ Entity data loaded:', response);
154
+ if (response?.success && response?.data) {
155
+ // Handle both array and single object responses
156
+ const entityData = Array.isArray(response.data) ? response.data[0] : response.data;
157
+ if (entityData) {
158
+ this.populateFormWithEntityData(entityData);
159
+ this.success.set('Entity data loaded successfully');
160
+ }
161
+ else {
162
+ this.error.set('Entity data not found');
163
+ console.error('❌ Entity data not found in response:', response);
164
+ }
165
+ }
166
+ else {
167
+ this.error.set('Failed to load entity data');
168
+ console.error('❌ Entity data response invalid:', response);
169
+ }
170
+ this.loading.set(false);
171
+ },
172
+ error: (err) => {
173
+ console.error('❌ Failed to load entity data:', err);
174
+ let errorMessage = 'Failed to load entity data.';
175
+ if (err?.error?.message) {
176
+ errorMessage = err.error.message;
177
+ }
178
+ else if (err?.message) {
179
+ errorMessage = err.message;
180
+ }
181
+ else if (err?.status === 404) {
182
+ errorMessage = 'Entity not found.';
183
+ }
184
+ else if (err?.status === 500) {
185
+ errorMessage = 'Server error. Please try again later.';
186
+ }
187
+ this.error.set(errorMessage);
188
+ this.loading.set(false);
189
+ }
190
+ });
191
+ }
192
+ // Populate form with entity data
193
+ populateFormWithEntityData(entityData) {
194
+ try {
195
+ console.log('📝 Populating form with entity data:', entityData);
196
+ // Map the entity data to form controls - only use properties that exist in entityResponseData
197
+ const formData = {
198
+ // Basic Information
199
+ syen_name: entityData.syen_name || '',
200
+ syen_entity_code: entityData.syen_entity_code || '',
201
+ syen_entity_type_gmst: entityData.syen_entity_type_gmst || '',
202
+ syen_isactive: entityData.syen_isactive !== undefined ? entityData.syen_isactive : true,
203
+ // Contact Information (only properties that exist in entityResponseData)
204
+ syen_corporate_contact_person_user: entityData.syen_corporate_contact_person_user || '',
205
+ syen_corporate_phone: entityData.syen_corporate_phone || '',
206
+ syen_corporate_email: entityData.syen_corporate_email || '',
207
+ // Set default values for other fields since they're not in entityResponseData
208
+ syen_udise_no: entityData.syen_udise_no || '',
209
+ syen_affiliation_no: entityData.syen_affiliation_no || '',
210
+ syen_corporate_address: entityData.syen_corporate_address || '',
211
+ syen_corporate_city_sypin: entityData.syen_corporate_city_sypin || '',
212
+ syen_corporate_state_sypin: entityData.syen_corporate_state_sypin || '',
213
+ syen_corporate_country_syctr: entityData.syen_corporate_country_syctr || '',
214
+ syen_corporate_pin_sypin: entityData.syen_corporate_pin_sypin || '',
215
+ syen_corporate_phone_alt: entityData.syen_corporate_phone_alt || '',
216
+ syen_corporate_fax: entityData.syen_corporate_fax || '',
217
+ syen_corporate_email_alt: entityData.syen_corporate_email_alt || '',
218
+ syen_website: entityData.syen_website || '',
219
+ syen_currency_sycr: entityData.syen_currency_sycr || '',
220
+ syen_registered_address: entityData.syen_registered_address || '',
221
+ syen_registered_city_sypin: entityData.syen_registered_city_sypin || '',
222
+ syen_registered_state_sypin: entityData.syen_registered_state_sypin || '',
223
+ syen_registered_country_syctr: entityData.syen_registered_country_syctr || '',
224
+ syen_registered_pin_sypin: entityData.syen_registered_pin_sypin || '',
225
+ syen_registered_contact_person_user: entityData.syen_registered_contact_person_user || '',
226
+ syen_registered_phone: entityData.syen_registered_phone || '',
227
+ syen_registered_email: entityData.syen_registered_email || '',
228
+ syen_registered_fax: entityData.syen_registered_fax || '',
229
+ syen_photo_id_cyfm: entityData.syen_photo_id_cyfm || ''
230
+ };
231
+ // Patch the form with the entity data
232
+ this.entityForm.patchValue(formData, { emitEvent: false });
233
+ console.log('✅ Form populated successfully');
234
+ }
235
+ catch (error) {
236
+ console.error('đŸ’Ĩ Error populating form with entity data:', error);
237
+ this.error.set('Error loading entity data into form');
238
+ }
239
+ }
240
+ // Setup listeners for postal code changes
241
+ setupPostalCodeListeners() {
242
+ // Corporate postal code listener
243
+ this.entityForm.get('syen_corporate_pin_sypin')?.valueChanges.pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$)).subscribe(pinCodeId => {
244
+ if (pinCodeId) {
245
+ this.populateAddressFromPinCode(pinCodeId, 'corporate');
246
+ }
247
+ });
248
+ // Registered postal code listener
249
+ this.entityForm.get('syen_registered_pin_sypin')?.valueChanges.pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$)).subscribe(pinCodeId => {
250
+ if (pinCodeId) {
251
+ this.populateAddressFromPinCode(pinCodeId, 'registered');
252
+ }
253
+ });
254
+ }
255
+ // Auto-populate address fields based on selected postal code
256
+ populateAddressFromPinCode(pinCodeId, addressType) {
257
+ const pinCodeData = this.pinCodeDataMap.get(pinCodeId);
258
+ console.log('🔍 Pin Code Data:', pinCodeData);
259
+ if (!pinCodeData) {
260
+ console.warn(`Pin code data not found for ID: ${pinCodeId}`);
261
+ return;
262
+ }
263
+ const prefix = addressType === 'corporate' ? 'syen_corporate' : 'syen_registered';
264
+ // Populate city, state, and country fields
265
+ this.entityForm.patchValue({
266
+ [`${prefix}_city_sypin`]: pinCodeData.sypin_district || '',
267
+ [`${prefix}_state_sypin`]: pinCodeData.sypin_state_name || '',
268
+ [`${prefix}_country_syctr`]: pinCodeData.sypin_country_id_syctr || ''
269
+ }, { emitEvent: false });
270
+ console.log(`📍 Auto-populated ${addressType} address from pin code:`, {
271
+ city: pinCodeData.sypin_district,
272
+ state: pinCodeData.sypin_state_name,
273
+ country: pinCodeData.sypin_country_id_syctr
274
+ });
275
+ }
276
+ loadDropdowns() {
277
+ try {
278
+ console.log('🚀 Loading dropdowns...');
279
+ // Load entity types via general master service
280
+ this.generalMasterService.getGeneralMasterByCode('core_entity_type').subscribe({
281
+ next: (response) => {
282
+ try {
283
+ console.log('✅ Entity types response:', response);
284
+ const types = this.transformGeneralMasterToDropdown(response);
285
+ this.entityTypes.set(types);
286
+ console.log('📋 Loaded entity types:', types.length);
287
+ }
288
+ catch (error) {
289
+ console.error('đŸ’Ĩ Entity types transform error:', error);
290
+ this.entityTypes.set([]);
291
+ }
292
+ },
293
+ error: (err) => {
294
+ console.error('❌ Failed to load entity types:', err);
295
+ this.entityTypes.set([]);
296
+ }
297
+ });
298
+ // Load currencies via currency service
299
+ this.currencyService.getAllCurrencies({}).subscribe({
300
+ next: (response) => {
301
+ try {
302
+ console.log('✅ Currencies response:', response);
303
+ const currencies = this.transformCurrencyToDropdown(response);
304
+ this.currencies.set(currencies);
305
+ console.log('💰 Loaded currencies:', currencies.length);
306
+ }
307
+ catch (error) {
308
+ console.error('đŸ’Ĩ Currencies transform error:', error);
309
+ this.currencies.set([]);
310
+ }
311
+ },
312
+ error: (err) => {
313
+ console.error('❌ Failed to load currencies:', err);
314
+ this.currencies.set([]);
315
+ }
316
+ });
317
+ // Load users via user service
318
+ this.userService.getAllUsers().subscribe({
319
+ next: (response) => {
320
+ try {
321
+ console.log('✅ Users response:', response);
322
+ const users = this.transformUserToDropdown(response);
323
+ this.users.set(users);
324
+ console.log('đŸ‘Ĩ Loaded users:', users.length);
325
+ }
326
+ catch (error) {
327
+ console.error('đŸ’Ĩ Users transform error:', error);
328
+ this.users.set([]);
329
+ }
330
+ },
331
+ error: (err) => {
332
+ console.error('❌ Failed to load users:', err);
333
+ this.users.set([]);
334
+ }
335
+ });
336
+ // Load postal codes via pin code service
337
+ this.pinCodeService.getAllPostalCodes().subscribe({
338
+ next: (response) => {
339
+ try {
340
+ console.log('✅ Postal codes response:', response);
341
+ const postalCodes = this.transformPinCodeToDropdown(response);
342
+ this.postalCodes.set(postalCodes);
343
+ console.log('📮 Loaded postal codes:', postalCodes.length);
344
+ }
345
+ catch (error) {
346
+ console.error('đŸ’Ĩ Postal codes transform error:', error);
347
+ this.postalCodes.set([]);
348
+ }
349
+ },
350
+ error: (err) => {
351
+ console.error('❌ Failed to load postal codes:', err);
352
+ this.postalCodes.set([]);
353
+ }
354
+ });
355
+ // Load photo ID documents via general master service
356
+ this.generalMasterService.getGeneralMasterByCode('core_photo_id_document').subscribe({
357
+ next: (response) => {
358
+ try {
359
+ console.log('✅ Photo ID documents response:', response);
360
+ const documents = this.transformGeneralMasterToDropdown(response);
361
+ this.photoIdDocuments.set(documents);
362
+ console.log('📄 Loaded photo ID documents:', documents.length);
363
+ }
364
+ catch (error) {
365
+ console.error('đŸ’Ĩ Photo ID documents transform error:', error);
366
+ this.photoIdDocuments.set([]);
367
+ }
368
+ },
369
+ error: (err) => {
370
+ console.error('❌ Failed to load photo ID documents:', err);
371
+ // Fallback to static data
372
+ this.photoIdDocuments.set([
373
+ { value: 'passport', label: 'Passport' },
374
+ { value: 'license', label: 'Driver License' },
375
+ { value: 'national_id', label: 'National ID' },
376
+ { value: 'voter_id', label: 'Voter ID' },
377
+ { value: 'other', label: 'Other' }
378
+ ]);
379
+ }
380
+ });
381
+ // Load countries via country service
382
+ this.countryService.getAllCountries({}).subscribe({
383
+ next: (response) => {
384
+ try {
385
+ console.log('✅ Countries response:', response);
386
+ const countries = this.transformCountryToDropdown(response);
387
+ this.countries.set(countries);
388
+ console.log('🌍 Loaded countries:', countries.length);
389
+ }
390
+ catch (error) {
391
+ console.error('đŸ’Ĩ Countries transform error:', error);
392
+ this.countries.set([]);
393
+ }
394
+ },
395
+ error: (err) => {
396
+ console.error('❌ Failed to load countries:', err);
397
+ this.countries.set([]);
398
+ }
399
+ });
400
+ }
401
+ catch (error) {
402
+ console.error('đŸ’Ĩ LOADDROPDOWNS EXCEPTION:', error);
403
+ }
404
+ }
405
+ // Helper method to transform general master response to dropdown options
406
+ transformGeneralMasterToDropdown(response) {
407
+ if (!response?.success || !response?.data) {
408
+ return [];
409
+ }
410
+ let dataArray = [];
411
+ // Handle different response structures - all general master data is in core_general_master
412
+ if (Array.isArray(response.data)) {
413
+ dataArray = response.data;
414
+ }
415
+ return dataArray.map((item, index) => {
416
+ return {
417
+ // API response already includes value and label fields
418
+ value: item.value || item._id || `value_${index}`,
419
+ label: item.label || item.sygms_title || 'Untitled'
420
+ };
421
+ });
422
+ }
423
+ // Helper method to transform currency response to dropdown options
424
+ transformCurrencyToDropdown(response) {
425
+ if (!response?.success || !response?.data) {
426
+ return [];
427
+ }
428
+ console.log('🔍 Currency Response:', response);
429
+ // Handle different response structures
430
+ let dataArray = [];
431
+ if (Array.isArray(response.data)) {
432
+ dataArray = response.data;
433
+ }
434
+ return dataArray.map((item) => {
435
+ return {
436
+ value: item._id,
437
+ label: `${item.sycr_code} - ${item.sycr_name} (${item.sycr_symbol})`
438
+ };
439
+ });
440
+ }
441
+ // Helper method to transform user response to dropdown options
442
+ transformUserToDropdown(response) {
443
+ if (!response?.success || !response?.data) {
444
+ return [];
445
+ }
446
+ let dataArray = [];
447
+ // Handle different response structures
448
+ if (response.data.auth_user_mst) {
449
+ dataArray = response.data.auth_user_mst;
450
+ }
451
+ else if (Array.isArray(response.data)) {
452
+ dataArray = response.data;
453
+ }
454
+ return dataArray.map((item) => {
455
+ return {
456
+ value: item._id || "",
457
+ label: item?.user_fullname || ""
458
+ };
459
+ });
460
+ }
461
+ // Helper method to transform pin code response to dropdown options
462
+ transformPinCodeToDropdown(response) {
463
+ if (!response?.success || !response?.data) {
464
+ return [];
465
+ }
466
+ let dataArray = [];
467
+ // Handle different response structures
468
+ if ('core_pin_code' in response.data && response.data.core_pin_code) {
469
+ dataArray = response.data.core_pin_code;
470
+ }
471
+ // Clear the data map and rebuild it
472
+ this.pinCodeDataMap.clear();
473
+ return dataArray.map((item) => {
474
+ const pinCodeId = String(item._id);
475
+ // Store the full pin code data for auto-population
476
+ this.pinCodeDataMap.set(pinCodeId, item);
477
+ // API response already includes value and label fields
478
+ return {
479
+ value: pinCodeId,
480
+ label: `${item.sypin_pincode} - ${item.sypin_office_name || 'Unknown Office'}`
481
+ };
482
+ });
483
+ }
484
+ // Helper method to transform country response to dropdown options
485
+ transformCountryToDropdown(response) {
486
+ try {
487
+ if (!response?.success || !response?.data) {
488
+ console.warn('âš ī¸ Country response missing success or data:', response);
489
+ return [];
490
+ }
491
+ console.log('🔍 Country Response:', response);
492
+ let dataArray = [];
493
+ // Handle different response structures
494
+ if (Array.isArray(response.data)) {
495
+ dataArray = response.data;
496
+ }
497
+ else if (response.data) {
498
+ dataArray = response.data;
499
+ }
500
+ console.log('🔍 Country data array length:', dataArray.length);
501
+ return dataArray.map((item) => {
502
+ return {
503
+ value: item._id || "",
504
+ label: `${item.syctr_country_iso_name || 'Unknown'} (${item.syctr_country_iso_code_two_char || 'XX'})`
505
+ };
506
+ });
507
+ }
508
+ catch (error) {
509
+ console.error('đŸ’Ĩ COUNTRY TRANSFORM EXCEPTION:', error);
510
+ return [];
511
+ }
512
+ }
513
+ // Helper method to get form control
514
+ getControl(controlName) {
515
+ return this.entityForm.get(controlName);
516
+ }
517
+ // Handle postal code search with debouncing
518
+ onPostalCodeSearch(event) {
519
+ try {
520
+ console.log('🔍 POSTAL CODE SEARCH EVENT:', event);
521
+ // Set loading state
522
+ this.postalCodesLoading.set(true);
523
+ const payload = {
524
+ sypin_pincode: event.query || "",
525
+ sypin_id: event.value || ""
526
+ };
527
+ console.log('🔍 POSTAL CODE PAYLOAD:', payload);
528
+ this.pinCodeService.searchPinCodes(payload).pipe(takeUntil(this.destroy$)).subscribe({
529
+ next: (response) => {
530
+ console.log('✅ POSTAL CODE SEARCH SUCCESS:', response);
531
+ const postalCodes = this.transformPinCodeToDropdown(response);
532
+ this.postalCodes.set(postalCodes);
533
+ console.log('📮 Updated postal codes count:', postalCodes.length);
534
+ },
535
+ error: (err) => {
536
+ console.error('❌ POSTAL CODE SEARCH ERROR:', err);
537
+ this.postalCodes.set([]);
538
+ },
539
+ complete: () => {
540
+ // Clear loading state
541
+ this.postalCodesLoading.set(false);
542
+ }
543
+ });
544
+ }
545
+ catch (error) {
546
+ console.error('đŸ’Ĩ POSTAL CODE SEARCH EXCEPTION:', error);
547
+ this.postalCodes.set([]);
548
+ this.postalCodesLoading.set(false);
549
+ }
550
+ }
551
+ // Handle user search
552
+ onUserSearch(event) {
553
+ try {
554
+ console.log('🔍 USER SEARCH EVENT:', event);
555
+ // Set loading state
556
+ this.usersLoading.set(true);
557
+ const payload = {
558
+ user_fullname: event?.query || "",
559
+ user_id: event?.value || "",
560
+ };
561
+ console.log('🔍 USER SEARCH PAYLOAD:', payload);
562
+ this.userService.searchUsersByFullname(payload).subscribe({
563
+ next: (response) => {
564
+ console.log('✅ USER SEARCH SUCCESS:', response);
565
+ const users = this.transformUserToDropdown(response);
566
+ this.users.set(users);
567
+ console.log('đŸ‘Ĩ Updated users count:', users.length);
568
+ },
569
+ error: (err) => {
570
+ console.error('❌ USER SEARCH ERROR:', err);
571
+ this.users.set([]);
572
+ },
573
+ complete: () => {
574
+ // Clear loading state
575
+ this.usersLoading.set(false);
576
+ }
577
+ });
578
+ }
579
+ catch (error) {
580
+ console.error('đŸ’Ĩ USER SEARCH EXCEPTION:', error);
581
+ this.users.set([]);
582
+ this.usersLoading.set(false);
583
+ }
584
+ }
585
+ // Handle country search
586
+ onCountrySearch(event) {
587
+ try {
588
+ console.log('🔍 COUNTRY SEARCH EVENT:', event);
589
+ // Set loading state
590
+ this.countriesLoading.set(true);
591
+ const payload = {
592
+ query: event.query,
593
+ syctr_id: event.value,
594
+ };
595
+ console.log('🔍 COUNTRY SEARCH PAYLOAD:', payload);
596
+ this.countryService.getAllCountries(payload).subscribe({
597
+ next: (response) => {
598
+ console.log('✅ COUNTRY SEARCH SUCCESS:', response);
599
+ const countries = this.transformCountryToDropdown(response);
600
+ this.countries.set(countries);
601
+ console.log('🌍 Updated countries count:', countries.length);
602
+ },
603
+ error: (err) => {
604
+ console.error('❌ COUNTRY SEARCH ERROR:', err);
605
+ this.countries.set([]);
606
+ },
607
+ complete: () => {
608
+ // Clear loading state
609
+ this.countriesLoading.set(false);
610
+ }
611
+ });
612
+ }
613
+ catch (error) {
614
+ console.error('đŸ’Ĩ COUNTRY SEARCH EXCEPTION:', error);
615
+ this.countries.set([]);
616
+ this.countriesLoading.set(false);
617
+ }
618
+ }
619
+ // Handle postal code selection
620
+ onPostalCodeSelection(event) {
621
+ let pinCodeId = '';
622
+ if (typeof event === 'string') {
623
+ pinCodeId = event;
624
+ }
625
+ else {
626
+ const target = event.target;
627
+ pinCodeId = target?.value || '';
628
+ }
629
+ console.log('📍 Postal Code Selected:', pinCodeId);
630
+ // The auto-population is handled by the form value change listeners
631
+ // This method can be used for additional logic if needed
632
+ }
633
+ // Check if a field has an error
634
+ hasError(controlName, errorType) {
635
+ const control = this.getControl(controlName);
636
+ if (!control)
637
+ return false;
638
+ if (errorType) {
639
+ return control.hasError(errorType) && (control.dirty || control.touched);
640
+ }
641
+ return control.invalid && (control.dirty || control.touched);
642
+ }
643
+ // Get error message for a field
644
+ getErrorMessage(controlName) {
645
+ const control = this.getControl(controlName);
646
+ if (!control || !control.errors)
647
+ return '';
648
+ const fieldName = controlName.replace('syen_', '').replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase());
649
+ if (control.hasError('required')) {
650
+ return `${fieldName} is required`;
651
+ }
652
+ if (control.hasError('maxlength')) {
653
+ return `Maximum length is ${control.errors['maxlength'].requiredLength} characters`;
654
+ }
655
+ if (control.hasError('email')) {
656
+ return 'Please enter a valid email address';
657
+ }
658
+ if (control.hasError('pattern')) {
659
+ return 'Please enter a valid URL starting with http:// or https://';
660
+ }
661
+ return 'Invalid input';
662
+ }
663
+ // Get form validation summary
664
+ getFormValidationSummary() {
665
+ const errors = [];
666
+ Object.keys(this.entityForm.controls).forEach(key => {
667
+ const control = this.entityForm.get(key);
668
+ if (control && control.invalid && (control.dirty || control.touched)) {
669
+ errors.push(this.getErrorMessage(key));
670
+ }
671
+ });
672
+ return errors;
673
+ }
674
+ // Check if form is valid
675
+ get isFormValid() {
676
+ return this.entityForm.valid;
677
+ }
678
+ // Get current mode for display
679
+ get currentMode() {
680
+ return this.isEditMode() ? 'Edit' : 'Create';
681
+ }
682
+ // Get current entity ID for display
683
+ get currentEntityId() {
684
+ return this.entityId();
685
+ }
686
+ onFileChange(event) {
687
+ if (event && event.length > 0) {
688
+ this.logoFile = event[0];
689
+ console.log('īŋŊīŋŊ Logo File Selected:', this.logoFile.name);
690
+ }
691
+ else {
692
+ this.logoFile = undefined;
693
+ console.log('📄 No logo file selected.');
694
+ }
695
+ }
696
+ onTabChange(tab) {
697
+ this.activeTab.set(tab.id);
698
+ }
699
+ onSubmit() {
700
+ if (this.entityForm.valid) {
701
+ this.loading.set(true);
702
+ this.error.set(null);
703
+ this.success.set(null);
704
+ const formData = this.entityForm.value;
705
+ const isEdit = this.isEditMode();
706
+ const entityId = this.entityId();
707
+ console.log(`đŸĸ ENTITY ${isEdit ? 'UPDATE' : 'CREATE'}: Form data:`, formData);
708
+ // Validate required fields before submission
709
+ const requiredFields = ['syen_name', 'syen_entity_code', 'syen_entity_type_gmst'];
710
+ const missingFields = requiredFields.filter(field => !formData[field]);
711
+ if (missingFields.length > 0) {
712
+ this.error.set(`Missing required fields: ${missingFields.join(', ')}`);
713
+ this.loading.set(false);
714
+ return;
715
+ }
716
+ // Add entity ID to form data if in edit mode
717
+ if (isEdit && entityId) {
718
+ formData._id = entityId;
719
+ }
720
+ const saveOperation = this.entityService.saveUpdateEntity(formData);
721
+ saveOperation.pipe(takeUntil(this.destroy$))
722
+ .subscribe({
723
+ next: (response) => {
724
+ console.log(`✅ ENTITY ${isEdit ? 'UPDATE' : 'CREATE'} SUCCESS:`, response);
725
+ if (response?.success) {
726
+ const successMessage = isEdit
727
+ ? 'Entity updated successfully!'
728
+ : 'Entity created successfully!';
729
+ this.success.set(successMessage);
730
+ // Update the entity ID if it's a new entity
731
+ if (!isEdit && response?.data) {
732
+ const entityData = Array.isArray(response.data) ? response.data[0] : response.data;
733
+ if (entityData?._id) {
734
+ this.entityId.set(entityData._id);
735
+ this.isEditMode.set(true);
736
+ }
737
+ }
738
+ // Optionally redirect to list or stay on form
739
+ // this.router.navigate(['/admin/entities']);
740
+ }
741
+ else {
742
+ this.error.set(response?.message || `Failed to ${isEdit ? 'update' : 'create'} entity. Please try again.`);
743
+ }
744
+ this.loading.set(false);
745
+ },
746
+ error: (err) => {
747
+ console.error(`❌ ENTITY ${isEdit ? 'UPDATE' : 'CREATE'} ERROR:`, err);
748
+ let errorMessage = `Failed to ${isEdit ? 'update' : 'save'} entity settings.`;
749
+ if (err?.error?.message) {
750
+ errorMessage = err.error.message;
751
+ }
752
+ else if (err?.message) {
753
+ errorMessage = err.message;
754
+ }
755
+ else if (err?.status === 400) {
756
+ errorMessage = 'Invalid data provided. Please check your input.';
757
+ }
758
+ else if (err?.status === 404 && isEdit) {
759
+ errorMessage = 'Entity not found. It may have been deleted.';
760
+ }
761
+ else if (err?.status === 409) {
762
+ errorMessage = 'Entity with this code already exists. Please use a different code.';
763
+ }
764
+ else if (err?.status === 500) {
765
+ errorMessage = 'Server error. Please try again later.';
766
+ }
767
+ this.error.set(errorMessage);
768
+ this.loading.set(false);
769
+ }
770
+ });
771
+ }
772
+ else {
773
+ // Mark all fields as touched to show validation errors
774
+ this.entityForm.markAllAsTouched();
775
+ const validationErrors = this.getFormValidationSummary();
776
+ console.warn('âš ī¸ FORM VALIDATION ERRORS:', validationErrors);
777
+ this.error.set(`Please fix the following errors: ${validationErrors.join(', ')}`);
778
+ }
779
+ }
780
+ onReset() {
781
+ // Clear logo file
782
+ this.logoFile = undefined;
783
+ // Reset form to initial values
784
+ this.entityForm.reset({
785
+ syen_name: '',
786
+ syen_entity_type_gmst: '',
787
+ syen_entity_code: '',
788
+ syen_udise_no: '',
789
+ syen_affiliation_no: '',
790
+ syen_isactive: true,
791
+ syen_corporate_address: '',
792
+ syen_corporate_pin_sypin: '',
793
+ syen_corporate_city_sypin: '',
794
+ syen_corporate_state_sypin: '',
795
+ syen_corporate_country_syctr: '',
796
+ syen_corporate_contact_person_user: '',
797
+ syen_corporate_phone: '',
798
+ syen_corporate_phone_alt: '',
799
+ syen_corporate_fax: '',
800
+ syen_corporate_email: '',
801
+ syen_corporate_email_alt: '',
802
+ syen_website: '',
803
+ syen_currency_sycr: '',
804
+ syen_registered_address: '',
805
+ syen_registered_pin_sypin: '',
806
+ syen_registered_city_sypin: '',
807
+ syen_registered_state_sypin: '',
808
+ syen_registered_country_syctr: '',
809
+ syen_registered_contact_person_user: '',
810
+ syen_registered_phone: '',
811
+ syen_registered_fax: '',
812
+ syen_registered_email: '',
813
+ syen_photo_id_cyfm: ''
814
+ });
815
+ this.success.set(null);
816
+ this.error.set(null);
817
+ console.log('🔄 Form reset completed');
818
+ }
819
+ static { this.Éĩfac = i0.ÉĩÉĩngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideAdmEntityComponent, deps: [], target: i0.ÉĩÉĩFactoryTarget.Component }); }
820
+ static { this.Éĩcmp = i0.ÉĩÉĩngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: CideAdmEntityComponent, isStandalone: true, selector: "cide-adm-entity", ngImport: i0, template: "<!-- \n DYNAMIC GRID SYSTEM FEATURES:\n \n Basic Grids: grid-1, grid-2, grid-3, grid-4, grid-5, grid-6\n \n Auto-fit Grids: grid-auto-fit-sm/md/lg/xl (dynamic columns based on content)\n Auto-fill Grids: grid-auto-fill-sm/md/lg (always fill available space)\n \n Custom Ratios: grid-ratio-1-2, grid-ratio-2-1, grid-ratio-1-3, grid-ratio-3-1, etc.\n Fractional: grid-quarter-three, grid-third-two, grid-half-half\n \n Gap Control: gap-xs, gap-sm, gap-md, gap-lg, gap-xl\n Specific Gaps: row-gap-xs/sm/md/lg, col-gap-xs/sm/md/lg\n \n Alignment: align-start/center/end/stretch, justify-start/center/end/stretch\n \n Responsive: xl-grid-*, lg-grid-*, md-grid-*, sm-grid-*, xs-grid-*\n \n Grid Items: span-1/2/3/4/5/6/full, row-span-*, start-*, end-*\n Item Alignment: self-start/center/end/stretch, justify-self-*\n \n Special: grid-dense (auto-fills gaps), grid-masonry (masonry layout)\n-->\n\n<div class=\"entity-form-container\">\n <form class=\"entity-form\" [formGroup]=\"entityForm\" [class.loading]=\"loading()\" (ngSubmit)=\"onSubmit()\">\n \n <!-- Header Section -->\n <div class=\"form-header\">\n <h2 class=\"form-title\">Create New Entity</h2>\n <p class=\"form-subtitle\">Add a new educational institution to the system</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 <!-- Tab Navigation -->\n <div class=\"form-tabs\">\n <cide-ele-tab \n [tabs]=\"entityTabs()\"\n [activeTabId]=\"activeTab()\"\n size=\"md\"\n variant=\"default\"\n (tabChange)=\"onTabChange($event)\">\n </cide-ele-tab>\n </div>\n\n <!-- Tab Content -->\n <div class=\"tab-content\"\n [class.loading]=\"loading()\">\n @switch (activeTab()) {\n \n @case ('basic') {\n <!-- Basic Information Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-auto-fit-md gap-md lg-grid-2 md-grid-1\">\n <div class=\"grid-item span-2 md-span-full\">\n <cide-ele-input \n id=\"syen_name\" \n type=\"text\"\n label=\"Institution Name\" \n formControlName=\"syen_name\"\n placeholder=\"Enter full institution name\">\n </cide-ele-input>\n </div>\n \n <cide-ele-input \n label=\"Institution Code\" \n formControlName=\"syen_entity_code\"\n id=\"syen_entity_code\"\n placeholder=\"Enter unique code (max 40 characters)\">\n </cide-ele-input>\n </div>\n\n <div class=\"grid grid-ratio-2-1-1 gap-md lg-grid-3 md-grid-2 sm-grid-1\">\n <cide-ele-select \n label=\"Entity Type\" \n [options]=\"entityTypes()\" \n formControlName=\"syen_entity_type_gmst\"\n placeholder=\"Select entity type\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"UDISE Number\" \n formControlName=\"syen_udise_no\"\n placeholder=\"Enter UDISE number\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Affiliation Number\" \n formControlName=\"syen_affiliation_no\"\n placeholder=\"Enter affiliation number\">\n </cide-ele-input>\n </div>\n\n <div class=\"grid grid-1 gap-sm\">\n <div class=\"checkbox-field\">\n <label class=\"checkbox-label\">\n <input \n type=\"checkbox\" \n formControlName=\"syen_isactive\"\n class=\"checkbox-input\" />\n <span class=\"checkbox-text\">Active Status</span>\n <span class=\"checkbox-description\">Enable this entity for system operations</span>\n </label>\n </div>\n </div>\n </div>\n }\n\n @case ('corporate') {\n <!-- Corporate Address Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-1 gap-md\">\n <div class=\"grid-item span-full\">\n <cide-ele-textarea \n label=\"Corporate Address\" \n formControlName=\"syen_corporate_address\"\n placeholder=\"Enter complete corporate address\"\n [rows]=\"3\">\n </cide-ele-textarea>\n </div>\n </div>\n\n <div class=\"grid grid-auto-fit-sm gap-lg xl-grid-4 lg-grid-3 md-grid-2 sm-grid-1 align-end\">\n <cide-ele-select \n label=\"Postal Code\"\n [options]=\"postalCodes()\" \n formControlName=\"syen_corporate_pin_sypin\"\n placeholder=\"Select postal code\"\n [searchable]=\"true\"\n [loading]=\"postalCodesLoading()\"\n (searchChange)=\"onPostalCodeSearch($event)\"\n (selectionChange)=\"onPostalCodeSelection($event)\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"City\" \n formControlName=\"syen_corporate_city_sypin\"\n placeholder=\"Enter city\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"State\" \n formControlName=\"syen_corporate_state_sypin\"\n placeholder=\"Enter state\">\n </cide-ele-input>\n \n <cide-ele-select \n label=\"Country\" \n [options]=\"countries()\" \n formControlName=\"syen_corporate_country_syctr\"\n placeholder=\"Select country\"\n [searchable]=\"true\"\n [loading]=\"countriesLoading()\"\n (searchChange)=\"onCountrySearch($event)\">\n </cide-ele-select>\n </div>\n </div>\n }\n\n @case ('contact') {\n <!-- Contact Information Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-ratio-3-1 gap-lg md-grid-2 sm-grid-1 justify-stretch\">\n <div class=\"grid-item justify-self-stretch\">\n <cide-ele-select \n label=\"Primary Contact Person\"\n [options]=\"users()\" \n formControlName=\"syen_corporate_contact_person_user\"\n placeholder=\"Select contact person\"\n [searchable]=\"true\"\n [loading]=\"usersLoading()\"\n (searchChange)=\"onUserSearch($event)\">\n </cide-ele-select>\n </div>\n \n <div class=\"grid-item justify-self-stretch\">\n <cide-ele-select \n label=\"Currency\" \n [options]=\"currencies()\" \n formControlName=\"syen_currency_sycr\"\n placeholder=\"Select currency\">\n </cide-ele-select>\n </div>\n </div>\n\n <div class=\"grid grid-auto-fill-md gap-md col-gap-lg row-gap-sm xl-grid-3 lg-grid-2 md-grid-1 grid-dense\">\n <cide-ele-input \n label=\"Primary Phone\" \n formControlName=\"syen_corporate_phone\"\n type=\"tel\"\n placeholder=\"Enter phone number\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Alternate Phone\" \n formControlName=\"syen_corporate_phone_alt\"\n type=\"tel\"\n placeholder=\"Enter alternate phone\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Fax Number\" \n formControlName=\"syen_corporate_fax\"\n placeholder=\"Enter fax number\">\n </cide-ele-input>\n </div>\n\n <div class=\"grid grid-ratio-1-2-1 gap-xl lg-grid-3 md-grid-2 sm-grid-1 align-center\">\n <div class=\"grid-item self-stretch\">\n <cide-ele-input \n label=\"Primary Email\" \n formControlName=\"syen_corporate_email\"\n type=\"email\"\n placeholder=\"Enter primary email\">\n </cide-ele-input>\n </div>\n \n <div class=\"grid-item span-2 lg-span-1 self-stretch\">\n <cide-ele-input \n label=\"Website URL\" \n formControlName=\"syen_website\"\n type=\"url\"\n placeholder=\"Enter website URL\">\n </cide-ele-input>\n </div>\n \n <div class=\"grid-item self-stretch\">\n <cide-ele-input \n label=\"Alternate Email\" \n formControlName=\"syen_corporate_email_alt\"\n type=\"email\"\n placeholder=\"Enter alternate email\">\n </cide-ele-input>\n </div>\n </div>\n </div>\n }\n\n @case ('registered') {\n <!-- Registered Address Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-1\">\n <cide-ele-textarea \n label=\"Registered Address\" \n formControlName=\"syen_registered_address\"\n placeholder=\"Enter complete registered address\"\n [rows]=\"3\">\n </cide-ele-textarea>\n </div>\n\n <div class=\"grid grid-4\">\n <cide-ele-select \n label=\"Registered Postal Code\"\n [options]=\"postalCodes()\" \n formControlName=\"syen_registered_pin_sypin\"\n placeholder=\"Select postal code\"\n [searchable]=\"true\"\n [loading]=\"postalCodesLoading()\"\n (searchChange)=\"onPostalCodeSearch($event)\"\n (selectionChange)=\"onPostalCodeSelection($event)\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"Registered City\" \n formControlName=\"syen_registered_city_sypin\"\n placeholder=\"Enter city\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Registered State\" \n formControlName=\"syen_registered_state_sypin\"\n placeholder=\"Enter state\">\n </cide-ele-input>\n \n <cide-ele-select \n label=\"Registered Country\" \n [options]=\"countries()\" \n formControlName=\"syen_registered_country_syctr\"\n placeholder=\"Select country\"\n [searchable]=\"true\"\n [loading]=\"countriesLoading()\"\n (searchChange)=\"onCountrySearch($event)\">\n </cide-ele-select>\n </div>\n\n <div class=\"grid grid-3\">\n <cide-ele-select \n label=\"Registered Contact Person\"\n [options]=\"users()\" \n formControlName=\"syen_registered_contact_person_user\"\n placeholder=\"Select contact person\"\n [searchable]=\"true\"\n [loading]=\"usersLoading()\"\n (searchChange)=\"onUserSearch($event)\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"Registered Phone\" \n formControlName=\"syen_registered_phone\"\n type=\"tel\"\n placeholder=\"Enter phone number\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Registered Email\" \n formControlName=\"syen_registered_email\"\n type=\"email\"\n placeholder=\"Enter email\">\n </cide-ele-input>\n @if (hasError('syen_registered_email')) {\n <div class=\"error-message\">{{ getErrorMessage('syen_registered_email') }}</div>\n }\n </div>\n\n <div class=\"grid grid-1\">\n <cide-ele-input \n label=\"Registered Fax\" \n formControlName=\"syen_registered_fax\"\n placeholder=\"Enter fax number\">\n </cide-ele-input>\n </div>\n </div>\n }\n\n @case ('documents') {\n <!-- Documents Section -->\n <div class=\"form-section\">\n <!-- Photo ID Document -->\n <div class=\"grid grid-1 gap-md\">\n <cide-ele-select \n label=\"Photo ID Document\" \n [options]=\"photoIdDocuments()\" \n formControlName=\"syen_photo_id_cyfm\"\n placeholder=\"Select photo ID document\">\n </cide-ele-select>\n </div>\n\n <!-- Logo Upload -->\n <div class=\"grid grid-quarter-three gap-lg md-grid-1 align-center\">\n <div class=\"grid-item self-center justify-self-center\">\n <!-- Logo preview placeholder -->\n <div style=\"width: 120px; height: 120px; border: 2px dashed #cbd5e1; border-radius: 8px; display: flex; align-items: center; justify-content: center; color: #9ca3af; font-size: 0.875rem; text-align: center;\">\n Logo Preview\n </div>\n </div>\n <div class=\"grid-item self-stretch\">\n <cide-ele-file-input \n label=\"Upload Logo\" \n accept=\"image/*\" \n [multiple]=\"false\" \n (fileChange)=\"onFileChange($event)\"\n placeholder=\"Select institution logo or image\">\n </cide-ele-file-input>\n </div>\n </div>\n </div>\n }\n }\n </div>\n\n <!-- Form Actions -->\n <div class=\"form-actions\">\n <button cideEleButton\n type=\"button\" \n variant=\"secondary\" \n (click)=\"onReset()\" \n leftIcon=\"refresh\"\n [disabled]=\"loading()\">\n Reset Form\n </button>\n \n <button cideEleButton\n type=\"submit\" \n variant=\"primary\" \n [disabled]=\"loading() || entityForm.invalid\"\n [loading]=\"loading()\"\n leftIcon=\"check\">\n Create Entity\n </button>\n </div>\n </form>\n</div> ", styles: [".entity-form-container{background:transparent;padding:1rem;width:100%;box-sizing:border-box}.entity-form{max-width:1200px;margin:0 auto;background:transparent;border:none;box-shadow:none;width:100%}.entity-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}.form-section .section-title{font-size:1.125rem;font-weight:600;color:#1f2937;margin:0 0 1rem;padding-bottom:.5rem;border-bottom:1px solid #e5e7eb;position:relative}.form-section .section-title:after{content:\"\";position:absolute;bottom:-1px;left:0;width:40px;height:1px;background:#667eea;border-radius:1px}.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.grid-5{grid-template-columns:repeat(5,1fr)}.grid.grid-6{grid-template-columns:repeat(6,1fr)}.grid.grid-auto-fit-sm{grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}.grid.grid-auto-fit-md{grid-template-columns:repeat(auto-fit,minmax(250px,1fr))}.grid.grid-auto-fit-lg{grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}.grid.grid-auto-fit-xl{grid-template-columns:repeat(auto-fit,minmax(350px,1fr))}.grid.grid-auto-fill-sm{grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}.grid.grid-auto-fill-md{grid-template-columns:repeat(auto-fill,minmax(250px,1fr))}.grid.grid-auto-fill-lg{grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.grid.grid-ratio-1-2{grid-template-columns:1fr 2fr}.grid.grid-ratio-2-1{grid-template-columns:2fr 1fr}.grid.grid-ratio-1-3{grid-template-columns:1fr 3fr}.grid.grid-ratio-3-1{grid-template-columns:3fr 1fr}.grid.grid-ratio-1-2-1{grid-template-columns:1fr 2fr 1fr}.grid.grid-ratio-2-1-1{grid-template-columns:2fr 1fr 1fr}.grid.grid-quarter-three{grid-template-columns:1fr 3fr}.grid.grid-third-two{grid-template-columns:1fr 2fr}.grid.grid-half-half{grid-template-columns:1fr 1fr}.grid.gap-xs{gap:.25rem}.grid.gap-sm{gap:.5rem}.grid.gap-md{gap:1rem}.grid.gap-lg{gap:1.5rem}.grid.gap-xl{gap:2rem}.grid.row-gap-xs{row-gap:.25rem}.grid.row-gap-sm{row-gap:.5rem}.grid.row-gap-md{row-gap:1rem}.grid.row-gap-lg{row-gap:1.5rem}.grid.col-gap-xs{column-gap:.25rem}.grid.col-gap-sm{column-gap:.5rem}.grid.col-gap-md{column-gap:1rem}.grid.col-gap-lg{column-gap:1.5rem}.grid.align-start{align-items:start}.grid.align-center{align-items:center}.grid.align-end{align-items:end}.grid.align-stretch{align-items:stretch}.grid.justify-start{justify-items:start}.grid.justify-center{justify-items:center}.grid.justify-end{justify-items:end}.grid.justify-stretch{justify-items:stretch}.grid.grid-dense{grid-auto-flow:dense}.grid.grid-masonry{grid-auto-rows:min-content;align-items:start}@media (min-width: 1200px){.grid.xl-grid-1{grid-template-columns:1fr}.grid.xl-grid-2{grid-template-columns:repeat(2,1fr)}.grid.xl-grid-3{grid-template-columns:repeat(3,1fr)}.grid.xl-grid-4{grid-template-columns:repeat(4,1fr)}.grid.xl-grid-5{grid-template-columns:repeat(5,1fr)}.grid.xl-grid-6{grid-template-columns:repeat(6,1fr)}}@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)}.grid.lg-grid-4{grid-template-columns:repeat(4,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: 767px) and (min-width: 576px){.grid.sm-grid-1{grid-template-columns:1fr}.grid.sm-grid-2{grid-template-columns:repeat(2,1fr)}}@media (max-width: 575px){.grid.xs-grid-1{grid-template-columns:1fr}}@media (max-width: 1024px){.grid.grid-4:not([class*=lg-grid]):not([class*=md-grid]){grid-template-columns:repeat(2,1fr)}.grid.grid-5:not([class*=lg-grid]):not([class*=md-grid]),.grid.grid-6:not([class*=lg-grid]):not([class*=md-grid]){grid-template-columns:repeat(3,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.grid-5:not([class*=sm-grid]):not([class*=xs-grid]),.grid.grid-6: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}}.grid-item.span-1{grid-column:span 1}.grid-item.span-2{grid-column:span 2}.grid-item.span-3{grid-column:span 3}.grid-item.span-4{grid-column:span 4}.grid-item.span-5{grid-column:span 5}.grid-item.span-6{grid-column:span 6}.grid-item.span-full{grid-column:1/-1}.grid-item.row-span-1{grid-row:span 1}.grid-item.row-span-2{grid-row:span 2}.grid-item.row-span-3{grid-row:span 3}.grid-item.row-span-4{grid-row:span 4}.grid-item.start-1{grid-column-start:1}.grid-item.start-2{grid-column-start:2}.grid-item.start-3{grid-column-start:3}.grid-item.start-4{grid-column-start:4}.grid-item.end-1{grid-column-end:1}.grid-item.end-2{grid-column-end:2}.grid-item.end-3{grid-column-end:3}.grid-item.end-4{grid-column-end:4}.grid-item.end-auto{grid-column-end:auto}.grid-item.self-start{align-self:start}.grid-item.self-center{align-self:center}.grid-item.self-end{align-self:end}.grid-item.self-stretch{align-self:stretch}.grid-item.justify-self-start{justify-self:start}.grid-item.justify-self-center{justify-self:center}.grid-item.justify-self-end{justify-self:end}.grid-item.justify-self-stretch{justify-self:stretch}@media (max-width: 768px){.grid-item.md-span-1{grid-column:span 1}.grid-item.md-span-2{grid-column:span 2}.grid-item.md-span-full{grid-column:1/-1}}@media (max-width: 480px){.grid-item.sm-span-full{grid-column:1/-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}.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}.error-message{font-size:.75rem;color:#dc2626;margin-top:.25rem;padding-left:.125rem;font-weight:500}.form-tabs{padding:0;margin:1rem 0;border-bottom:1px solid #e5e7eb}.tab-content{transition:opacity .2s ease}.tab-content.loading{opacity:.6;pointer-events:none}.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}}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.375rem;padding:.5rem 1rem;font-weight:600;font-size:.8125rem;border-radius:6px;border:none;cursor:pointer;transition:all .2s ease;min-width:120px;position:relative}.btn .btn-icon{width:.875rem;height:.875rem}.btn:disabled{opacity:.6;cursor:not-allowed}.btn.btn-primary{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;box-shadow:0 4px 6px -1px #667eea4d}.btn.btn-primary:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 8px 12px -2px #667eea66}.btn.btn-primary:active:not(:disabled){transform:translateY(0)}.btn.btn-secondary{background:#fff;color:#6b7280;border:2px solid #e5e7eb}.btn.btn-secondary:hover:not(:disabled){background:#f9fafb;border-color:#d1d5db;color:#374151}.entity-type-selector{display:flex;flex-direction:column;gap:.375rem}.input-label{font-size:.875rem;font-weight:500;color:#374151;margin-bottom:.25rem}.entity-type-button{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.75rem;background:#fff;border:1px solid #d1d5db;border-radius:6px;cursor:pointer;transition:all .15s ease;text-align:left;font-size:.875rem;color:#6b7280}.entity-type-button:hover{border-color:#9ca3af;background:#f9fafb}.entity-type-button:focus{outline:none;border-color:var(--cide-theme-primary-color);box-shadow:0 0 0 3px #3b82f61a}.entity-type-button.has-value{color:#374151}.entity-type-button.invalid{border-color:#dc2626;color:#dc2626}.entity-type-button.invalid:hover{border-color:#b91c1c}.entity-type-button.invalid:focus{border-color:#dc2626;box-shadow:0 0 0 3px #dc26261a}.entity-type-button .button-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.entity-type-button .button-icon{width:1rem;height:1rem;margin-left:.5rem;flex-shrink:0}.animate-spin{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}cide-ele-input,cide-ele-select,cide-ele-textarea,cide-ele-file-input{transition:all .2s ease}@media (max-width: 768px){.entity-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-tabs{margin:.5rem 0}.tab-content{padding:1rem 0 5rem}.form-section{padding:1rem 0}.form-section .section-title{font-size:1rem}.form-actions{padding:1rem 0;margin-top:1.5rem}}@media (max-width: 480px){.entity-form-container{padding:.25rem}.form-header{padding:.75rem 0}.form-tabs{margin:.25rem 0}.tab-content{padding:.75rem 0 4rem}.form-section{padding:.75rem 0}.form-actions{padding:.75rem 0;margin-top:1rem}}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ÉĩNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: 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: 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: CideEleFileInputComponent, selector: "cide-ele-file-input", inputs: ["label", "accept", "multiple", "disabled", "helperText", "errorText"], outputs: ["fileChange"] }, { kind: "component", type: CideEleTabComponent, selector: "cide-ele-tab", inputs: ["tabs", "activeTabId", "size", "variant", "fullWidth", "disabled"], outputs: ["tabChange"] }, { 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"] }] }); }
821
+ }
822
+ i0.ÉĩÉĩngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideAdmEntityComponent, decorators: [{
823
+ type: Component,
824
+ args: [{ selector: 'cide-adm-entity', standalone: true, imports: [
825
+ ReactiveFormsModule,
826
+ CideInputComponent,
827
+ CideSelectComponent,
828
+ CideTextareaComponent,
829
+ CideEleFileInputComponent,
830
+ CideEleTabComponent,
831
+ CideEleButtonComponent
832
+ ], template: "<!-- \n DYNAMIC GRID SYSTEM FEATURES:\n \n Basic Grids: grid-1, grid-2, grid-3, grid-4, grid-5, grid-6\n \n Auto-fit Grids: grid-auto-fit-sm/md/lg/xl (dynamic columns based on content)\n Auto-fill Grids: grid-auto-fill-sm/md/lg (always fill available space)\n \n Custom Ratios: grid-ratio-1-2, grid-ratio-2-1, grid-ratio-1-3, grid-ratio-3-1, etc.\n Fractional: grid-quarter-three, grid-third-two, grid-half-half\n \n Gap Control: gap-xs, gap-sm, gap-md, gap-lg, gap-xl\n Specific Gaps: row-gap-xs/sm/md/lg, col-gap-xs/sm/md/lg\n \n Alignment: align-start/center/end/stretch, justify-start/center/end/stretch\n \n Responsive: xl-grid-*, lg-grid-*, md-grid-*, sm-grid-*, xs-grid-*\n \n Grid Items: span-1/2/3/4/5/6/full, row-span-*, start-*, end-*\n Item Alignment: self-start/center/end/stretch, justify-self-*\n \n Special: grid-dense (auto-fills gaps), grid-masonry (masonry layout)\n-->\n\n<div class=\"entity-form-container\">\n <form class=\"entity-form\" [formGroup]=\"entityForm\" [class.loading]=\"loading()\" (ngSubmit)=\"onSubmit()\">\n \n <!-- Header Section -->\n <div class=\"form-header\">\n <h2 class=\"form-title\">Create New Entity</h2>\n <p class=\"form-subtitle\">Add a new educational institution to the system</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 <!-- Tab Navigation -->\n <div class=\"form-tabs\">\n <cide-ele-tab \n [tabs]=\"entityTabs()\"\n [activeTabId]=\"activeTab()\"\n size=\"md\"\n variant=\"default\"\n (tabChange)=\"onTabChange($event)\">\n </cide-ele-tab>\n </div>\n\n <!-- Tab Content -->\n <div class=\"tab-content\"\n [class.loading]=\"loading()\">\n @switch (activeTab()) {\n \n @case ('basic') {\n <!-- Basic Information Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-auto-fit-md gap-md lg-grid-2 md-grid-1\">\n <div class=\"grid-item span-2 md-span-full\">\n <cide-ele-input \n id=\"syen_name\" \n type=\"text\"\n label=\"Institution Name\" \n formControlName=\"syen_name\"\n placeholder=\"Enter full institution name\">\n </cide-ele-input>\n </div>\n \n <cide-ele-input \n label=\"Institution Code\" \n formControlName=\"syen_entity_code\"\n id=\"syen_entity_code\"\n placeholder=\"Enter unique code (max 40 characters)\">\n </cide-ele-input>\n </div>\n\n <div class=\"grid grid-ratio-2-1-1 gap-md lg-grid-3 md-grid-2 sm-grid-1\">\n <cide-ele-select \n label=\"Entity Type\" \n [options]=\"entityTypes()\" \n formControlName=\"syen_entity_type_gmst\"\n placeholder=\"Select entity type\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"UDISE Number\" \n formControlName=\"syen_udise_no\"\n placeholder=\"Enter UDISE number\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Affiliation Number\" \n formControlName=\"syen_affiliation_no\"\n placeholder=\"Enter affiliation number\">\n </cide-ele-input>\n </div>\n\n <div class=\"grid grid-1 gap-sm\">\n <div class=\"checkbox-field\">\n <label class=\"checkbox-label\">\n <input \n type=\"checkbox\" \n formControlName=\"syen_isactive\"\n class=\"checkbox-input\" />\n <span class=\"checkbox-text\">Active Status</span>\n <span class=\"checkbox-description\">Enable this entity for system operations</span>\n </label>\n </div>\n </div>\n </div>\n }\n\n @case ('corporate') {\n <!-- Corporate Address Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-1 gap-md\">\n <div class=\"grid-item span-full\">\n <cide-ele-textarea \n label=\"Corporate Address\" \n formControlName=\"syen_corporate_address\"\n placeholder=\"Enter complete corporate address\"\n [rows]=\"3\">\n </cide-ele-textarea>\n </div>\n </div>\n\n <div class=\"grid grid-auto-fit-sm gap-lg xl-grid-4 lg-grid-3 md-grid-2 sm-grid-1 align-end\">\n <cide-ele-select \n label=\"Postal Code\"\n [options]=\"postalCodes()\" \n formControlName=\"syen_corporate_pin_sypin\"\n placeholder=\"Select postal code\"\n [searchable]=\"true\"\n [loading]=\"postalCodesLoading()\"\n (searchChange)=\"onPostalCodeSearch($event)\"\n (selectionChange)=\"onPostalCodeSelection($event)\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"City\" \n formControlName=\"syen_corporate_city_sypin\"\n placeholder=\"Enter city\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"State\" \n formControlName=\"syen_corporate_state_sypin\"\n placeholder=\"Enter state\">\n </cide-ele-input>\n \n <cide-ele-select \n label=\"Country\" \n [options]=\"countries()\" \n formControlName=\"syen_corporate_country_syctr\"\n placeholder=\"Select country\"\n [searchable]=\"true\"\n [loading]=\"countriesLoading()\"\n (searchChange)=\"onCountrySearch($event)\">\n </cide-ele-select>\n </div>\n </div>\n }\n\n @case ('contact') {\n <!-- Contact Information Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-ratio-3-1 gap-lg md-grid-2 sm-grid-1 justify-stretch\">\n <div class=\"grid-item justify-self-stretch\">\n <cide-ele-select \n label=\"Primary Contact Person\"\n [options]=\"users()\" \n formControlName=\"syen_corporate_contact_person_user\"\n placeholder=\"Select contact person\"\n [searchable]=\"true\"\n [loading]=\"usersLoading()\"\n (searchChange)=\"onUserSearch($event)\">\n </cide-ele-select>\n </div>\n \n <div class=\"grid-item justify-self-stretch\">\n <cide-ele-select \n label=\"Currency\" \n [options]=\"currencies()\" \n formControlName=\"syen_currency_sycr\"\n placeholder=\"Select currency\">\n </cide-ele-select>\n </div>\n </div>\n\n <div class=\"grid grid-auto-fill-md gap-md col-gap-lg row-gap-sm xl-grid-3 lg-grid-2 md-grid-1 grid-dense\">\n <cide-ele-input \n label=\"Primary Phone\" \n formControlName=\"syen_corporate_phone\"\n type=\"tel\"\n placeholder=\"Enter phone number\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Alternate Phone\" \n formControlName=\"syen_corporate_phone_alt\"\n type=\"tel\"\n placeholder=\"Enter alternate phone\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Fax Number\" \n formControlName=\"syen_corporate_fax\"\n placeholder=\"Enter fax number\">\n </cide-ele-input>\n </div>\n\n <div class=\"grid grid-ratio-1-2-1 gap-xl lg-grid-3 md-grid-2 sm-grid-1 align-center\">\n <div class=\"grid-item self-stretch\">\n <cide-ele-input \n label=\"Primary Email\" \n formControlName=\"syen_corporate_email\"\n type=\"email\"\n placeholder=\"Enter primary email\">\n </cide-ele-input>\n </div>\n \n <div class=\"grid-item span-2 lg-span-1 self-stretch\">\n <cide-ele-input \n label=\"Website URL\" \n formControlName=\"syen_website\"\n type=\"url\"\n placeholder=\"Enter website URL\">\n </cide-ele-input>\n </div>\n \n <div class=\"grid-item self-stretch\">\n <cide-ele-input \n label=\"Alternate Email\" \n formControlName=\"syen_corporate_email_alt\"\n type=\"email\"\n placeholder=\"Enter alternate email\">\n </cide-ele-input>\n </div>\n </div>\n </div>\n }\n\n @case ('registered') {\n <!-- Registered Address Section -->\n <div class=\"form-section\">\n <div class=\"grid grid-1\">\n <cide-ele-textarea \n label=\"Registered Address\" \n formControlName=\"syen_registered_address\"\n placeholder=\"Enter complete registered address\"\n [rows]=\"3\">\n </cide-ele-textarea>\n </div>\n\n <div class=\"grid grid-4\">\n <cide-ele-select \n label=\"Registered Postal Code\"\n [options]=\"postalCodes()\" \n formControlName=\"syen_registered_pin_sypin\"\n placeholder=\"Select postal code\"\n [searchable]=\"true\"\n [loading]=\"postalCodesLoading()\"\n (searchChange)=\"onPostalCodeSearch($event)\"\n (selectionChange)=\"onPostalCodeSelection($event)\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"Registered City\" \n formControlName=\"syen_registered_city_sypin\"\n placeholder=\"Enter city\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Registered State\" \n formControlName=\"syen_registered_state_sypin\"\n placeholder=\"Enter state\">\n </cide-ele-input>\n \n <cide-ele-select \n label=\"Registered Country\" \n [options]=\"countries()\" \n formControlName=\"syen_registered_country_syctr\"\n placeholder=\"Select country\"\n [searchable]=\"true\"\n [loading]=\"countriesLoading()\"\n (searchChange)=\"onCountrySearch($event)\">\n </cide-ele-select>\n </div>\n\n <div class=\"grid grid-3\">\n <cide-ele-select \n label=\"Registered Contact Person\"\n [options]=\"users()\" \n formControlName=\"syen_registered_contact_person_user\"\n placeholder=\"Select contact person\"\n [searchable]=\"true\"\n [loading]=\"usersLoading()\"\n (searchChange)=\"onUserSearch($event)\">\n </cide-ele-select>\n \n <cide-ele-input \n label=\"Registered Phone\" \n formControlName=\"syen_registered_phone\"\n type=\"tel\"\n placeholder=\"Enter phone number\">\n </cide-ele-input>\n \n <cide-ele-input \n label=\"Registered Email\" \n formControlName=\"syen_registered_email\"\n type=\"email\"\n placeholder=\"Enter email\">\n </cide-ele-input>\n @if (hasError('syen_registered_email')) {\n <div class=\"error-message\">{{ getErrorMessage('syen_registered_email') }}</div>\n }\n </div>\n\n <div class=\"grid grid-1\">\n <cide-ele-input \n label=\"Registered Fax\" \n formControlName=\"syen_registered_fax\"\n placeholder=\"Enter fax number\">\n </cide-ele-input>\n </div>\n </div>\n }\n\n @case ('documents') {\n <!-- Documents Section -->\n <div class=\"form-section\">\n <!-- Photo ID Document -->\n <div class=\"grid grid-1 gap-md\">\n <cide-ele-select \n label=\"Photo ID Document\" \n [options]=\"photoIdDocuments()\" \n formControlName=\"syen_photo_id_cyfm\"\n placeholder=\"Select photo ID document\">\n </cide-ele-select>\n </div>\n\n <!-- Logo Upload -->\n <div class=\"grid grid-quarter-three gap-lg md-grid-1 align-center\">\n <div class=\"grid-item self-center justify-self-center\">\n <!-- Logo preview placeholder -->\n <div style=\"width: 120px; height: 120px; border: 2px dashed #cbd5e1; border-radius: 8px; display: flex; align-items: center; justify-content: center; color: #9ca3af; font-size: 0.875rem; text-align: center;\">\n Logo Preview\n </div>\n </div>\n <div class=\"grid-item self-stretch\">\n <cide-ele-file-input \n label=\"Upload Logo\" \n accept=\"image/*\" \n [multiple]=\"false\" \n (fileChange)=\"onFileChange($event)\"\n placeholder=\"Select institution logo or image\">\n </cide-ele-file-input>\n </div>\n </div>\n </div>\n }\n }\n </div>\n\n <!-- Form Actions -->\n <div class=\"form-actions\">\n <button cideEleButton\n type=\"button\" \n variant=\"secondary\" \n (click)=\"onReset()\" \n leftIcon=\"refresh\"\n [disabled]=\"loading()\">\n Reset Form\n </button>\n \n <button cideEleButton\n type=\"submit\" \n variant=\"primary\" \n [disabled]=\"loading() || entityForm.invalid\"\n [loading]=\"loading()\"\n leftIcon=\"check\">\n Create Entity\n </button>\n </div>\n </form>\n</div> ", styles: [".entity-form-container{background:transparent;padding:1rem;width:100%;box-sizing:border-box}.entity-form{max-width:1200px;margin:0 auto;background:transparent;border:none;box-shadow:none;width:100%}.entity-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}.form-section .section-title{font-size:1.125rem;font-weight:600;color:#1f2937;margin:0 0 1rem;padding-bottom:.5rem;border-bottom:1px solid #e5e7eb;position:relative}.form-section .section-title:after{content:\"\";position:absolute;bottom:-1px;left:0;width:40px;height:1px;background:#667eea;border-radius:1px}.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.grid-5{grid-template-columns:repeat(5,1fr)}.grid.grid-6{grid-template-columns:repeat(6,1fr)}.grid.grid-auto-fit-sm{grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}.grid.grid-auto-fit-md{grid-template-columns:repeat(auto-fit,minmax(250px,1fr))}.grid.grid-auto-fit-lg{grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}.grid.grid-auto-fit-xl{grid-template-columns:repeat(auto-fit,minmax(350px,1fr))}.grid.grid-auto-fill-sm{grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}.grid.grid-auto-fill-md{grid-template-columns:repeat(auto-fill,minmax(250px,1fr))}.grid.grid-auto-fill-lg{grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.grid.grid-ratio-1-2{grid-template-columns:1fr 2fr}.grid.grid-ratio-2-1{grid-template-columns:2fr 1fr}.grid.grid-ratio-1-3{grid-template-columns:1fr 3fr}.grid.grid-ratio-3-1{grid-template-columns:3fr 1fr}.grid.grid-ratio-1-2-1{grid-template-columns:1fr 2fr 1fr}.grid.grid-ratio-2-1-1{grid-template-columns:2fr 1fr 1fr}.grid.grid-quarter-three{grid-template-columns:1fr 3fr}.grid.grid-third-two{grid-template-columns:1fr 2fr}.grid.grid-half-half{grid-template-columns:1fr 1fr}.grid.gap-xs{gap:.25rem}.grid.gap-sm{gap:.5rem}.grid.gap-md{gap:1rem}.grid.gap-lg{gap:1.5rem}.grid.gap-xl{gap:2rem}.grid.row-gap-xs{row-gap:.25rem}.grid.row-gap-sm{row-gap:.5rem}.grid.row-gap-md{row-gap:1rem}.grid.row-gap-lg{row-gap:1.5rem}.grid.col-gap-xs{column-gap:.25rem}.grid.col-gap-sm{column-gap:.5rem}.grid.col-gap-md{column-gap:1rem}.grid.col-gap-lg{column-gap:1.5rem}.grid.align-start{align-items:start}.grid.align-center{align-items:center}.grid.align-end{align-items:end}.grid.align-stretch{align-items:stretch}.grid.justify-start{justify-items:start}.grid.justify-center{justify-items:center}.grid.justify-end{justify-items:end}.grid.justify-stretch{justify-items:stretch}.grid.grid-dense{grid-auto-flow:dense}.grid.grid-masonry{grid-auto-rows:min-content;align-items:start}@media (min-width: 1200px){.grid.xl-grid-1{grid-template-columns:1fr}.grid.xl-grid-2{grid-template-columns:repeat(2,1fr)}.grid.xl-grid-3{grid-template-columns:repeat(3,1fr)}.grid.xl-grid-4{grid-template-columns:repeat(4,1fr)}.grid.xl-grid-5{grid-template-columns:repeat(5,1fr)}.grid.xl-grid-6{grid-template-columns:repeat(6,1fr)}}@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)}.grid.lg-grid-4{grid-template-columns:repeat(4,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: 767px) and (min-width: 576px){.grid.sm-grid-1{grid-template-columns:1fr}.grid.sm-grid-2{grid-template-columns:repeat(2,1fr)}}@media (max-width: 575px){.grid.xs-grid-1{grid-template-columns:1fr}}@media (max-width: 1024px){.grid.grid-4:not([class*=lg-grid]):not([class*=md-grid]){grid-template-columns:repeat(2,1fr)}.grid.grid-5:not([class*=lg-grid]):not([class*=md-grid]),.grid.grid-6:not([class*=lg-grid]):not([class*=md-grid]){grid-template-columns:repeat(3,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.grid-5:not([class*=sm-grid]):not([class*=xs-grid]),.grid.grid-6: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}}.grid-item.span-1{grid-column:span 1}.grid-item.span-2{grid-column:span 2}.grid-item.span-3{grid-column:span 3}.grid-item.span-4{grid-column:span 4}.grid-item.span-5{grid-column:span 5}.grid-item.span-6{grid-column:span 6}.grid-item.span-full{grid-column:1/-1}.grid-item.row-span-1{grid-row:span 1}.grid-item.row-span-2{grid-row:span 2}.grid-item.row-span-3{grid-row:span 3}.grid-item.row-span-4{grid-row:span 4}.grid-item.start-1{grid-column-start:1}.grid-item.start-2{grid-column-start:2}.grid-item.start-3{grid-column-start:3}.grid-item.start-4{grid-column-start:4}.grid-item.end-1{grid-column-end:1}.grid-item.end-2{grid-column-end:2}.grid-item.end-3{grid-column-end:3}.grid-item.end-4{grid-column-end:4}.grid-item.end-auto{grid-column-end:auto}.grid-item.self-start{align-self:start}.grid-item.self-center{align-self:center}.grid-item.self-end{align-self:end}.grid-item.self-stretch{align-self:stretch}.grid-item.justify-self-start{justify-self:start}.grid-item.justify-self-center{justify-self:center}.grid-item.justify-self-end{justify-self:end}.grid-item.justify-self-stretch{justify-self:stretch}@media (max-width: 768px){.grid-item.md-span-1{grid-column:span 1}.grid-item.md-span-2{grid-column:span 2}.grid-item.md-span-full{grid-column:1/-1}}@media (max-width: 480px){.grid-item.sm-span-full{grid-column:1/-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}.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}.error-message{font-size:.75rem;color:#dc2626;margin-top:.25rem;padding-left:.125rem;font-weight:500}.form-tabs{padding:0;margin:1rem 0;border-bottom:1px solid #e5e7eb}.tab-content{transition:opacity .2s ease}.tab-content.loading{opacity:.6;pointer-events:none}.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}}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.375rem;padding:.5rem 1rem;font-weight:600;font-size:.8125rem;border-radius:6px;border:none;cursor:pointer;transition:all .2s ease;min-width:120px;position:relative}.btn .btn-icon{width:.875rem;height:.875rem}.btn:disabled{opacity:.6;cursor:not-allowed}.btn.btn-primary{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;box-shadow:0 4px 6px -1px #667eea4d}.btn.btn-primary:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 8px 12px -2px #667eea66}.btn.btn-primary:active:not(:disabled){transform:translateY(0)}.btn.btn-secondary{background:#fff;color:#6b7280;border:2px solid #e5e7eb}.btn.btn-secondary:hover:not(:disabled){background:#f9fafb;border-color:#d1d5db;color:#374151}.entity-type-selector{display:flex;flex-direction:column;gap:.375rem}.input-label{font-size:.875rem;font-weight:500;color:#374151;margin-bottom:.25rem}.entity-type-button{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.75rem;background:#fff;border:1px solid #d1d5db;border-radius:6px;cursor:pointer;transition:all .15s ease;text-align:left;font-size:.875rem;color:#6b7280}.entity-type-button:hover{border-color:#9ca3af;background:#f9fafb}.entity-type-button:focus{outline:none;border-color:var(--cide-theme-primary-color);box-shadow:0 0 0 3px #3b82f61a}.entity-type-button.has-value{color:#374151}.entity-type-button.invalid{border-color:#dc2626;color:#dc2626}.entity-type-button.invalid:hover{border-color:#b91c1c}.entity-type-button.invalid:focus{border-color:#dc2626;box-shadow:0 0 0 3px #dc26261a}.entity-type-button .button-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.entity-type-button .button-icon{width:1rem;height:1rem;margin-left:.5rem;flex-shrink:0}.animate-spin{animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}cide-ele-input,cide-ele-select,cide-ele-textarea,cide-ele-file-input{transition:all .2s ease}@media (max-width: 768px){.entity-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-tabs{margin:.5rem 0}.tab-content{padding:1rem 0 5rem}.form-section{padding:1rem 0}.form-section .section-title{font-size:1rem}.form-actions{padding:1rem 0;margin-top:1.5rem}}@media (max-width: 480px){.entity-form-container{padding:.25rem}.form-header{padding:.75rem 0}.form-tabs{margin:.25rem 0}.tab-content{padding:.75rem 0 4rem}.form-section{padding:.75rem 0}.form-actions{padding:.75rem 0;margin-top:1rem}}\n"] }]
833
+ }], ctorParameters: () => [] });
834
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2lkZS1hZG0tZW50aXR5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nsb3VkLWlkZS1hZG1pbi9zcmMvbGliL2FkbWluLW1vZHVsZS9lbnRpdHkvY3JlYXRlL2NpZGUtYWRtLWVudGl0eS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtYWRtaW4vc3JjL2xpYi9hZG1pbi1tb2R1bGUvZW50aXR5L2NyZWF0ZS9jaWRlLWFkbS1lbnRpdHkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsTUFBTSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQWEsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBVyxzQkFBc0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xJLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixD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QyxDQUFDO1FBRUgsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7OEdBNTRCVSxzQkFBc0I7a0dBQXRCLHNCQUFzQiwyRUN6Q25DLGt1ZUE4WU8sdW5VRGhYSCxtQkFBbUIsODJCQUNuQixrQkFBa0IsMGJBQ2xCLG1CQUFtQixtWUFDbkIscUJBQXFCLDBVQUNyQix5QkFBeUIseUtBQ3pCLG1CQUFtQiw4SkFDbkIsc0JBQXNCOzsyRkFLYixzQkFBc0I7a0JBZmxDLFNBQVM7K0JBQ0UsaUJBQWlCLGNBQ2YsSUFBSSxXQUNQO3dCQUNQLG1CQUFtQjt3QkFDbkIsa0JBQWtCO3dCQUNsQixtQkFBbUI7d0JBQ25CLHFCQUFxQjt3QkFDckIseUJBQXlCO3dCQUN6QixtQkFBbUI7d0JBQ25CLHNCQUFzQjtxQkFDdkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIHNpZ25hbCwgT25Jbml0LCBpbmplY3QsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IENpZGVBZG1FbnRpdHlTZXJ2aWNlIH0gZnJvbSAnLi9jaWRlLWFkbS1lbnRpdHkuc2VydmljZSc7XG5pbXBvcnQgeyBDaWRlSW5wdXRDb21wb25lbnQsIENpZGVTZWxlY3RDb21wb25lbnQsIENpZGVFbGVUYWJDb21wb25lbnQsIFRhYkl0ZW0sIENpZGVFbGVCdXR0b25Db21wb25lbnQgfSBmcm9tICdjbG91ZC1pZGUtZWxlbWVudCc7XG5pbXBvcnQgeyBDaWRlRWxlRmlsZUlucHV0Q29tcG9uZW50LCBDaWRlVGV4dGFyZWFDb21wb25lbnQgfSBmcm9tICdjbG91ZC1pZGUtZWxlbWVudCc7XG5pbXBvcnQgeyBHZW5lcmFsTWFzdGVyU2VsZWN0U2VydmljZSB9IGZyb20gJy4vZ2VuZXJhbC1tYXN0ZXItc2VsZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUGluQ29kZVNlbGVjdFNlcnZpY2UgfSBmcm9tICcuL3Bpbi1jb2RlLXNlbGVjdC5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJTZWxlY3RTZXJ2aWNlIH0gZnJvbSAnLi91c2VyLXNlbGVjdC5zZXJ2aWNlJztcbmltcG9ydCB7IEN1cnJlbmN5U2VsZWN0U2VydmljZSB9IGZyb20gJy4vY3VycmVuY3ktc2VsZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ291bnRyeVNlbGVjdFNlcnZpY2UgfSBmcm9tICcuL2NvdW50cnktc2VsZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tbW9uU2VsZWN0LCBJVXNlciwgdXNlclNlbGVjdENvbnRyb2xsZXJSZXNwb25zZSwgcGluQ29kZVNlbGVjdENvbnRyb2xsZXJSZXNwb25zZSwgY3VycmVuY3lMaXN0Q29udHJvbGxlclJlc3BvbnNlLCBJQ29yZVN5Y3IsIGNvdW50cnlMaXN0Q29udHJvbGxlclJlc3BvbnNlLCBJQ29yZVN5Y3RyLCBJQ29yZVN5cGluLCBzZWxlY3RTZWFyY2hUeXBlLCBNUGluQ29kZVNlbGVjdCwgTVN5Y3RyTGlzdCwgTVVzZXJTZWxlY3QsIGVudGl0eUNvbnRyb2xsZXJSZXNwb25zZSwgZW50aXR5UmVzcG9uc2VEYXRhLCBnZW5lcmF0ZU9iamVjdEZyb21TdHJpbmcsIGdlbmVyYWxNYXN0ZXJMaXN0Q29udHJvbGxlclJlc3BvbnNlLCBJQ29yZVN5Z21zIH0gZnJvbSAnY2xvdWQtaWRlLWxtcy1tb2RlbCc7XG5pbXBvcnQgeyBTdWJqZWN0LCBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcblxuXG5pbnRlcmZhY2UgRHJvcGRvd25PcHRpb24ge1xuICB2YWx1ZTogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xufVxuXG4vLyBJbnRlcmZhY2UgZm9yIHBpbiBjb2RlIGRhdGEgc3RydWN0dXJlIHdpdGggYWRkaXRpb25hbCBmaWVsZHNcbmludGVyZmFjZSBQaW5Db2RlRGF0YSBleHRlbmRzIElDb3JlU3lwaW4ge1xuICB2YWx1ZT86IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NpZGUtYWRtLWVudGl0eScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIENpZGVJbnB1dENvbXBvbmVudCxcbiAgICBDaWRlU2VsZWN0Q29tcG9uZW50LFxuICAgIENpZGVUZXh0YXJlYUNvbXBvbmVudCxcbiAgICBDaWRlRWxlRmlsZUlucHV0Q29tcG9uZW50LFxuICAgIENpZGVFbGVUYWJDb21wb25lbnQsXG4gICAgQ2lkZUVsZUJ1dHRvbkNvbXBvbmVudFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vY2lkZS1hZG0tZW50aXR5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2NpZGUtYWRtLWVudGl0eS5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgQ2lkZUFkbUVudGl0eUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLy8gUmVhY3RpdmUgZm9ybVxuICBlbnRpdHlGb3JtOiBGb3JtR3JvdXA7XG5cbiAgZW50aXR5VHlwZXMgPSBzaWduYWw8RHJvcGRvd25PcHRpb25bXT4oW10pO1xuICBjdXJyZW5jaWVzID0gc2lnbmFsPERyb3Bkb3duT3B0aW9uW10+KFtdKTtcbiAgdXNlcnMgPSBzaWduYWw8RHJvcGRvd25PcHRpb25bXT4oW10pO1xuICBwb3N0YWxDb2RlcyA9IHNpZ25hbDxEcm9wZG93bk9wdGlvbltdPihbXSk7XG4gIHBob3RvSWREb2N1bWVudHMgPSBzaWduYWw8RHJvcGRvd25PcHRpb25bXT4oW10pO1xuICBjb3VudHJpZXMgPSBzaWduYWw8RHJvcGRvd25PcHRpb25bXT4oW10pO1xuXG4gIC8vIFN0b3JlIHRoZSBmdWxsIHBpbiBjb2RlIGRhdGEgZm9yIGF1dG8tcG9wdWxhdGlvblxuICBwcml2YXRlIHBpbkNvZGVEYXRhTWFwID0gbmV3IE1hcDxzdHJpbmcsIFBpbkNvZGVEYXRhPigpO1xuICBcbiAgLy8gU3RvcmUgbG9nbyBmaWxlIGZvciB1cGxvYWRcbiAgcHJpdmF0ZSBsb2dvRmlsZT86IEZpbGU7XG5cbiAgbG9hZGluZyA9IHNpZ25hbChmYWxzZSk7XG4gIGVycm9yID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBzdWNjZXNzID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIExvYWRpbmcgc3RhdGVzIGZvciBpbmRpdmlkdWFsIGRyb3Bkb3duc1xuICBwb3N0YWxDb2Rlc0xvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICB1c2Vyc0xvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICBjb3VudHJpZXNMb2FkaW5nID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBFbnRpdHkgbW9kZSBhbmQgSURcbiAgaXNFZGl0TW9kZSA9IHNpZ25hbChmYWxzZSk7XG4gIGVudGl0eUlkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFRhYiBjb25maWd1cmF0aW9uXG4gIGFjdGl2ZVRhYiA9IHNpZ25hbCgnYmFzaWMnKTtcbiAgZW50aXR5VGFicyA9IHNpZ25hbDxUYWJJdGVtW10+KFtcbiAgICB7IGlkOiAnYmFzaWMnLCBsYWJlbDogJ0Jhc2ljIEluZm9ybWF0aW9uJywgaWNvbjogJ+KEue+4jycgfSxcbiAgICB7IGlkOiAnY29ycG9yYXRlJywgbGFiZWw6ICdDb3Jwb3JhdGUgQWRkcmVzcycsIGljb246ICfwn4+iJyB9LFxuICAgIHsgaWQ6ICdjb250YWN0JywgbGFiZWw6ICdDb250YWN0IEluZm9ybWF0aW9uJywgaWNvbjogJ/Cfk6cnIH0sXG4gICAgeyBpZDogJ3JlZ2lzdGVyZWQnLCBsYWJlbDogJ1JlZ2lzdGVyZWQgQWRkcmVzcycsIGljb246ICfwn4+gJyB9LFxuICAgIHsgaWQ6ICdkb2N1bWVudHMnLCBsYWJlbDogJ0RvY3VtZW50cyAmIE1lZGlhJywgaWNvbjogJ/Cfk4QnIH1cbiAgXSk7XG5cbiAgLy8gTW9kZXJuIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHVzaW5nIGluamVjdCgpXG4gIHByaXZhdGUgZW50aXR5U2VydmljZSA9IGluamVjdChDaWRlQWRtRW50aXR5U2VydmljZSk7XG4gIHByaXZhdGUgZ2VuZXJhbE1hc3RlclNlcnZpY2UgPSBpbmplY3QoR2VuZXJhbE1hc3RlclNlbGVjdFNlcnZpY2UpO1xuICBwcml2YXRlIHBpbkNvZGVTZXJ2aWNlID0gaW5qZWN0KFBpbkNvZGVTZWxlY3RTZXJ2aWNlKTtcbiAgcHJpdmF0ZSB1c2VyU2VydmljZSA9IGluamVjdChVc2VyU2VsZWN0U2VydmljZSk7XG4gIHByaXZhdGUgY3VycmVuY3lTZXJ2aWNlID0gaW5qZWN0KEN1cnJlbmN5U2VsZWN0U2VydmljZSk7XG4gIHByaXZhdGUgY291bnRyeVNlcnZpY2UgPSBpbmplY3QoQ291bnRyeVNlbGVjdFNlcnZpY2UpO1xuICBwcml2YXRlIGZiID0gaW5qZWN0KEZvcm1CdWlsZGVyKTtcbiAgcHJpdmF0ZSByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG5cbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgZ2xvYmFsRXJyb3JIYW5kbGVyPzogKGV2ZW50OiBFcnJvckV2ZW50KSA9PiB2b2lkO1xuICBwcml2YXRlIGdsb2JhbFJlamVjdGlvbkhhbmRsZXI/OiAoZXZlbnQ6IFByb21pc2VSZWplY3Rpb25FdmVudCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmVudGl0eUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIC8vIEJhc2ljIEluZm9ybWF0aW9uXG4gICAgICBzeWVuX25hbWU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIHN5ZW5fZW50aXR5X2NvZGU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDQwKV1dLFxuICAgICAgc3llbl9lbnRpdHlfdHlwZV9nbXN0OiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBzeWVuX3VkaXNlX25vOiBbJyddLFxuICAgICAgc3llbl9hZmZpbGlhdGlvbl9ubzogWycnXSxcbiAgICAgIHN5ZW5faXNhY3RpdmU6IFt0cnVlXSxcblxuICAgICAgLy8gQ29ycG9yYXRlIEFkZHJlc3NcbiAgICAgIHN5ZW5fY29ycG9yYXRlX2FkZHJlc3M6IFsnJ10sXG4gICAgICBzeWVuX2NvcnBvcmF0ZV9jaXR5X3N5cGluOiBbJyddLFxuICAgICAgc3llbl9jb3Jwb3JhdGVfc3RhdGVfc3lwaW46IFsnJ10sXG4gICAgICBzeWVuX2NvcnBvcmF0ZV9jb3VudHJ5X3N5Y3RyOiBbJyddLFxuICAgICAgc3llbl9jb3Jwb3JhdGVfcGluX3N5cGluOiBbJyddLFxuXG4gICAgICAvLyBDb250YWN0IEluZm9ybWF0aW9uXG4gICAgICBzeWVuX2NvcnBvcmF0ZV9jb250YWN0X3BlcnNvbl91c2VyOiBbJyddLFxuICAgICAgc3llbl9jb3Jwb3JhdGVfcGhvbmU6IFsnJ10sXG4gICAgICBzeWVuX2NvcnBvcmF0ZV9waG9uZV9hbHQ6IFsnJ10sXG4gICAgICBzeWVuX2NvcnBvcmF0ZV9mYXg6IFsnJ10sXG4gICAgICBzeWVuX2NvcnBvcmF0ZV9lbWFpbDogWycnLCBbVmFsaWRhdG9ycy5lbWFpbF1dLFxuICAgICAgc3llbl9jb3Jwb3JhdGVfZW1haWxfYWx0OiBbJycsIFtWYWxpZGF0b3JzLmVtYWlsXV0sXG4gICAgICBzeWVuX3dlYnNpdGU6IFsnJywgW1ZhbGlkYXRvcnMucGF0dGVybigvXmh0dHBzPzpcXC9cXC8uKy8pXV0sXG4gICAgICBzeWVuX2N1cnJlbmN5X3N5Y3I6IFsnJ10sXG5cbiAgICAgIC8vIFJlZ2lzdGVyZWQgQWRkcmVzc1xuICAgICAgc3llbl9yZWdpc3RlcmVkX2FkZHJlc3M6IFsnJ10sXG4gICAgICBzeWVuX3JlZ2lzdGVyZWRfY2l0eV9zeXBpbjogWycnXSxcbiAgICAgIHN5ZW5fcmVnaXN0ZXJlZF9zdGF0ZV9zeXBpbjogWycnXSxcbiAgICAgIHN5ZW5fcmVnaXN0ZXJlZF9jb3VudHJ5X3N5Y3RyOiBbJyddLFxuICAgICAgc3llbl9yZWdpc3RlcmVkX3Bpbl9zeXBpbjogWycnXSxcbiAgICAgIHN5ZW5fcmVnaXN0ZXJlZF9jb250YWN0X3BlcnNvbl91c2VyOiBbJyddLFxuICAgICAgc3llbl9yZWdpc3RlcmVkX3Bob25lOiBbJyddLFxuICAgICAgc3llbl9yZWdpc3RlcmVkX2VtYWlsOiBbJycsIFtWYWxpZGF0b3JzLmVtYWlsXV0sXG4gICAgICBzeWVuX3JlZ2lzdGVyZWRfZmF4OiBbJyddLFxuXG4gICAgICAvLyBEb2N1bWVudHNcbiAgICAgIHN5ZW5fcGhvdG9faWRfY3lmbTogWycnXVxuICAgIH0pO1xuXG4gICAgLy8gTGlzdGVuIGZvciBwb3N0YWwgY29kZSBjaGFuZ2VzIHRvIGF1dG8tcG9wdWxhdGUgYWRkcmVzcyBmaWVsZHNcbiAgICB0aGlzLnNldHVwUG9zdGFsQ29kZUxpc3RlbmVycygpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gQWRkIGdsb2JhbCBlcnJvciBoYW5kbGVyIHRvIGNhdGNoIGFueSB1bmhhbmRsZWQgZXJyb3JzXG4gICAgY29uc3QgZXJyb3JIYW5kbGVyID0gKGV2ZW50OiBFcnJvckV2ZW50KSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKCfwn5KlIEdMT0JBTCBFUlJPUjonLCBldmVudC5lcnJvcik7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlamVjdGlvbkhhbmRsZXIgPSAoZXZlbnQ6IFByb21pc2VSZWplY3Rpb25FdmVudCkgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcign8J+SpSBVTkhBTkRMRUQgUFJPTUlTRSBSRUpFQ1RJT046JywgZXZlbnQucmVhc29uKTtcbiAgICB9O1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZXJyb3JIYW5kbGVyKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndW5oYW5kbGVkcmVqZWN0aW9uJywgcmVqZWN0aW9uSGFuZGxlcik7XG5cbiAgICAvLyBTdG9yZSBoYW5kbGVycyBmb3IgY2xlYW51cFxuICAgIHRoaXMuZ2xvYmFsRXJyb3JIYW5kbGVyID0gZXJyb3JIYW5kbGVyO1xuICAgIHRoaXMuZ2xvYmFsUmVqZWN0aW9uSGFuZGxlciA9IHJlamVjdGlvbkhhbmRsZXI7XG5cbiAgICAvLyBDaGVjayBmb3IgZW50aXR5IElEIGluIHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICB0aGlzLmNoZWNrRm9yRW50aXR5SWQoKTtcbiAgICBcbiAgICB0aGlzLmxvYWREcm9wZG93bnMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIC8vIENsZWFuIHVwIGdsb2JhbCBldmVudCBsaXN0ZW5lcnNcbiAgICBpZiAodGhpcy5nbG9iYWxFcnJvckhhbmRsZXIpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIHRoaXMuZ2xvYmFsRXJyb3JIYW5kbGVyKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ2xvYmFsUmVqZWN0aW9uSGFuZGxlcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3VuaGFuZGxlZHJlamVjdGlvbicsIHRoaXMuZ2xvYmFsUmVqZWN0aW9uSGFuZGxlcik7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXAgUnhKUyBzdWJzY3JpcHRpb25zXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIGVudGl0eSBJRCBpbiBxdWVyeSBwYXJhbWV0ZXJzXG4gIHByaXZhdGUgY2hlY2tGb3JFbnRpdHlJZCgpIHtcbiAgICBjb25zb2xlLmxvZygn8J+UjSBDaGVja2luZyBmb3IgZW50aXR5IElEIGluIHF1ZXJ5IHBhcmFtZXRlcnMnLCB0aGlzLnJvdXRlLnBhcmFtcyk7XG4gICAgdGhpcy5yb3V0ZS5wYXJhbXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZShwYXJhbXMgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ/CflI0gUXVlcnkgcGFyYW1zOicsIHBhcmFtcyk7XG4gICAgICAvLyBDaGVjayBmb3IgZW50aXR5SWQsIGlkLCBvciBlbnRpdHkgcGFyYW1ldGVyXG4gICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHBhcmFtc1sncXVlcnknXTtcbiAgICAgIGNvbnN0IHF1ZXJ5RGF0YSA9IGdlbmVyYXRlT2JqZWN0RnJvbVN0cmluZyhxdWVyeVBhcmFtcyk7XG5cbiAgICAgIC8vIElmIGVudGl0eUlkIGlzIGFuIG9iamVjdCBzdHJpbmcgKGZyb20gZ2VuZXJhdGVTdHJpbmdGcm9tT2JqZWN0KSwgdHJ5IHRvIHBhcnNlIGl0XG4gICAgICBjb25zdCBlbnRpdHlJZCA9IHF1ZXJ5RGF0YS5zeWVuX2lkO1xuICAgICAgaWYgKGVudGl0eUlkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCfwn5SNIEVudGl0eSBJRCBmb3VuZCBpbiBxdWVyeSBwYXJhbXM6JywgZW50aXR5SWQpO1xuICAgICAgICB0aGlzLmVudGl0eUlkLnNldChlbnRpdHlJZCk7XG4gICAgICAgIHRoaXMuaXNFZGl0TW9kZS5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMubG9hZEVudGl0eURhdGEoZW50aXR5SWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coJ/CfhpUgTm8gZW50aXR5IElEIGZvdW5kIC0gY3JlYXRpbmcgbmV3IGVudGl0eScpO1xuICAgICAgICB0aGlzLmlzRWRpdE1vZGUuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5lbnRpdHlJZC5zZXQobnVsbCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBMb2FkIGVudGl0eSBkYXRhIGZvciBlZGl0aW5nXG4gIHByaXZhdGUgbG9hZEVudGl0eURhdGEoZW50aXR5SWQ6IHN0cmluZykge1xuICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG5cbiAgICBjb25zb2xlLmxvZygn8J+TpSBMb2FkaW5nIGVudGl0eSBkYXRhIGZvciBJRDonLCBlbnRpdHlJZCk7XG5cbiAgICB0aGlzLmVudGl0eVNlcnZpY2UuZ2V0RW50aXR5QnlJZChlbnRpdHlJZCkucGlwZShcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXNwb25zZTogZW50aXR5Q29udHJvbGxlclJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCfinIUgRW50aXR5IGRhdGEgbG9hZGVkOicsIHJlc3BvbnNlKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChyZXNwb25zZT8uc3VjY2VzcyAmJiByZXNwb25zZT8uZGF0YSkge1xuICAgICAgICAgIC8vIEhhbmRsZSBib3RoIGFycmF5IGFuZCBzaW5nbGUgb2JqZWN0IHJlc3BvbnNlc1xuICAgICAgICAgIGNvbnN0IGVudGl0eURhdGEgPSBBcnJheS5pc0FycmF5KHJlc3BvbnNlLmRhdGEpID8gcmVzcG9uc2UuZGF0YVswXSA6IHJlc3BvbnNlLmRhdGE7XG4gICAgICAgICAgaWYgKGVudGl0eURhdGEpIHtcbiAgICAgICAgICAgIHRoaXMucG9wdWxhdGVGb3JtV2l0aEVudGl0eURhdGEoZW50aXR5RGF0YSk7XG4gICAgICAgICAgICB0aGlzLnN1Y2Nlc3Muc2V0KCdFbnRpdHkgZGF0YSBsb2FkZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3Iuc2V0KCdFbnRpdHkgZGF0YSBub3QgZm91bmQnKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBFbnRpdHkgZGF0YSBub3QgZm91bmQgaW4gcmVzcG9uc2U6JywgcmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVycm9yLnNldCgnRmFpbGVkIHRvIGxvYWQgZW50aXR5IGRhdGEnKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRW50aXR5IGRhdGEgcmVzcG9uc2UgaW52YWxpZDonLCByZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcign4p2MIEZhaWxlZCB0byBsb2FkIGVudGl0eSBkYXRhOicsIGVycik7XG4gICAgICAgIFxuICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gJ0ZhaWxlZCB0byBsb2FkIGVudGl0eSBkYXRhLic7XG4gICAgICAgIFxuICAgICAgICBpZiAoZXJyPy5lcnJvcj8ubWVzc2FnZSkge1xuICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGVyci5lcnJvci5tZXNzYWdlO1xuICAgICAgICB9IGVsc2UgaWYgKGVycj8ubWVzc2FnZSkge1xuICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGVyci5tZXNzYWdlO1xuICAgICAgICB9IGVsc2UgaWYgKGVycj8uc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAnRW50aXR5IG5vdCBmb3VuZC4nO1xuICAgICAgICB9IGVsc2UgaWYgKGVycj8uc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAnU2VydmVyIGVycm9yLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLic7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRoaXMuZXJyb3Iuc2V0KGVycm9yTWVzc2FnZSk7XG4gICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gUG9wdWxhdGUgZm9ybSB3aXRoIGVudGl0eSBkYXRhXG4gIHByaXZhdGUgcG9wdWxhdGVGb3JtV2l0aEVudGl0eURhdGEoZW50aXR5RGF0YTogZW50aXR5UmVzcG9uc2VEYXRhKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnNvbGUubG9nKCfwn5OdIFBvcHVsYXRpbmcgZm9ybSB3aXRoIGVudGl0eSBkYXRhOicsIGVudGl0eURhdGEpO1xuXG4gICAgICAvLyBNYXAgdGhlIGVudGl0eSBkYXRhIHRvIGZvcm0gY29udHJvbHMgLSBvbmx5IHVzZSBwcm9wZXJ0aWVzIHRoYXQgZXhpc3QgaW4gZW50aXR5UmVzcG9uc2VEYXRhXG4gICAgICBjb25zdCBmb3JtRGF0YSA9IHtcbiAgICAgICAgLy8gQmFzaWMgSW5mb3JtYXRpb25cbiAgICAgICAgc3llbl9uYW1lOiBlbnRpdHlEYXRhLnN5ZW5fbmFtZSB8fCAnJyxcbiAgICAgICAgc3llbl9lbnRpdHlfY29kZTogZW50aXR5RGF0YS5zeWVuX2VudGl0eV9jb2RlIHx8ICcnLFxuICAgICAgICBzeWVuX2VudGl0eV90eXBlX2dtc3Q6IGVudGl0eURhdGEuc3llbl9lbnRpdHlfdHlwZV9nbXN0IHx8ICcnLFxuICAgICAgICBzeWVuX2lzYWN0aXZlOiBlbnRpdHlEYXRhLnN5ZW5faXNhY3RpdmUgIT09IHVuZGVmaW5lZCA/IGVudGl0eURhdGEuc3llbl9pc2FjdGl2ZSA6IHRydWUsXG5cbiAgICAgICAgLy8gQ29udGFjdCBJbmZvcm1hdGlvbiAob25seSBwcm9wZXJ0aWVzIHRoYXQgZXhpc3QgaW4gZW50aXR5UmVzcG9uc2VEYXRhKVxuICAgICAgICBzeWVuX2NvcnBvcmF0ZV9jb250YWN0X3BlcnNvbl91c2VyOiBlbnRpdHlEYXRhLnN5ZW5fY29ycG9yYXRlX2NvbnRhY3RfcGVyc29uX3VzZXIgfHwgJycsXG4gICAgICAgIHN5ZW5fY29ycG9yYXRlX3Bob25lOiBlbnRpdHlEYXRhLnN5ZW5fY29ycG9yYXRlX3Bob25lIHx8ICcnLFxuICAgICAgICBzeWVuX2NvcnBvcmF0ZV9lbWFpbDogZW50aXR5RGF0YS5zeWVuX2NvcnBvcmF0ZV9lbWFpbCB8fCAnJyxcblxuICAgICAgICAvLyBTZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIG90aGVyIGZpZWxkcyBzaW5jZSB0aGV5J3JlIG5vdCBpbiBlbnRpdHlSZXNwb25zZURhdGFcbiAgICAgICAgc3llbl91ZGlzZV9ubzogZW50aXR5RGF0YS5zeWVuX3VkaXNlX25vIHx8ICcnLFxuICAgICAgICBzeWVuX2FmZmlsaWF0aW9uX25vOiBlbnRpdHlEYXRhLnN5ZW5fYWZmaWxpYXRpb25fbm8gfHwgJycsXG4gICAgICAgIHN5ZW5fY29ycG9yYXRlX2FkZHJlc3M6IGVudGl0eURhdGEuc3llbl9jb3Jwb3JhdGVfYWRkcmVzcyB8fCAnJyxcbiAgICAgICAgc3llbl9jb3Jwb3JhdGVfY2l0eV9zeXBpbjogZW50aXR5RGF0YS5zeWVuX2NvcnBvcmF0ZV9jaXR5X3N5cGluIHx8ICcnLFxuICAgICAgICBzeWVuX2NvcnBvcmF0ZV9zdGF0ZV9zeXBpbjogZW50aXR5RGF0YS5zeWVuX2NvcnBvcmF0ZV9zdGF0ZV9zeXBpbiB8fCAnJyxcbiAgICAgICAgc3llbl9jb3Jwb3JhdGVfY291bnRyeV9zeWN0cjogZW50aXR5RGF0YS5zeWVuX2NvcnBvcmF0ZV9jb3VudHJ5X3N5Y3RyIHx8ICcnLFxuICAgICAgICBzeWVuX2NvcnBvcmF0ZV9waW5fc3lwaW46IGVudGl0eURhdGEuc3llbl9jb3Jwb3JhdGVfcGluX3N5cGluIHx8ICcnLFxuICAgICAgICBzeWVuX2NvcnBvcmF0ZV9waG9uZV9hbHQ6IGVudGl0eURhdGEuc3llbl9jb3Jwb3JhdGVfcGhvbmVfYWx0IHx8ICcnLFxuICAgICAgICBzeWVuX2NvcnBvcmF0ZV9mYXg6IGVudGl0eURhdGEuc3llbl9jb3Jwb3JhdGVfZmF4IHx8ICcnLFxuICAgICAgICBzeWVuX2NvcnBvcmF0ZV9lbWFpbF9hbHQ6IGVudGl0eURhdGEuc3llbl9jb3Jwb3JhdGVfZW1haWxfYWx0IHx8ICcnLFxuICAgICAgICBzeWVuX3dlYnNpdGU6IGVudGl0eURhdGEuc3llbl93ZWJzaXRlIHx8ICcnLFxuICAgICAgICBzeWVuX2N1cnJlbmN5X3N5Y3I6IGVudGl0eURhdGEuc3llbl9jdXJyZW5jeV9zeWNyIHx8ICcnLFxuICAgICAgICBzeWVuX3JlZ2lzdGVyZWRfYWRkcmVzczogZW50aXR5RGF0YS5zeWVuX3JlZ2lzdGVyZWRfYWRkcmVzcyB8fCAnJyxcbiAgICAgICAgc3llbl9yZWdpc3RlcmVkX2NpdHlfc3lwaW46IGVudGl0eURhdGEuc3llbl9yZWdpc3RlcmVkX2NpdHlfc3lwaW4gfHwgJycgICAgICxcbiAgICAgICAgc3llbl9yZWdpc3RlcmVkX3N0YXRlX3N5cGluOiBlbnRpdHlEYXRhLnN5ZW5fcmVnaXN0ZXJlZF9zdGF0ZV9zeXBpbiB8fCAnJyxcbiAgICAgICAgc3llbl9yZWdpc3RlcmVkX2NvdW50cnlfc3ljdHI6IGVudGl0eURhdGEuc3llbl9yZWdpc3RlcmVkX2NvdW50cnlfc3ljdHIgfHwgJycsXG4gICAgICAgIHN5ZW5fcmVnaXN0ZXJlZF9waW5fc3lwaW46IGVudGl0eURhdGEuc3llbl9yZWdpc3RlcmVkX3Bpbl9zeXBpbiB8fCAnJyxcbiAgICAgICAgc3llbl9yZWdpc3RlcmVkX2NvbnRhY3RfcGVyc29uX3VzZXI6IGVudGl0eURhdGEuc3llbl9yZWdpc3RlcmVkX2NvbnRhY3RfcGVyc29uX3VzZXIgfHwgJycsXG4gICAgICAgIHN5ZW5fcmVnaXN0ZXJlZF9waG9uZTogZW50aXR5RGF0YS5zeWVuX3JlZ2lzdGVyZWRfcGhvbmUgfHwgJycsXG4gICAgICAgIHN5ZW5fcmVnaXN0ZXJlZF9lbWFpbDogZW50aXR5RGF0YS5zeWVuX3JlZ2lzdGVyZWRfZW1haWwgfHwgJycsXG4gICAgICAgIHN5ZW5fcmVnaXN0ZXJlZF9mYXg6IGVudGl0eURhdGEuc3llbl9yZWdpc3RlcmVkX2ZheCB8fCAnJyxcbiAgICAgICAgc3llbl9waG90b19pZF9jeWZtOiBlbnRpdHlEYXRhLnN5ZW5fcGhvdG9faWRfY3lmbSB8fCAnJ1xuICAgICAgfTtcblxuICAgICAgLy8gUGF0Y2ggdGhlIGZvcm0gd2l0aCB0aGUgZW50aXR5IGRhdGFcbiAgICAgIHRoaXMuZW50aXR5Rm9ybS5wYXRjaFZhbHVlKGZvcm1EYXRhLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG5cbiAgICAgIGNvbnNvbGUubG9nKCfinIUgRm9ybSBwb3B1bGF0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ/CfkqUgRXJyb3IgcG9wdWxhdGluZyBmb3JtIHdpdGggZW50aXR5IGRhdGE6JywgZXJyb3IpO1xuICAgICAgdGhpcy5lcnJvci5zZXQoJ0Vycm9yIGxvYWRpbmcgZW50aXR5IGRhdGEgaW50byBmb3JtJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0dXAgbGlzdGVuZXJzIGZvciBwb3N0YWwgY29kZSBjaGFuZ2VzXG4gIHByaXZhdGUgc2V0dXBQb3N0YWxDb2RlTGlzdGVuZXJzKCkge1xuICAgIC8vIENvcnBvcmF0ZSBwb3N0YWwgY29kZSBsaXN0ZW5lclxuICAgIHRoaXMuZW50aXR5Rm9ybS5nZXQoJ3N5ZW5fY29ycG9yYXRlX3Bpbl9zeXBpbicpPy52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICkuc3Vic2NyaWJlKHBpbkNvZGVJZCA9PiB7XG4gICAgICBpZiAocGluQ29kZUlkKSB7XG4gICAgICAgIHRoaXMucG9wdWxhdGVBZGRyZXNzRnJvbVBpbkNvZGUocGluQ29kZUlkLCAnY29ycG9yYXRlJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBSZWdpc3RlcmVkIHBvc3RhbCBjb2RlIGxpc3RlbmVyXG4gICAgdGhpcy5lbnRpdHlGb3JtLmdldCgnc3llbl9yZWdpc3RlcmVkX3Bpbl9zeXBpbicpPy52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICkuc3Vic2NyaWJlKHBpbkNvZGVJZCA9PiB7XG4gICAgICBpZiAocGluQ29kZUlkKSB7XG4gICAgICAgIHRoaXMucG9wdWxhdGVBZGRyZXNzRnJvbVBpbkNvZGUocGluQ29kZUlkLCAncmVnaXN0ZXJlZCcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gQXV0by1wb3B1bGF0ZSBhZGRyZXNzIGZpZWxkcyBiYXNlZCBvbiBzZWxlY3RlZCBwb3N0YWwgY29kZVxuICBwcml2YXRlIHBvcHVsYXRlQWRkcmVzc0Zyb21QaW5Db2RlKHBpbkNvZGVJZDogc3RyaW5nLCBhZGRyZXNzVHlwZTogJ2NvcnBvcmF0ZScgfCAncmVnaXN0ZXJlZCcpIHtcbiAgICBjb25zdCBwaW5Db2RlRGF0YSA9IHRoaXMucGluQ29kZURhdGFNYXAuZ2V0KHBpbkNvZGVJZCk7XG4gICAgY29uc29sZS5sb2coJ/CflI0gUGluIENvZGUgRGF0YTonLCBwaW5Db2RlRGF0YSk7XG4gICAgaWYgKCFwaW5Db2RlRGF0YSkge1xuICAgICAgY29uc29sZS53YXJuKGBQaW4gY29kZSBkYXRhIG5vdCBmb3VuZCBmb3IgSUQ6ICR7cGluQ29kZUlkfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByZWZpeCA9IGFkZHJlc3NUeXBlID09PSAnY29ycG9yYXRlJyA/ICdzeWVuX2NvcnBvcmF0ZScgOiAnc3llbl9yZWdpc3RlcmVkJztcblxuICAgIC8vIFBvcHVsYXRlIGNpdHksIHN0YXRlLCBhbmQgY291bnRyeSBmaWVsZHNcbiAgICB0aGlzLmVudGl0eUZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICBbYCR7cHJlZml4fV9jaXR5X3N5cGluYF06IHBpbkNvZGVEYXRhLnN5cGluX2Rpc3RyaWN0IHx8ICcnLFxuICAgICAgW2Ake3ByZWZpeH1fc3RhdGVfc3lwaW5gXTogcGluQ29kZURhdGEuc3lwaW5fc3RhdGVfbmFtZSB8fCAnJyxcbiAgICAgIFtgJHtwcmVmaXh9X2NvdW50cnlfc3ljdHJgXTogcGluQ29kZURhdGEuc3lwaW5fY291bnRyeV9pZF9zeWN0ciB8fCAnJ1xuICAgIH0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcblxuICAgIGNvbnNvbGUubG9nKGDwn5ONIEF1dG8tcG9wdWxhdGVkICR7YWRkcmVzc1R5cGV9IGFkZHJlc3MgZnJvbSBwaW4gY29kZTpgLCB7XG4gICAgICBjaXR5OiBwaW5Db2RlRGF0YS5zeXBpbl9kaXN0cmljdCxcbiAgICAgIHN0YXRlOiBwaW5Db2RlRGF0YS5zeXBpbl9zdGF0ZV9uYW1lLFxuICAgICAgY291bnRyeTogcGluQ29kZURhdGEuc3lwaW5fY291bnRyeV9pZF9zeWN0clxuICAgIH0pO1xuICB9XG5cbiAgbG9hZERyb3Bkb3ducygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc29sZS5sb2coJ/CfmoAgTG9hZGluZyBkcm9wZG93bnMuLi4nKTtcblxuICAgICAgLy8gTG9hZCBlbnRpdHkgdHlwZXMgdmlhIGdlbmVyYWwgbWFzdGVyIHNlcnZpY2VcbiAgICAgIHRoaXMuZ2VuZXJhbE1hc3RlclNlcnZpY2UuZ2V0R2VuZXJhbE1hc3RlckJ5Q29kZSgnY29yZV9lbnRpdHlfdHlwZScpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygn4pyFIEVudGl0eSB0eXBlcyByZXNwb25zZTonLCByZXNwb25zZSk7XG4gICAgICAgICAgICBjb25zdCB0eXBlcyA9IHRoaXMudHJhbnNmb3JtR2VuZXJhbE1hc3RlclRvRHJvcGRvd24ocmVzcG9uc2UpO1xuICAgICAgICAgICAgdGhpcy5lbnRpdHlUeXBlcy5zZXQodHlwZXMpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ/Cfk4sgTG9hZGVkIGVudGl0eSB0eXBlczonLCB0eXBlcy5sZW5ndGgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCfwn5KlIEVudGl0eSB0eXBlcyB0cmFuc2Zvcm0gZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5lbnRpdHlUeXBlcy5zZXQoW10pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRmFpbGVkIHRvIGxvYWQgZW50aXR5IHR5cGVzOicsIGVycik7XG4gICAgICAgICAgdGhpcy5lbnRpdHlUeXBlcy5zZXQoW10pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTG9hZCBjdXJyZW5jaWVzIHZpYSBjdXJyZW5jeSBzZXJ2aWNlXG4gICAgICB0aGlzLmN1cnJlbmN5U2VydmljZS5nZXRBbGxDdXJyZW5jaWVzKHt9KS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ+KchSBDdXJyZW5jaWVzIHJlc3BvbnNlOicsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbmNpZXMgPSB0aGlzLnRyYW5zZm9ybUN1cnJlbmN5VG9Ecm9wZG93bihyZXNwb25zZSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbmNpZXMuc2V0KGN1cnJlbmNpZXMpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ/CfkrAgTG9hZGVkIGN1cnJlbmNpZXM6JywgY3VycmVuY2llcy5sZW5ndGgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCfwn5KlIEN1cnJlbmNpZXMgdHJhbnNmb3JtIGVycm9yOicsIGVycm9yKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVuY2llcy5zZXQoW10pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRmFpbGVkIHRvIGxvYWQgY3VycmVuY2llczonLCBlcnIpO1xuICAgICAgICAgIHRoaXMuY3VycmVuY2llcy5zZXQoW10pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTG9hZCB1c2VycyB2aWEgdXNlciBzZXJ2aWNlXG4gICAgICB0aGlzLnVzZXJTZXJ2aWNlLmdldEFsbFVzZXJzKCkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCfinIUgVXNlcnMgcmVzcG9uc2U6JywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgY29uc3QgdXNlcnMgPSB0aGlzLnRyYW5zZm9ybVVzZXJUb0Ryb3Bkb3duKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHRoaXMudXNlcnMuc2V0KHVzZXJzKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCfwn5GlIExvYWRlZCB1c2VyczonLCB1c2Vycy5sZW5ndGgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCfwn5KlIFVzZXJzIHRyYW5zZm9ybSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgICAgICB0aGlzLnVzZXJzLnNldChbXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBGYWlsZWQgdG8gbG9hZCB1c2VyczonLCBlcnIpO1xuICAgICAgICAgIHRoaXMudXNlcnMuc2V0KFtdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExvYWQgcG9zdGFsIGNvZGVzIHZpYSBwaW4gY29kZSBzZXJ2aWNlXG4gICAgICB0aGlzLnBpbkNvZGVTZXJ2aWNlLmdldEFsbFBvc3RhbENvZGVzKCkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCfinIUgUG9zdGFsIGNvZGVzIHJlc3BvbnNlOicsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIGNvbnN0IHBvc3RhbENvZGVzID0gdGhpcy50cmFuc2Zvcm1QaW5Db2RlVG9Ecm9wZG93bihyZXNwb25zZSk7XG4gICAgICAgICAgICB0aGlzLnBvc3RhbENvZGVzLnNldChwb3N0YWxDb2Rlcyk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygn8J+TriBMb2FkZWQgcG9zdGFsIGNvZGVzOicsIHBvc3RhbENvZGVzLmxlbmd0aCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ/CfkqUgUG9zdGFsIGNvZGVzIHRyYW5zZm9ybSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgICAgICB0aGlzLnBvc3RhbENvZGVzLnNldChbXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBGYWlsZWQgdG8gbG9hZCBwb3N0YWwgY29kZXM6JywgZXJyKTtcbiAgICAgICAgICB0aGlzLnBvc3RhbENvZGVzLnNldChbXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMb2FkIHBob3RvIElEIGRvY3VtZW50cyB2aWEgZ2VuZXJhbCBtYXN0ZXIgc2VydmljZVxuICAgICAgdGhpcy5nZW5lcmFsTWFzdGVyU2VydmljZS5nZXRHZW5lcmFsTWFzdGVyQnlDb2RlKCdjb3JlX3Bob3RvX2lkX2RvY3VtZW50Jykuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCfinIUgUGhvdG8gSUQgZG9jdW1lbnRzIHJlc3BvbnNlOicsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50cyA9IHRoaXMudHJhbnNmb3JtR2VuZXJhbE1hc3RlclRvRHJvcGRvd24ocmVzcG9uc2UpO1xuICAgICAgICAgICAgdGhpcy5waG90b0lkRG9jdW1lbnRzLnNldChkb2N1bWVudHMpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ/Cfk4QgTG9hZGVkIHBob3RvIElEIGRvY3VtZW50czonLCBkb2N1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcign8J+SpSBQaG90byBJRCBkb2N1bWVudHMgdHJhbnNmb3JtIGVycm9yOicsIGVycm9yKTtcbiAgICAgICAgICAgIHRoaXMucGhvdG9JZERvY3VtZW50cy5zZXQoW10pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRmFpbGVkIHRvIGxvYWQgcGhvdG8gSUQgZG9jdW1lbnRzOicsIGVycik7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gc3RhdGljIGRhdGFcbiAgICAgICAgICB0aGlzLnBob3RvSWREb2N1bWVudHMuc2V0KFtcbiAgICAgICAgICAgIHsgdmFsdWU6ICdwYXNzcG9ydCcsIGxhYmVsOiAnUGFzc3BvcnQnIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnbGljZW5zZScsIGxhYmVsOiAnRHJpdmVyIExpY2Vuc2UnIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnbmF0aW9uYWxfaWQnLCBsYWJlbDogJ05hdGlvbmFsIElEJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJ3ZvdGVyX2lkJywgbGFiZWw6ICdWb3RlciBJRCcgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICdvdGhlcicsIGxhYmVsOiAnT3RoZXInIH1cbiAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExvYWQgY291bnRyaWVzIHZpYSBjb3VudHJ5IHNlcnZpY2VcbiAgICAgIHRoaXMuY291bnRyeVNlcnZpY2UuZ2V0QWxsQ291bnRyaWVzKHt9KS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ+KchSBDb3VudHJpZXMgcmVzcG9uc2U6JywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgY29uc3QgY291bnRyaWVzID0gdGhpcy50cmFuc2Zvcm1Db3VudHJ5VG9Ecm9wZG93bihyZXNwb25zZSk7XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllcy5zZXQoY291bnRyaWVzKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCfwn4yNIExvYWRlZCBjb3VudHJpZXM6JywgY291bnRyaWVzLmxlbmd0aCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ/CfkqUgQ291bnRyaWVzIHRyYW5zZm9ybSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllcy5zZXQoW10pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRmFpbGVkIHRvIGxvYWQgY291bnRyaWVzOicsIGVycik7XG4gICAgICAgICAgdGhpcy5jb3VudHJpZXMuc2V0KFtdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ/CfkqUgTE9BRERST1BET1dOUyBFWENFUFRJT046JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gdHJhbnNmb3JtIGdlbmVyYWwgbWFzdGVyIHJlc3BvbnNlIHRvIGRyb3Bkb3duIG9wdGlvbnNcbiAgcHJpdmF0ZSB0cmFuc2Zvcm1HZW5lcmFsTWFzdGVyVG9Ecm9wZG93bihyZXNwb25zZTogZ2VuZXJhbE1hc3Rlckxpc3RDb250cm9sbGVyUmVzcG9uc2UpOiBEcm9wZG93bk9wdGlvbltdIHtcbiAgICBpZiAoIXJlc3BvbnNlPy5zdWNjZXNzIHx8ICFyZXNwb25zZT8uZGF0YSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGxldCBkYXRhQXJyYXk6IElDb3JlU3lnbXNbXSA9IFtdO1xuXG4gICAgLy8gSGFuZGxlIGRpZmZlcmVudCByZXNwb25zZSBzdHJ1Y3R1cmVzIC0gYWxsIGdlbmVyYWwgbWFzdGVyIGRhdGEgaXMgaW4gY29yZV9nZW5lcmFsX21hc3RlclxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3BvbnNlLmRhdGEpKSB7XG4gICAgICBkYXRhQXJyYXkgPSByZXNwb25zZS5kYXRhO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhQXJyYXkubWFwKChpdGVtOiBJQ29yZVN5Z21zLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAvLyBBUEkgcmVzcG9uc2UgYWxyZWFkeSBpbmNsdWRlcyB2YWx1ZSBhbmQgbGFiZWwgZmllbGRzXG4gICAgICAgIHZhbHVlOiAoaXRlbSBhcyB7IHZhbHVlPzogc3RyaW5nIH0pLnZhbHVlIHx8IGl0ZW0uX2lkIHx8IGB2YWx1ZV8ke2luZGV4fWAsXG4gICAgICAgIGxhYmVsOiAoaXRlbSBhcyB7IGxhYmVsPzogc3RyaW5nIH0pLmxhYmVsIHx8IGl0ZW0uc3lnbXNfdGl0bGUgfHwgJ1VudGl0bGVkJ1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gdHJhbnNmb3JtIGN1cnJlbmN5IHJlc3BvbnNlIHRvIGRyb3Bkb3duIG9wdGlvbnNcbiAgcHJpdmF0ZSB0cmFuc2Zvcm1DdXJyZW5jeVRvRHJvcGRvd24ocmVzcG9uc2U6IGN1cnJlbmN5TGlzdENvbnRyb2xsZXJSZXNwb25zZSk6IERyb3Bkb3duT3B0aW9uW10ge1xuICAgIGlmICghcmVzcG9uc2U/LnN1Y2Nlc3MgfHwgIXJlc3BvbnNlPy5kYXRhKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ/CflI0gQ3VycmVuY3kgUmVzcG9uc2U6JywgcmVzcG9uc2UpO1xuXG4gICAgLy8gSGFuZGxlIGRpZmZlcmVudCByZXNwb25zZSBzdHJ1Y3R1cmVzXG4gICAgbGV0IGRhdGFBcnJheTogSUNvcmVTeWNyW10gPSBbXTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3BvbnNlLmRhdGEpKSB7XG4gICAgICBkYXRhQXJyYXkgPSByZXNwb25zZS5kYXRhO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhQXJyYXkubWFwKChpdGVtOiBJQ29yZVN5Y3IpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBpdGVtLl9pZCxcbiAgICAgICAgbGFiZWw6IGAke2l0ZW0uc3ljcl9jb2RlfSAtICR7aXRlbS5zeWNyX25hbWV9ICgke2l0ZW0uc3ljcl9zeW1ib2x9KWBcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIHRyYW5zZm9ybSB1c2VyIHJlc3BvbnNlIHRvIGRyb3Bkb3duIG9wdGlvbnNcbiAgcHJpdmF0ZSB0cmFuc2Zvcm1Vc2VyVG9Ecm9wZG93bihyZXNwb25zZTogdXNlclNlbGVjdENvbnRyb2xsZXJSZXNwb25zZSk6IERyb3Bkb3duT3B0aW9uW10ge1xuICAgIGlmICghcmVzcG9uc2U/LnN1Y2Nlc3MgfHwgIXJlc3BvbnNlPy5kYXRhKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgbGV0IGRhdGFBcnJheTogKENvbW1vblNlbGVjdCAmIElVc2VyKVtdID0gW107XG5cbiAgICAvLyBIYW5kbGUgZGlmZmVyZW50IHJlc3BvbnNlIHN0cnVjdHVyZXNcbiAgICBpZiAocmVzcG9uc2UuZGF0YS5hdXRoX3VzZXJfbXN0KSB7XG4gICAgICBkYXRhQXJyYXkgPSByZXNwb25zZS5kYXRhLmF1dGhfdXNlcl9tc3Q7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlc3BvbnNlLmRhdGEpKSB7XG4gICAgICBkYXRhQXJyYXkgPSByZXNwb25zZS5kYXRhO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhQXJyYXkubWFwKChpdGVtOiBDb21tb25TZWxlY3QgJiBJVXNlcikgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IGl0ZW0uX2lkIHx8IFwiXCIsXG4gICAgICAgIGxhYmVsOiBpdGVtPy51c2VyX2Z1bGxuYW1lIHx8IFwiXCJcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIHRyYW5zZm9ybSBwaW4gY29kZSByZXNwb25zZSB0byBkcm9wZG93biBvcHRpb25zXG4gIHByaXZhdGUgdHJhbnNmb3JtUGluQ29kZVRvRHJvcGRvd24ocmVzcG9uc2U6IHBpbkNvZGVTZWxlY3RDb250cm9sbGVyUmVzcG9uc2UpOiBEcm9wZG93bk9wdGlvbltdIHtcbiAgICBpZiAoIXJlc3BvbnNlPy5zdWNjZXNzIHx8ICFyZXNwb25zZT8uZGF0YSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBsZXQgZGF0YUFycmF5OiBQaW5Db2RlRGF0YVtdID0gW107XG5cbiAgICAvLyBIYW5kbGUgZGlmZmVyZW50IHJlc3BvbnNlIHN0cnVjdHVyZXNcbiAgICBpZiAoJ2NvcmVfcGluX2NvZGUnIGluIHJlc3BvbnNlLmRhdGEgJiYgcmVzcG9uc2UuZGF0YS5jb3JlX3Bpbl9jb2RlKSB7XG4gICAgICBkYXRhQXJyYXkgPSByZXNwb25zZS5kYXRhLmNvcmVfcGluX2NvZGU7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgdGhlIGRhdGEgbWFwIGFuZCByZWJ1aWxkIGl0XG4gICAgdGhpcy5waW5Db2RlRGF0YU1hcC5jbGVhcigpO1xuXG4gICAgcmV0dXJuIGRhdGFBcnJheS5tYXAoKGl0ZW06IFBpbkNvZGVEYXRhKSA9PiB7XG4gICAgICBjb25zdCBwaW5Db2RlSWQgPSBTdHJpbmcoaXRlbS5faWQpO1xuICAgICAgLy8gU3RvcmUgdGhlIGZ1bGwgcGluIGNvZGUgZGF0YSBmb3IgYXV0by1wb3B1bGF0aW9uXG4gICAgICB0aGlzLnBpbkNvZGVEYXRhTWFwLnNldChwaW5Db2RlSWQsIGl0ZW0pO1xuXG4gICAgICAvLyBBUEkgcmVzcG9uc2UgYWxyZWFkeSBpbmNsdWRlcyB2YWx1ZSBhbmQgbGFiZWwgZmllbGRzXG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogcGluQ29kZUlkLFxuICAgICAgICBsYWJlbDogYCR7aXRlbS5zeXBpbl9waW5jb2RlfSAtICR7aXRlbS5zeXBpbl9vZmZpY2VfbmFtZSB8fCAnVW5rbm93biBPZmZpY2UnfWBcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIHRyYW5zZm9ybSBjb3VudHJ5IHJlc3BvbnNlIHRvIGRyb3Bkb3duIG9wdGlvbnNcbiAgcHJpdmF0ZSB0cmFuc2Zvcm1Db3VudHJ5VG9Ecm9wZG93bihyZXNwb25zZTogY291bnRyeUxpc3RDb250cm9sbGVyUmVzcG9uc2UpOiBEcm9wZG93bk9wdGlvbltdIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFyZXNwb25zZT8uc3VjY2VzcyB8fCAhcmVzcG9uc2U/LmRhdGEpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCfimqDvuI8gQ291bnRyeSByZXNwb25zZSBtaXNzaW5nIHN1Y2Nlc3Mgb3IgZGF0YTonLCByZXNwb25zZSk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coJ/CflI0gQ291bnRyeSBSZXNwb25zZTonLCByZXNwb25zZSk7XG5cbiAgICAgIGxldCBkYXRhQXJyYXk6IElDb3JlU3ljdHJbXSA9IFtdO1xuXG4gICAgICAvLyBIYW5kbGUgZGlmZmVyZW50IHJlc3BvbnNlIHN0cnVjdHVyZXNcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3BvbnNlLmRhdGEpKSB7XG4gICAgICAgIGRhdGFBcnJheSA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgZGF0YUFycmF5ID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coJ/CflI0gQ291bnRyeSBkYXRhIGFycmF5IGxlbmd0aDonLCBkYXRhQXJyYXkubGVuZ3RoKTtcblxuICAgICAgcmV0dXJuIGRhdGFBcnJheS5tYXAoKGl0ZW06IElDb3JlU3ljdHIpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2YWx1ZTogaXRlbS5faWQgfHwgXCJcIixcbiAgICAgICAgICBsYWJlbDogYCR7aXRlbS5zeWN0cl9jb3VudHJ5X2lzb19uYW1lIHx8ICdVbmtub3duJ30gKCR7aXRlbS5zeWN0cl9jb3VudHJ5X2lzb19jb2RlX3R3b19jaGFyIHx8ICdYWCd9KWBcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCfwn5KlIENPVU5UUlkgVFJBTlNGT1JNIEVYQ0VQVElPTjonLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgZm9ybSBjb250cm9sXG4gIGdldENvbnRyb2woY29udHJvbE5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmVudGl0eUZvcm0uZ2V0KGNvbnRyb2xOYW1lKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBwb3N0YWwgY29kZSBzZWFyY2ggd2l0aCBkZWJvdW5jaW5nXG4gIG9uUG9zdGFsQ29kZVNlYXJjaChldmVudDogc2VsZWN0U2VhcmNoVHlwZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmxvZygn8J+UjSBQT1NUQUwgQ09ERSBTRUFSQ0ggRVZFTlQ6JywgZXZlbnQpO1xuXG4gICAgICAvLyBTZXQgbG9hZGluZyBzdGF0ZVxuICAgICAgdGhpcy5wb3N0YWxDb2Rlc0xvYWRpbmcuc2V0KHRydWUpO1xuXG4gICAgICBjb25zdCBwYXlsb2FkOiBNUGluQ29kZVNlbGVjdCA9IHtcbiAgICAgICAgc3lwaW5fcGluY29kZTogZXZlbnQucXVlcnkgfHwgXCJcIixcbiAgICAgICAgc3lwaW5faWQ6IGV2ZW50LnZhbHVlIGFzIHN0cmluZyB8fCBcIlwiXG4gICAgICB9O1xuICAgICAgY29uc29sZS5sb2coJ/CflI0gUE9TVEFMIENPREUgUEFZTE9BRDonLCBwYXlsb2FkKTtcblxuICAgICAgdGhpcy5waW5Db2RlU2VydmljZS5zZWFyY2hQaW5Db2RlcyhwYXlsb2FkKS5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICAgICkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ+KchSBQT1NUQUwgQ09ERSBTRUFSQ0ggU1VDQ0VTUzonLCByZXNwb25zZSk7XG4gICAgICAgICAgY29uc3QgcG9zdGFsQ29kZXMgPSB0aGlzLnRyYW5zZm9ybVBpbkNvZGVUb0Ryb3Bkb3duKHJlc3BvbnNlKTtcbiAgICAgICAgICB0aGlzLnBvc3RhbENvZGVzLnNldChwb3N0YWxDb2Rlcyk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ/Cfk64gVXBkYXRlZCBwb3N0YWwgY29kZXMgY291bnQ6JywgcG9zdGFsQ29kZXMubGVuZ3RoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgUE9TVEFMIENPREUgU0VBUkNIIEVSUk9SOicsIGVycik7XG4gICAgICAgICAgdGhpcy5wb3N0YWxDb2Rlcy5zZXQoW10pO1xuICAgICAgICB9LFxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAgIC8vIENsZWFyIGxvYWRpbmcgc3RhdGVcbiAgICAgICAgICB0aGlzLnBvc3RhbENvZGVzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcign8J+SpSBQT1NUQUwgQ09ERSBTRUFSQ0ggRVhDRVBUSU9OOicsIGVycm9yKTtcbiAgICAgIHRoaXMucG9zdGFsQ29kZXMuc2V0KFtdKTtcbiAgICAgIHRoaXMucG9zdGFsQ29kZXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIHVzZXIgc2VhcmNoXG4gIG9uVXNlclNlYXJjaChldmVudDogc2VsZWN0U2VhcmNoVHlwZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmxvZygn8J+UjSBVU0VSIFNFQVJDSCBFVkVOVDonLCBldmVudCk7XG4gICAgICBcbiAgICAgIC8vIFNldCBsb2FkaW5nIHN0YXRlXG4gICAgICB0aGlzLnVzZXJzTG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgICBcbiAgICAgIGNvbnN0IHBheWxvYWQ6IFBhcnRpYWw8TVVzZXJTZWxlY3Q+ID0ge1xuICAgICAgICB1c2VyX2Z1bGxuYW1lOiBldmVudD8ucXVlcnkgfHwgXCJcIixcbiAgICAgICAgdXNlcl9pZDogZXZlbnQ/LnZhbHVlIGFzIHN0cmluZyB8fCBcIlwiLFxuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coJ/CflI0gVVNFUiBTRUFSQ0ggUEFZTE9BRDonLCBwYXlsb2FkKTtcblxuICAgICAgdGhpcy51c2VyU2VydmljZS5zZWFyY2hVc2Vyc0J5RnVsbG5hbWUocGF5bG9hZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ+KchSBVU0VSIFNFQVJDSCBTVUNDRVNTOicsIHJlc3BvbnNlKTtcbiAgICAgICAgICBjb25zdCB1c2VycyA9IHRoaXMudHJhbnNmb3JtVXNlclRvRHJvcGRvd24ocmVzcG9uc2UpO1xuICAgICAgICAgIHRoaXMudXNlcnMuc2V0KHVzZXJzKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygn8J+RpSBVcGRhdGVkIHVzZXJzIGNvdW50OicsIHVzZXJzLmxlbmd0aCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcign4p2MIFVTRVIgU0VBUkNIIEVSUk9SOicsIGVycik7XG4gICAgICAgICAgdGhpcy51c2Vycy5zZXQoW10pO1xuICAgICAgICB9LFxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAgIC8vIENsZWFyIGxvYWRpbmcgc3RhdGVcbiAgICAgICAgICB0aGlzLnVzZXJzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcign8J+SpSBVU0VSIFNFQVJDSCBFWENFUFRJT046JywgZXJyb3IpO1xuICAgICAgdGhpcy51c2Vycy5zZXQoW10pO1xuICAgICAgdGhpcy51c2Vyc0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvLyBIYW5kbGUgY291bnRyeSBzZWFyY2hcbiAgb25Db3VudHJ5U2VhcmNoKGV2ZW50OiBzZWxlY3RTZWFyY2hUeXBlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnNvbGUubG9nKCfwn5SNIENPVU5UUlkgU0VBUkNIIEVWRU5UOicsIGV2ZW50KTtcbiAgICAgIFxuICAgICAgLy8gU2V0IGxvYWRpbmcgc3RhdGVcbiAgICAgIHRoaXMuY291bnRyaWVzTG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgICBcbiAgICAgIGNvbnN0IHBheWxvYWQ6IFBhcnRpYWw8TVN5Y3RyTGlzdD4gPSB7XG4gICAgICAgIHF1ZXJ5OiBldmVudC5xdWVyeSxcbiAgICAgICAgc3ljdHJfaWQ6IGV2ZW50LnZhbHVlIGFzIHN0cmluZyxcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKCfwn5SNIENPVU5UUlkgU0VBUkNIIFBBWUxPQUQ6JywgcGF5bG9hZCk7XG5cbiAgICAgIHRoaXMuY291bnRyeVNlcnZpY2UuZ2V0QWxsQ291bnRyaWVzKHBheWxvYWQpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCfinIUgQ09VTlRSWSBTRUFSQ0ggU1VDQ0VTUzonLCByZXNwb25zZSk7XG4gICAgICAgICAgY29uc3QgY291bnRyaWVzID0gdGhpcy50cmFuc2Zvcm1Db3VudHJ5VG9Ecm9wZG93bihyZXNwb25zZSk7XG4gICAgICAgICAgdGhpcy5jb3VudHJpZXMuc2V0KGNvdW50cmllcyk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ/CfjI0gVXBkYXRlZCBjb3VudHJpZXMgY291bnQ6JywgY291bnRyaWVzLmxlbmd0aCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcign4p2MIENPVU5UUlkgU0VBUkNIIEVSUk9SOicsIGVycik7XG4gICAgICAgICAgdGhpcy5jb3VudHJpZXMuc2V0KFtdKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgICAvLyBDbGVhciBsb2FkaW5nIHN0YXRlXG4gICAgICAgICAgdGhpcy5jb3VudHJpZXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCfwn5KlIENPVU5UUlkgU0VBUkNIIEVYQ0VQVElPTjonLCBlcnJvcik7XG4gICAgICB0aGlzLmNvdW50cmllcy5zZXQoW10pO1xuICAgICAgdGhpcy5jb3VudHJpZXNMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIHBvc3RhbCBjb2RlIHNlbGVjdGlvblxuICBvblBvc3RhbENvZGVTZWxlY3Rpb24oZXZlbnQ6IEV2ZW50IHwgc3RyaW5nKSB7XG4gICAgbGV0IHBpbkNvZGVJZCA9ICcnO1xuICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwaW5Db2RlSWQgPSBldmVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50O1xuICAgICAgcGluQ29kZUlkID0gdGFyZ2V0Py52YWx1ZSB8fCAnJztcbiAgICB9XG4gICAgY29uc29sZS5sb2coJ/Cfk40gUG9zdGFsIENvZGUgU2VsZWN0ZWQ6JywgcGluQ29kZUlkKTtcbiAgICAvLyBUaGUgYXV0by1wb3B1bGF0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIGZvcm0gdmFsdWUgY2hhbmdlIGxpc3RlbmVyc1xuICAgIC8vIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGZvciBhZGRpdGlvbmFsIGxvZ2ljIGlmIG5lZWRlZFxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgYSBmaWVsZCBoYXMgYW4gZXJyb3JcbiAgaGFzRXJyb3IoY29udHJvbE5hbWU6IHN0cmluZywgZXJyb3JUeXBlPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZ2V0Q29udHJvbChjb250cm9sTmFtZSk7XG4gICAgaWYgKCFjb250cm9sKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoZXJyb3JUeXBlKSB7XG4gICAgICByZXR1cm4gY29udHJvbC5oYXNFcnJvcihlcnJvclR5cGUpICYmIChjb250cm9sLmRpcnR5IHx8IGNvbnRyb2wudG91Y2hlZCk7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sLmludmFsaWQgJiYgKGNvbnRyb2wuZGlydHkgfHwgY29udHJvbC50b3VjaGVkKTtcbiAgfVxuXG4gIC8vIEdldCBlcnJvciBtZXNzYWdlIGZvciBhIGZpZWxkXG4gIGdldEVycm9yTWVzc2FnZShjb250cm9sTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5nZXRDb250cm9sKGNvbnRyb2xOYW1lKTtcbiAgICBpZiAoIWNvbnRyb2wgfHwgIWNvbnRyb2wuZXJyb3JzKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCBmaWVsZE5hbWUgPSBjb250cm9sTmFtZS5yZXBsYWNlKCdzeWVuXycsICcnKS5yZXBsYWNlKC9fL2csICcgJykucmVwbGFjZSgvXFxiXFx3L2csIGwgPT4gbC50b1VwcGVyQ2FzZSgpKTtcblxuICAgIGlmIChjb250cm9sLmhhc0Vycm9yKCdyZXF1aXJlZCcpKSB7XG4gICAgICByZXR1cm4gYCR7ZmllbGROYW1lfSBpcyByZXF1aXJlZGA7XG4gICAgfVxuICAgIGlmIChjb250cm9sLmhhc0Vycm9yKCdtYXhsZW5ndGgnKSkge1xuICAgICAgcmV0dXJuIGBNYXhpbXVtIGxlbmd0aCBpcyAke2NvbnRyb2wuZXJyb3JzWydtYXhsZW5ndGgnXS5yZXF1aXJlZExlbmd0aH0gY2hhcmFjdGVyc2A7XG4gICAgfVxuICAgIGlmIChjb250cm9sLmhhc0Vycm9yKCdlbWFpbCcpKSB7XG4gICAgICByZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MnO1xuICAgIH1cbiAgICBpZiAoY29udHJvbC5oYXNFcnJvcigncGF0dGVybicpKSB7XG4gICAgICByZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIFVSTCBzdGFydGluZyB3aXRoIGh0dHA6Ly8gb3IgaHR0cHM6Ly8nO1xuICAgIH1cbiAgICByZXR1cm4gJ0ludmFsaWQgaW5wdXQnO1xuICB9XG5cbiAgLy8gR2V0IGZvcm0gdmFsaWRhdGlvbiBzdW1tYXJ5XG4gIGdldEZvcm1WYWxpZGF0aW9uU3VtbWFyeSgpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIE9iamVjdC5rZXlzKHRoaXMuZW50aXR5Rm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZW50aXR5Rm9ybS5nZXQoa2V5KTtcbiAgICAgIGlmIChjb250cm9sICYmIGNvbnRyb2wuaW52YWxpZCAmJiAoY29udHJvbC5kaXJ0eSB8fCBjb250cm9sLnRvdWNoZWQpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGtleSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICAvLyBDaGVjayBpZiBmb3JtIGlzIHZhbGlkXG4gIGdldCBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lbnRpdHlGb3JtLnZhbGlkO1xuICB9XG5cbiAgLy8gR2V0IGN1cnJlbnQgbW9kZSBmb3IgZGlzcGxheVxuICBnZXQgY3VycmVudE1vZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pc0VkaXRNb2RlKCkgPyAnRWRpdCcgOiAnQ3JlYXRlJztcbiAgfVxuXG4gIC8vIEdldCBjdXJyZW50IGVudGl0eSBJRCBmb3IgZGlzcGxheVxuICBnZXQgY3VycmVudEVudGl0eUlkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmVudGl0eUlkKCk7XG4gIH1cblxuICBvbkZpbGVDaGFuZ2UoZXZlbnQ6IEZpbGVMaXN0IHwgbnVsbCkge1xuICAgIGlmIChldmVudCAmJiBldmVudC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmxvZ29GaWxlID0gZXZlbnRbMF07XG4gICAgICBjb25zb2xlLmxvZygn77+977+9IExvZ28gRmlsZSBTZWxlY3RlZDonLCB0aGlzLmxvZ29GaWxlLm5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZ29GaWxlID0gdW5kZWZpbmVkO1xuICAgICAgY29uc29sZS5sb2coJ/Cfk4QgTm8gbG9nbyBmaWxlIHNlbGVjdGVkLicpO1xuICAgIH1cbiAgfVxuXG4gIG9uVGFiQ2hhbmdlKHRhYjogVGFiSXRlbSkge1xuICAgIHRoaXMuYWN0aXZlVGFiLnNldCh0YWIuaWQpO1xuICB9XG5cbiAgb25TdWJtaXQoKSB7XG4gICAgaWYgKHRoaXMuZW50aXR5Rm9ybS52YWxpZCkge1xuICAgICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xuICAgICAgdGhpcy5zdWNjZXNzLnNldChudWxsKTtcblxuICAgICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLmVudGl0eUZvcm0udmFsdWU7XG4gICAgICBjb25zdCBpc0VkaXQgPSB0aGlzLmlzRWRpdE1vZGUoKTtcbiAgICAgIGNvbnN0IGVudGl0eUlkID0gdGhpcy5lbnRpdHlJZCgpO1xuXG4gICAgICBjb25zb2xlLmxvZyhg8J+PoiBFTlRJVFkgJHtpc0VkaXQgPyAnVVBEQVRFJyA6ICdDUkVBVEUnfTogRm9ybSBkYXRhOmAsIGZvcm1EYXRhKTtcblxuICAgICAgLy8gVmFsaWRhdGUgcmVxdWlyZWQgZmllbGRzIGJlZm9yZSBzdWJtaXNzaW9uXG4gICAgICBjb25zdCByZXF1aXJlZEZpZWxkcyA9IFsnc3llbl9uYW1lJywgJ3N5ZW5fZW50aXR5X2NvZGUnLCAnc3llbl9lbnRpdHlfdHlwZV9nbXN0J107XG4gICAgICBjb25zdCBtaXNzaW5nRmllbGRzID0gcmVxdWlyZWRGaWVsZHMuZmlsdGVyKGZpZWxkID0+ICFmb3JtRGF0YVtmaWVsZF0pO1xuICAgICAgXG4gICAgICBpZiAobWlzc2luZ0ZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuZXJyb3Iuc2V0KGBNaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogJHttaXNzaW5nRmllbGRzLmpvaW4oJywgJyl9YCk7XG4gICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBlbnRpdHkgSUQgdG8gZm9ybSBkYXRhIGlmIGluIGVkaXQgbW9kZVxuICAgICAgaWYgKGlzRWRpdCAmJiBlbnRpdHlJZCkge1xuICAgICAgICBmb3JtRGF0YS5faWQgPSBlbnRpdHlJZDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2F2ZU9wZXJhdGlvbiA9IHRoaXMuZW50aXR5U2VydmljZS5zYXZlVXBkYXRlRW50aXR5KGZvcm1EYXRhKTtcblxuICAgICAgc2F2ZU9wZXJhdGlvbi5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhg4pyFIEVOVElUWSAke2lzRWRpdCA/ICdVUERBVEUnIDogJ0NSRUFURSd9IFNVQ0NFU1M6YCwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAocmVzcG9uc2U/LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3VjY2Vzc01lc3NhZ2UgPSBpc0VkaXQgXG4gICAgICAgICAgICAgICAgPyAnRW50aXR5IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IScgXG4gICAgICAgICAgICAgICAgOiAnRW50aXR5IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5ISc7XG4gICAgICAgICAgICAgIHRoaXMuc3VjY2Vzcy5zZXQoc3VjY2Vzc01lc3NhZ2UpO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBlbnRpdHkgSUQgaWYgaXQncyBhIG5ldyBlbnRpdHlcbiAgICAgICAgICAgICAgaWYgKCFpc0VkaXQgJiYgcmVzcG9uc2U/LmRhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHlEYXRhID0gQXJyYXkuaXNBcnJheShyZXNwb25zZS5kYXRhKSA/IHJlc3BvbnNlLmRhdGFbMF0gOiByZXNwb25zZS5kYXRhO1xuICAgICAgICAgICAgICAgIGlmIChlbnRpdHlEYXRhPy5faWQpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZW50aXR5SWQuc2V0KGVudGl0eURhdGEuX2lkKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaXNFZGl0TW9kZS5zZXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBPcHRpb25hbGx5IHJlZGlyZWN0IHRvIGxpc3Qgb3Igc3RheSBvbiBmb3JtXG4gICAgICAgICAgICAgIC8vIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2FkbWluL2VudGl0aWVzJ10pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5lcnJvci5zZXQocmVzcG9uc2U/Lm1lc3NhZ2UgfHwgYEZhaWxlZCB0byAke2lzRWRpdCA/ICd1cGRhdGUnIDogJ2NyZWF0ZSd9IGVudGl0eS4gUGxlYXNlIHRyeSBhZ2Fpbi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYOKdjCBFTlRJVFkgJHtpc0VkaXQgPyAnVVBEQVRFJyA6ICdDUkVBVEUnfSBFUlJPUjpgLCBlcnIpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gYEZhaWxlZCB0byAke2lzRWRpdCA/ICd1cGRhdGUnIDogJ3NhdmUnfSBlbnRpdHkgc2V0dGluZ3MuYDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGVycj8uZXJyb3I/Lm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZXJyLmVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVycj8ubWVzc2FnZSkge1xuICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBlcnIubWVzc2FnZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyPy5zdGF0dXMgPT09IDQwMCkge1xuICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAnSW52YWxpZCBkYXRhIHByb3ZpZGVkLiBQbGVhc2UgY2hlY2sgeW91ciBpbnB1dC4nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlcnI/LnN0YXR1cyA9PT0gNDA0ICYmIGlzRWRpdCkge1xuICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAnRW50aXR5IG5vdCBmb3VuZC4gSXQgbWF5IGhhdmUgYmVlbiBkZWxldGVkLic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVycj8uc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ0VudGl0eSB3aXRoIHRoaXMgY29kZSBhbHJlYWR5IGV4aXN0cy4gUGxlYXNlIHVzZSBhIGRpZmZlcmVudCBjb2RlLic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVycj8uc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ1NlcnZlciBlcnJvci4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLmVycm9yLnNldChlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTWFyayBhbGwgZmllbGRzIGFzIHRvdWNoZWQgdG8gc2hvdyB2YWxpZGF0aW9uIGVycm9yc1xuICAgICAgdGhpcy5lbnRpdHlGb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICAgIFxuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IHRoaXMuZ2V0Rm9ybVZhbGlkYXRpb25TdW1tYXJ5KCk7XG4gICAgICBjb25zb2xlLndhcm4oJ+KaoO+4jyBGT1JNIFZBTElEQVRJT04gRVJST1JTOicsIHZhbGlkYXRpb25FcnJvcnMpO1xuICAgICAgXG4gICAgICB0aGlzLmVycm9yLnNldChgUGxlYXNlIGZpeCB0aGUgZm9sbG93aW5nIGVycm9yczogJHt2YWxpZGF0aW9uRXJyb3JzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICB9XG5cbiAgb25SZXNldCgpIHtcbiAgICAvLyBDbGVhciBsb2dvIGZpbGVcbiAgICB0aGlzLmxvZ29GaWxlID0gdW5kZWZpbmVkO1xuICAgIFxuICAgIC8vIFJlc2V0IGZvcm0gdG8gaW5pdGlhbCB2YWx1ZXNcbiAgICB0aGlzLmVudGl0eUZvcm0ucmVzZXQoe1xuICAgICAgc3llbl9uYW1lOiAnJyxcbiAgICAgIHN5ZW5fZW50aXR5X3R5cGVfZ21zdDogJycsXG4gICAgICBzeWVuX2VudGl0eV9jb2RlOiAnJyxcbiAgICAgIHN5ZW5fdWRpc2Vfbm86ICcnLFxuICAgICAgc3llbl9hZmZpbGlhdGlvbl9ubzogJycsXG4gICAgICBzeWVuX2lzYWN0aXZlOiB0cnVlLFxuICAgICAgc3llbl9jb3Jwb3JhdGVfYWRkcmVzczogJycsXG4gICAgICBzeWVuX2NvcnBvcmF0ZV9waW5fc3lwaW46ICcnLFxuICAgICAgc3llbl9jb3Jwb3JhdGVfY2l0eV9zeXBpbjogJycsXG4gICAgICBzeWVuX2NvcnBvcmF0ZV9zdGF0ZV9zeXBpbjogJycsXG4gICAgICBzeWVuX2NvcnBvcmF0ZV9jb3VudHJ5X3N5Y3RyOiAnJyxcbiAgICAgIHN5ZW5fY29ycG9yYXRlX2NvbnRhY3RfcGVyc29uX3VzZXI6ICcnLFxuICAgICAgc3llbl9jb3Jwb3JhdGVfcGhvbmU6ICcnLFxuICAgICAgc3llbl9jb3Jwb3JhdGVfcGhvbmVfYWx0OiAnJyxcbiAgICAgIHN5ZW5fY29ycG9yYXRlX2ZheDogJycsXG4gICAgICBzeWVuX2NvcnBvcmF0ZV9lbWFpbDogJycsXG4gICAgICBzeWVuX2NvcnBvcmF0ZV9lbWFpbF9hbHQ6ICcnLFxuICAgICAgc3llbl93ZWJzaXRlOiAnJyxcbiAgICAgIHN5ZW5fY3VycmVuY3lfc3ljcjogJycsXG4gICAgICBzeWVuX3JlZ2lzdGVyZWRfYWRkcmVzczogJycsXG4gICAgICBzeWVuX3JlZ2lzdGVyZWRfcGluX3N5cGluOiAnJyxcbiAgICAgIHN5ZW5fcmVnaXN0ZXJlZF9jaXR5X3N5cGluOiAnJyxcbiAgICAgIHN5ZW5fcmVnaXN0ZXJlZF9zdGF0ZV9zeXBpbjogJycsXG4gICAgICBzeWVuX3JlZ2lzdGVyZWRfY291bnRyeV9zeWN0cjogJycsXG4gICAgICBzeWVuX3JlZ2lzdGVyZWRfY29udGFjdF9wZXJzb25fdXNlcjogJycsXG4gICAgICBzeWVuX3JlZ2lzdGVyZWRfcGhvbmU6ICcnLFxuICAgICAgc3llbl9yZWdpc3RlcmVkX2ZheDogJycsXG4gICAgICBzeWVuX3JlZ2lzdGVyZWRfZW1haWw6ICcnLFxuICAgICAgc3llbl9waG90b19pZF9jeWZtOiAnJ1xuICAgIH0pO1xuICAgIFxuICAgIHRoaXMuc3VjY2Vzcy5zZXQobnVsbCk7XG4gICAgdGhpcy5lcnJvci5zZXQobnVsbCk7XG4gICAgY29uc29sZS5sb2coJ/CflIQgRm9ybSByZXNldCBjb21wbGV0ZWQnKTtcbiAgfVxufSAiLCI8IS0tIFxuICBEWU5BTUlDIEdSSUQgU1lTVEVNIEZFQVRVUkVTOlxuICBcbiAgQmFzaWMgR3JpZHM6IGdyaWQtMSwgZ3JpZC0yLCBncmlkLTMsIGdyaWQtNCwgZ3JpZC01LCBncmlkLTZcbiAgXG4gIEF1dG8tZml0IEdyaWRzOiBncmlkLWF1dG8tZml0LXNtL21kL2xnL3hsIChkeW5hbWljIGNvbHVtbnMgYmFzZWQgb24gY29udGVudClcbiAgQXV0by1maWxsIEdyaWRzOiBncmlkLWF1dG8tZmlsbC1zbS9tZC9sZyAoYWx3YXlzIGZpbGwgYXZhaWxhYmxlIHNwYWNlKVxuICBcbiAgQ3VzdG9tIFJhdGlvczogZ3JpZC1yYXRpby0xLTIsIGdyaWQtcmF0aW8tMi0xLCBncmlkLXJhdGlvLTEtMywgZ3JpZC1yYXRpby0zLTEsIGV0Yy5cbiAgRnJhY3Rpb25hbDogZ3JpZC1xdWFydGVyLXRocmVlLCBncmlkLXRoaXJkLXR3bywgZ3JpZC1oYWxmLWhhbGZcbiAgXG4gIEdhcCBDb250cm9sOiBnYXAteHMsIGdhcC1zbSwgZ2FwLW1kLCBnYXAtbGcsIGdhcC14bFxuICBTcGVjaWZpYyBHYXBzOiByb3ctZ2FwLXhzL3NtL21kL2xnLCBjb2wtZ2FwLXhzL3NtL21kL2xnXG4gIFxuICBBbGlnbm1lbnQ6IGFsaWduLXN0YXJ0L2NlbnRlci9lbmQvc3RyZXRjaCwganVzdGlmeS1zdGFydC9jZW50ZXIvZW5kL3N0cmV0Y2hcbiAgXG4gIFJlc3BvbnNpdmU6IHhsLWdyaWQtKiwgbGctZ3JpZC0qLCBtZC1ncmlkLSosIHNtLWdyaWQtKiwgeHMtZ3JpZC0qXG4gIFxuICBHcmlkIEl0ZW1zOiBzcGFuLTEvMi8zLzQvNS82L2Z1bGwsIHJvdy1zcGFuLSosIHN0YXJ0LSosIGVuZC0qXG4gIEl0ZW0gQWxpZ25tZW50OiBzZWxmLXN0YXJ0L2NlbnRlci9lbmQvc3RyZXRjaCwganVzdGlmeS1zZWxmLSpcbiAgXG4gIFNwZWNpYWw6IGdyaWQtZGVuc2UgKGF1dG8tZmlsbHMgZ2FwcyksIGdyaWQtbWFzb25yeSAobWFzb25yeSBsYXlvdXQpXG4tLT5cblxuPGRpdiBjbGFzcz1cImVudGl0eS1mb3JtLWNvbnRhaW5lclwiPlxuICA8Zm9ybSBjbGFzcz1cImVudGl0eS1mb3JtXCIgW2Zvcm1Hcm91cF09XCJlbnRpdHlGb3JtXCIgW2NsYXNzLmxvYWRpbmddPVwibG9hZGluZygpXCIgKG5nU3VibWl0KT1cIm9uU3VibWl0KClcIj5cbiAgICBcbiAgICA8IS0tIEhlYWRlciBTZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWhlYWRlclwiPlxuICAgICAgPGgyIGNsYXNzPVwiZm9ybS10aXRsZVwiPkNyZWF0ZSBOZXcgRW50aXR5PC9oMj5cbiAgICAgIDxwIGNsYXNzPVwiZm9ybS1zdWJ0aXRsZVwiPkFkZCBhIG5ldyBlZHVjYXRpb25hbCBpbnN0aXR1dGlvbiB0byB0aGUgc3lzdGVtPC9wPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTdWNjZXNzIGFuZCBFcnJvciBNZXNzYWdlcyAtLT5cbiAgICBAaWYgKHN1Y2Nlc3MoKSkge1xuICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXN1Y2Nlc3NcIj5cbiAgICAgICAgPHN2ZyBjbGFzcz1cImFsZXJ0LWljb25cIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2Utd2lkdGg9XCIyXCIgZD1cIk01IDEzbDQgNEwxOSA3XCI+PC9wYXRoPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAge3sgc3VjY2VzcygpIH19XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGlmIChlcnJvcigpKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtZXJyb3JcIj5cbiAgICAgICAgPHN2ZyBjbGFzcz1cImFsZXJ0LWljb25cIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2Utd2lkdGg9XCIyXCIgZD1cIk02IDE4TDE4IDZNNiA2bDEyIDEyXCI+PC9wYXRoPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAge3sgZXJyb3IoKSB9fVxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPCEtLSBUYWIgTmF2aWdhdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS10YWJzXCI+XG4gICAgICA8Y2lkZS1lbGUtdGFiIFxuICAgICAgICBbdGFic109XCJlbnRpdHlUYWJzKClcIlxuICAgICAgICBbYWN0aXZlVGFiSWRdPVwiYWN0aXZlVGFiKClcIlxuICAgICAgICBzaXplPVwibWRcIlxuICAgICAgICB2YXJpYW50PVwiZGVmYXVsdFwiXG4gICAgICAgICh0YWJDaGFuZ2UpPVwib25UYWJDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgPC9jaWRlLWVsZS10YWI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFRhYiBDb250ZW50IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJ0YWItY29udGVudFwiXG4gICAgICAgICBbY2xhc3MubG9hZGluZ109XCJsb2FkaW5nKClcIj5cbiAgICAgIEBzd2l0Y2ggKGFjdGl2ZVRhYigpKSB7XG4gICAgICAgIFxuICAgICAgICBAY2FzZSAoJ2Jhc2ljJykge1xuICAgICAgICAgIDwhLS0gQmFzaWMgSW5mb3JtYXRpb24gU2VjdGlvbiAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLWF1dG8tZml0LW1kIGdhcC1tZCBsZy1ncmlkLTIgbWQtZ3JpZC0xXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWl0ZW0gc3Bhbi0yIG1kLXNwYW4tZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBcbiAgICAgICAgICAgICAgICAgIGlkPVwic3llbl9uYW1lXCIgXG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICBsYWJlbD1cIkluc3RpdHV0aW9uIE5hbWVcIiBcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fbmFtZVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGZ1bGwgaW5zdGl0dXRpb24gbmFtZVwiPlxuICAgICAgICAgICAgICAgIDwvY2lkZS1lbGUtaW5wdXQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0IFxuICAgICAgICAgICAgICAgIGxhYmVsPVwiSW5zdGl0dXRpb24gQ29kZVwiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fZW50aXR5X2NvZGVcIlxuICAgICAgICAgICAgICAgIGlkPVwic3llbl9lbnRpdHlfY29kZVwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciB1bmlxdWUgY29kZSAobWF4IDQwIGNoYXJhY3RlcnMpXCI+XG4gICAgICAgICAgICAgIDwvY2lkZS1lbGUtaW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ3JpZC1yYXRpby0yLTEtMSBnYXAtbWQgbGctZ3JpZC0zIG1kLWdyaWQtMiBzbS1ncmlkLTFcIj5cbiAgICAgICAgICAgICAgPGNpZGUtZWxlLXNlbGVjdCBcbiAgICAgICAgICAgICAgICBsYWJlbD1cIkVudGl0eSBUeXBlXCIgXG4gICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZW50aXR5VHlwZXMoKVwiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fZW50aXR5X3R5cGVfZ21zdFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgZW50aXR5IHR5cGVcIj5cbiAgICAgICAgICAgICAgPC9jaWRlLWVsZS1zZWxlY3Q+XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXQgXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJVRElTRSBOdW1iZXJcIiBcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeWVuX3VkaXNlX25vXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIFVESVNFIG51bWJlclwiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0IFxuICAgICAgICAgICAgICAgIGxhYmVsPVwiQWZmaWxpYXRpb24gTnVtYmVyXCIgXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3llbl9hZmZpbGlhdGlvbl9ub1wiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBhZmZpbGlhdGlvbiBudW1iZXJcIj5cbiAgICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLTEgZ2FwLXNtXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveC1maWVsZFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiIFxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeWVuX2lzYWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja2JveC1pbnB1dFwiIC8+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoZWNrYm94LXRleHRcIj5BY3RpdmUgU3RhdHVzPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGVja2JveC1kZXNjcmlwdGlvblwiPkVuYWJsZSB0aGlzIGVudGl0eSBmb3Igc3lzdGVtIG9wZXJhdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBjYXNlICgnY29ycG9yYXRlJykge1xuICAgICAgICAgIDwhLS0gQ29ycG9yYXRlIEFkZHJlc3MgU2VjdGlvbiAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLTEgZ2FwLW1kXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWl0ZW0gc3Bhbi1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGNpZGUtZWxlLXRleHRhcmVhIFxuICAgICAgICAgICAgICAgICAgbGFiZWw9XCJDb3Jwb3JhdGUgQWRkcmVzc1wiIFxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3llbl9jb3Jwb3JhdGVfYWRkcmVzc1wiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGNvbXBsZXRlIGNvcnBvcmF0ZSBhZGRyZXNzXCJcbiAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjNcIj5cbiAgICAgICAgICAgICAgICA8L2NpZGUtZWxlLXRleHRhcmVhPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLWF1dG8tZml0LXNtIGdhcC1sZyB4bC1ncmlkLTQgbGctZ3JpZC0zIG1kLWdyaWQtMiBzbS1ncmlkLTEgYWxpZ24tZW5kXCI+XG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1zZWxlY3QgXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJQb3N0YWwgQ29kZVwiXG4gICAgICAgICAgICAgICAgW29wdGlvbnNdPVwicG9zdGFsQ29kZXMoKVwiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fY29ycG9yYXRlX3Bpbl9zeXBpblwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgcG9zdGFsIGNvZGVcIlxuICAgICAgICAgICAgICAgIFtzZWFyY2hhYmxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtsb2FkaW5nXT1cInBvc3RhbENvZGVzTG9hZGluZygpXCJcbiAgICAgICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uUG9zdGFsQ29kZVNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uUG9zdGFsQ29kZVNlbGVjdGlvbigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDwvY2lkZS1lbGUtc2VsZWN0PlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0IFxuICAgICAgICAgICAgICAgIGxhYmVsPVwiQ2l0eVwiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fY29ycG9yYXRlX2NpdHlfc3lwaW5cIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgY2l0eVwiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0IFxuICAgICAgICAgICAgICAgIGxhYmVsPVwiU3RhdGVcIiBcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeWVuX2NvcnBvcmF0ZV9zdGF0ZV9zeXBpblwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBzdGF0ZVwiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPGNpZGUtZWxlLXNlbGVjdCBcbiAgICAgICAgICAgICAgICBsYWJlbD1cIkNvdW50cnlcIiBcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJjb3VudHJpZXMoKVwiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fY29ycG9yYXRlX2NvdW50cnlfc3ljdHJcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGNvdW50cnlcIlxuICAgICAgICAgICAgICAgIFtzZWFyY2hhYmxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtsb2FkaW5nXT1cImNvdW50cmllc0xvYWRpbmcoKVwiXG4gICAgICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvbkNvdW50cnlTZWFyY2goJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgQGNhc2UgKCdjb250YWN0Jykge1xuICAgICAgICAgIDwhLS0gQ29udGFjdCBJbmZvcm1hdGlvbiBTZWN0aW9uIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtcmF0aW8tMy0xIGdhcC1sZyBtZC1ncmlkLTIgc20tZ3JpZC0xIGp1c3RpZnktc3RyZXRjaFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1pdGVtIGp1c3RpZnktc2VsZi1zdHJldGNoXCI+XG4gICAgICAgICAgICAgICAgPGNpZGUtZWxlLXNlbGVjdCBcbiAgICAgICAgICAgICAgICAgIGxhYmVsPVwiUHJpbWFyeSBDb250YWN0IFBlcnNvblwiXG4gICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJ1c2VycygpXCIgXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeWVuX2NvcnBvcmF0ZV9jb250YWN0X3BlcnNvbl91c2VyXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGNvbnRhY3QgcGVyc29uXCJcbiAgICAgICAgICAgICAgICAgIFtzZWFyY2hhYmxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgW2xvYWRpbmddPVwidXNlcnNMb2FkaW5nKClcIlxuICAgICAgICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblVzZXJTZWFyY2goJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvY2lkZS1lbGUtc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWl0ZW0ganVzdGlmeS1zZWxmLXN0cmV0Y2hcIj5cbiAgICAgICAgICAgICAgICA8Y2lkZS1lbGUtc2VsZWN0IFxuICAgICAgICAgICAgICAgICAgbGFiZWw9XCJDdXJyZW5jeVwiIFxuICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiY3VycmVuY2llcygpXCIgXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeWVuX2N1cnJlbmN5X3N5Y3JcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgY3VycmVuY3lcIj5cbiAgICAgICAgICAgICAgICA8L2NpZGUtZWxlLXNlbGVjdD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ3JpZC1hdXRvLWZpbGwtbWQgZ2FwLW1kIGNvbC1nYXAtbGcgcm93LWdhcC1zbSB4bC1ncmlkLTMgbGctZ3JpZC0yIG1kLWdyaWQtMSBncmlkLWRlbnNlXCI+XG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBcbiAgICAgICAgICAgICAgICBsYWJlbD1cIlByaW1hcnkgUGhvbmVcIiBcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeWVuX2NvcnBvcmF0ZV9waG9uZVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRlbFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBwaG9uZSBudW1iZXJcIj5cbiAgICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBcbiAgICAgICAgICAgICAgICBsYWJlbD1cIkFsdGVybmF0ZSBQaG9uZVwiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fY29ycG9yYXRlX3Bob25lX2FsdFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRlbFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBhbHRlcm5hdGUgcGhvbmVcIj5cbiAgICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBcbiAgICAgICAgICAgICAgICBsYWJlbD1cIkZheCBOdW1iZXJcIiBcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeWVuX2NvcnBvcmF0ZV9mYXhcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgZmF4IG51bWJlclwiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtcmF0aW8tMS0yLTEgZ2FwLXhsIGxnLWdyaWQtMyBtZC1ncmlkLTIgc20tZ3JpZC0xIGFsaWduLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1pdGVtIHNlbGYtc3RyZXRjaFwiPlxuICAgICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBcbiAgICAgICAgICAgICAgICAgIGxhYmVsPVwiUHJpbWFyeSBFbWFpbFwiIFxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3llbl9jb3Jwb3JhdGVfZW1haWxcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImVtYWlsXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgcHJpbWFyeSBlbWFpbFwiPlxuICAgICAgICAgICAgICAgIDwvY2lkZS1lbGUtaW5wdXQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtaXRlbSBzcGFuLTIgbGctc3Bhbi0xIHNlbGYtc3RyZXRjaFwiPlxuICAgICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBcbiAgICAgICAgICAgICAgICAgIGxhYmVsPVwiV2Vic2l0ZSBVUkxcIiBcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fd2Vic2l0ZVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwidXJsXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgd2Vic2l0ZSBVUkxcIj5cbiAgICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWl0ZW0gc2VsZi1zdHJldGNoXCI+XG4gICAgICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0IFxuICAgICAgICAgICAgICAgICAgbGFiZWw9XCJBbHRlcm5hdGUgRW1haWxcIiBcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fY29ycG9yYXRlX2VtYWlsX2FsdFwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiZW1haWxcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBhbHRlcm5hdGUgZW1haWxcIj5cbiAgICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgQGNhc2UgKCdyZWdpc3RlcmVkJykge1xuICAgICAgICAgIDwhLS0gUmVnaXN0ZXJlZCBBZGRyZXNzIFNlY3Rpb24gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ3JpZC0xXCI+XG4gICAgICAgICAgICAgIDxjaWRlLWVsZS10ZXh0YXJlYSBcbiAgICAgICAgICAgICAgICBsYWJlbD1cIlJlZ2lzdGVyZWQgQWRkcmVzc1wiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fcmVnaXN0ZXJlZF9hZGRyZXNzXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGNvbXBsZXRlIHJlZ2lzdGVyZWQgYWRkcmVzc1wiXG4gICAgICAgICAgICAgICAgW3Jvd3NdPVwiM1wiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLXRleHRhcmVhPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtNFwiPlxuICAgICAgICAgICAgICA8Y2lkZS1lbGUtc2VsZWN0IFxuICAgICAgICAgICAgICAgIGxhYmVsPVwiUmVnaXN0ZXJlZCBQb3N0YWwgQ29kZVwiXG4gICAgICAgICAgICAgICAgW29wdGlvbnNdPVwicG9zdGFsQ29kZXMoKVwiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fcmVnaXN0ZXJlZF9waW5fc3lwaW5cIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IHBvc3RhbCBjb2RlXCJcbiAgICAgICAgICAgICAgICBbc2VhcmNoYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbbG9hZGluZ109XCJwb3N0YWxDb2Rlc0xvYWRpbmcoKVwiXG4gICAgICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblBvc3RhbENvZGVTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblBvc3RhbENvZGVTZWxlY3Rpb24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLXNlbGVjdD5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBcbiAgICAgICAgICAgICAgICBsYWJlbD1cIlJlZ2lzdGVyZWQgQ2l0eVwiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fcmVnaXN0ZXJlZF9jaXR5X3N5cGluXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGNpdHlcIj5cbiAgICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBcbiAgICAgICAgICAgICAgICBsYWJlbD1cIlJlZ2lzdGVyZWQgU3RhdGVcIiBcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeWVuX3JlZ2lzdGVyZWRfc3RhdGVfc3lwaW5cIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgc3RhdGVcIj5cbiAgICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1zZWxlY3QgXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJSZWdpc3RlcmVkIENvdW50cnlcIiBcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJjb3VudHJpZXMoKVwiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fcmVnaXN0ZXJlZF9jb3VudHJ5X3N5Y3RyXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBjb3VudHJ5XCJcbiAgICAgICAgICAgICAgICBbc2VhcmNoYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbbG9hZGluZ109XCJjb3VudHJpZXNMb2FkaW5nKClcIlxuICAgICAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25Db3VudHJ5U2VhcmNoKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jaWRlLWVsZS1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ3JpZC0zXCI+XG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1zZWxlY3QgXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJSZWdpc3RlcmVkIENvbnRhY3QgUGVyc29uXCJcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJ1c2VycygpXCIgXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3llbl9yZWdpc3RlcmVkX2NvbnRhY3RfcGVyc29uX3VzZXJcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGNvbnRhY3QgcGVyc29uXCJcbiAgICAgICAgICAgICAgICBbc2VhcmNoYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbbG9hZGluZ109XCJ1c2Vyc0xvYWRpbmcoKVwiXG4gICAgICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblVzZXJTZWFyY2goJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLXNlbGVjdD5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBcbiAgICAgICAgICAgICAgICBsYWJlbD1cIlJlZ2lzdGVyZWQgUGhvbmVcIiBcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeWVuX3JlZ2lzdGVyZWRfcGhvbmVcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZWxcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgcGhvbmUgbnVtYmVyXCI+XG4gICAgICAgICAgICAgIDwvY2lkZS1lbGUtaW5wdXQ+XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXQgXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJSZWdpc3RlcmVkIEVtYWlsXCIgXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3llbl9yZWdpc3RlcmVkX2VtYWlsXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiZW1haWxcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgZW1haWxcIj5cbiAgICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cbiAgICAgICAgICAgICAgQGlmIChoYXNFcnJvcignc3llbl9yZWdpc3RlcmVkX2VtYWlsJykpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPnt7IGdldEVycm9yTWVzc2FnZSgnc3llbl9yZWdpc3RlcmVkX2VtYWlsJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtMVwiPlxuICAgICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXQgXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJSZWdpc3RlcmVkIEZheFwiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fcmVnaXN0ZXJlZF9mYXhcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgZmF4IG51bWJlclwiPlxuICAgICAgICAgICAgICA8L2NpZGUtZWxlLWlucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICBAY2FzZSAoJ2RvY3VtZW50cycpIHtcbiAgICAgICAgICA8IS0tIERvY3VtZW50cyBTZWN0aW9uIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIj5cbiAgICAgICAgICAgIDwhLS0gUGhvdG8gSUQgRG9jdW1lbnQgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLTEgZ2FwLW1kXCI+XG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1zZWxlY3QgXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJQaG90byBJRCBEb2N1bWVudFwiIFxuICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInBob3RvSWREb2N1bWVudHMoKVwiIFxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5ZW5fcGhvdG9faWRfY3lmbVwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgcGhvdG8gSUQgZG9jdW1lbnRcIj5cbiAgICAgICAgICAgICAgPC9jaWRlLWVsZS1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBMb2dvIFVwbG9hZCAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtcXVhcnRlci10aHJlZSBnYXAtbGcgbWQtZ3JpZC0xIGFsaWduLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1pdGVtIHNlbGYtY2VudGVyIGp1c3RpZnktc2VsZi1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8IS0tIExvZ28gcHJldmlldyBwbGFjZWhvbGRlciAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6IDEyMHB4OyBoZWlnaHQ6IDEyMHB4OyBib3JkZXI6IDJweCBkYXNoZWQgI2NiZDVlMTsgYm9yZGVyLXJhZGl1czogOHB4OyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgY29sb3I6ICM5Y2EzYWY7IGZvbnQtc2l6ZTogMC44NzVyZW07IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cbiAgICAgICAgICAgICAgICAgIExvZ28gUHJldmlld1xuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtaXRlbSBzZWxmLXN0cmV0Y2hcIj5cbiAgICAgICAgICAgICAgICA8Y2lkZS1lbGUtZmlsZS1pbnB1dCBcbiAgICAgICAgICAgICAgICAgIGxhYmVsPVwiVXBsb2FkIExvZ29cIiBcbiAgICAgICAgICAgICAgICAgIGFjY2VwdD1cImltYWdlLypcIiBcbiAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJmYWxzZVwiIFxuICAgICAgICAgICAgICAgICAgKGZpbGVDaGFuZ2UpPVwib25GaWxlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgaW5zdGl0dXRpb24gbG9nbyBvciBpbWFnZVwiPlxuICAgICAgICAgICAgICAgIDwvY2lkZS1lbGUtZmlsZS1pbnB1dD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBGb3JtIEFjdGlvbnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImZvcm0tYWN0aW9uc1wiPlxuICAgICAgPGJ1dHRvbiBjaWRlRWxlQnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiIFxuICAgICAgICAoY2xpY2spPVwib25SZXNldCgpXCIgXG4gICAgICAgIGxlZnRJY29uPVwicmVmcmVzaFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nKClcIj5cbiAgICAgICAgUmVzZXQgRm9ybVxuICAgICAgPC9idXR0b24+XG4gICAgICBcbiAgICAgIDxidXR0b24gY2lkZUVsZUJ1dHRvblxuICAgICAgICB0eXBlPVwic3VibWl0XCIgXG4gICAgICAgIHZhcmlhbnQ9XCJwcmltYXJ5XCIgXG4gICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nKCkgfHwgZW50aXR5Rm9ybS5pbnZhbGlkXCJcbiAgICAgICAgW2xvYWRpbmddPVwibG9hZGluZygpXCJcbiAgICAgICAgbGVmdEljb249XCJjaGVja1wiPlxuICAgICAgICBDcmVhdGUgRW50aXR5XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9mb3JtPlxuPC9kaXY+ICJdfQ==