@techextensor/tab-sdk 0.0.3 → 0.0.6

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 (47) hide show
  1. package/esm2022/lib/app/analytics.service.mjs +51 -0
  2. package/esm2022/lib/app/app.service.mjs +145 -0
  3. package/esm2022/lib/app/file.service.mjs +41 -0
  4. package/esm2022/lib/app/release.service.mjs +38 -0
  5. package/esm2022/lib/app/report.service.mjs +48 -0
  6. package/esm2022/lib/app/translator.service.mjs +77 -0
  7. package/esm2022/lib/auth/auth.service.mjs +95 -0
  8. package/esm2022/lib/crud/crud.service.mjs +161 -0
  9. package/esm2022/lib/enum/store.enum.mjs +6 -0
  10. package/esm2022/lib/enum/ui.enum.mjs +13 -0
  11. package/esm2022/lib/http/http.service.mjs +58 -0
  12. package/esm2022/lib/interface/http.interface.mjs +2 -0
  13. package/esm2022/lib/interface/ui.interface.mjs +2 -0
  14. package/esm2022/lib/store/store.service.mjs +719 -0
  15. package/esm2022/lib/tab-sdk.service.mjs +52 -18
  16. package/esm2022/lib/ui/form.service.mjs +58 -76
  17. package/esm2022/lib/ui/ui.service.mjs +297 -2
  18. package/esm2022/lib/util/util.service.mjs +53 -0
  19. package/esm2022/lib/workflow/transition.service.mjs +40 -0
  20. package/fesm2022/techextensor-tab-sdk.mjs +1855 -341
  21. package/fesm2022/techextensor-tab-sdk.mjs.map +1 -1
  22. package/lib/app/analytics.service.d.ts +28 -0
  23. package/lib/app/app.service.d.ts +81 -0
  24. package/lib/app/file.service.d.ts +22 -0
  25. package/lib/app/release.service.d.ts +23 -0
  26. package/lib/app/report.service.d.ts +28 -0
  27. package/lib/app/translator.service.d.ts +49 -0
  28. package/lib/auth/auth.service.d.ts +58 -0
  29. package/lib/crud/crud.service.d.ts +88 -0
  30. package/lib/enum/store.enum.d.ts +4 -0
  31. package/lib/enum/ui.enum.d.ts +10 -0
  32. package/lib/http/http.service.d.ts +35 -0
  33. package/lib/interface/http.interface.d.ts +8 -0
  34. package/lib/interface/ui.interface.d.ts +24 -0
  35. package/lib/store/store.service.d.ts +406 -0
  36. package/lib/tab-sdk.service.d.ts +24 -8
  37. package/lib/ui/form.service.d.ts +35 -44
  38. package/lib/ui/ui.service.d.ts +154 -0
  39. package/lib/util/util.service.d.ts +14 -0
  40. package/lib/workflow/transition.service.d.ts +21 -0
  41. package/package.json +2 -2
  42. package/esm2022/lib/common/utils.service.mjs +0 -163
  43. package/esm2022/lib/core/auth.service.mjs +0 -48
  44. package/esm2022/lib/data/data.service.mjs +0 -81
  45. package/lib/common/utils.service.d.ts +0 -58
  46. package/lib/core/auth.service.d.ts +0 -28
  47. package/lib/data/data.service.d.ts +0 -36
@@ -1,6 +1,301 @@
1
- import { Injectable } from "@angular/core";
1
+ import { inject, Injectable } from '@angular/core';
2
+ import { NavigationType, ScreenDisplayMode } from '../enum/ui.enum';
3
+ import { TabSdk } from '../tab-sdk.service';
4
+ import { ConfirmationService, NotificationService, NotificationType } from '@techextensor/tab-core-utility';
2
5
  import * as i0 from "@angular/core";
3
6
  export class UiService {
7
+ _notificationService = inject(NotificationService);
8
+ _confirmationService = inject(ConfirmationService);
9
+ /**
10
+ * Open a screen with the given options. The mode determines how the screen is
11
+ * displayed.
12
+ *
13
+ * @param options The options for opening the screen.
14
+ */
15
+ openScreen(options) {
16
+ const { mode, screenId, reqtokens, submission, title, width, height, customClass } = options;
17
+ switch (mode) {
18
+ case ScreenDisplayMode.Sidebar:
19
+ this.showSidebar({ screenId, reqtokens, submission, title, width, height, customClass });
20
+ break;
21
+ case ScreenDisplayMode.Popup:
22
+ this.showDialog({ screenId, reqtokens, submission, title, width, height, customClass });
23
+ break;
24
+ case ScreenDisplayMode.SameTab:
25
+ this.navigateTo({ screenId, reqtokens });
26
+ break;
27
+ case ScreenDisplayMode.NewTab:
28
+ this.openInNewTab({ screenId, reqtokens });
29
+ break;
30
+ }
31
+ }
32
+ /**
33
+ * Opens a screen in a sidebar.
34
+ *
35
+ * @param options The options for opening the sidebar.
36
+ */
37
+ showSidebar(options) {
38
+ const otherConfiguration = {
39
+ ...(options.title && { title: options.title }),
40
+ ...(options.width && { width: options.width }),
41
+ ...(options.height && { height: options.height }),
42
+ ...(options.customClass && { customClass: options.customClass })
43
+ };
44
+ TabSdk.util?.openScreen(ScreenDisplayMode.Sidebar, options.screenId, options.reqtokens || undefined, options.submission || undefined, Object.keys(otherConfiguration).length > 0 ? otherConfiguration : undefined);
45
+ }
46
+ /**
47
+ * Opens a screen in a popup dialog.
48
+ *
49
+ * @param options The options for opening the dialog.
50
+ */
51
+ showDialog(options) {
52
+ const otherConfiguration = {
53
+ ...(options.title && { title: options.title }),
54
+ ...(options.width && { width: options.width }),
55
+ ...(options.height && { height: options.height }),
56
+ ...(options.customClass && { customClass: options.customClass })
57
+ };
58
+ TabSdk.util?.openScreen(ScreenDisplayMode.Popup, options.screenId, options.reqtokens || undefined, options.submission || undefined, Object.keys(otherConfiguration).length > 0 ? otherConfiguration : undefined);
59
+ }
60
+ /**
61
+ * Navigates to a screen within the same tab.
62
+ *
63
+ * @param options - The options for navigation, including screenId and optional reqtokens.
64
+ */
65
+ navigateTo(options) {
66
+ TabSdk.util?.openScreen(ScreenDisplayMode.SameTab, options.screenId, options.reqtokens || undefined);
67
+ }
68
+ /**
69
+ * Navigates to a screen in a new tab.
70
+ *
71
+ * @param options The options for navigation, including screenId and optional reqtokens.
72
+ */
73
+ openInNewTab(options) {
74
+ TabSdk.util?.openScreen(ScreenDisplayMode.NewTab, options.screenId, options.reqtokens || undefined);
75
+ }
76
+ /**
77
+ * Navigates to the specified URL.
78
+ *
79
+ * @param url - The URL to navigate to.
80
+ */
81
+ navigateToUrl(url) {
82
+ TabSdk.util?.navigateToUrl({
83
+ url,
84
+ type: NavigationType.NavigateToUrl
85
+ });
86
+ }
87
+ /**
88
+ * Navigates to a specified subdomain using the provided options.
89
+ *
90
+ * @param options - The options for navigation, including subDomain, appCode, and url.
91
+ */
92
+ navigateToSubdomain(options) {
93
+ TabSdk.util?.navigateToUrl({
94
+ ...options,
95
+ type: NavigationType.NavigateToUrl
96
+ });
97
+ }
98
+ /**
99
+ * Retrieves the active screen ID from the current URL.
100
+ *
101
+ * @returns The screen ID if present in the URL, otherwise undefined.
102
+ */
103
+ getActiveUrlScreenId() {
104
+ // Split the URL pathname using the app name and '/screen/' as delimiters
105
+ const urlParts = window?.location?.pathname?.split(TabSdk.store.appName + '/screen/');
106
+ // Extract the screen ID part and remove any query parameters
107
+ const screenId = urlParts?.[1]?.split('?')[0];
108
+ // Return the screen ID or undefined if not found
109
+ return screenId;
110
+ }
111
+ /**
112
+ * Show a notification to the user.
113
+ *
114
+ * @param options The options for the notification.
115
+ */
116
+ notify(options) {
117
+ this._notificationService.notify({
118
+ type: options.type,
119
+ message: TabSdk.translator.translate(options.message),
120
+ ...(options?.title ? { title: TabSdk.translator.translate(options.title) } : {}),
121
+ ...(options?.configuration ? { configuration: options.configuration } : {}),
122
+ });
123
+ }
124
+ /**
125
+ * Displays a success notification to the user.
126
+ *
127
+ * @param options - The options for the notification, including message, title, and configuration.
128
+ */
129
+ showSuccess(options) {
130
+ this.notify({
131
+ ...options,
132
+ type: NotificationType.Success,
133
+ title: options?.title ?? 'Success'
134
+ });
135
+ }
136
+ /**
137
+ * Displays a warning notification to the user.
138
+ *
139
+ * @param options - The options for the notification, including message, title, and configuration.
140
+ */
141
+ showWarning(options) {
142
+ this.notify({
143
+ ...options,
144
+ type: NotificationType.Warning,
145
+ title: options?.title ?? 'Warning'
146
+ });
147
+ }
148
+ /**
149
+ * Displays an info notification to the user.
150
+ *
151
+ * @param options - The options for the notification, including message, title, and configuration.
152
+ */
153
+ showInfo(options) {
154
+ this.notify({
155
+ ...options,
156
+ type: NotificationType.Info,
157
+ title: options?.title ?? 'Info'
158
+ });
159
+ }
160
+ /**
161
+ * Displays an error notification to the user.
162
+ *
163
+ * @param options - The options for the notification, including message, title, and configuration.
164
+ */
165
+ showError(options) {
166
+ this.notify({
167
+ ...options,
168
+ type: NotificationType.Error,
169
+ title: options?.title ?? 'Error'
170
+ });
171
+ }
172
+ /**
173
+ * Displays a confirmation dialog to the user and returns a promise that resolves
174
+ * to a boolean indicating whether the user confirmed the action.
175
+ *
176
+ * @param options - The options for the confirmation dialog, including title, message,
177
+ * confirmText, cancelText, and visibility of buttons.
178
+ * @returns A promise that resolves to true if the user confirms, false otherwise.
179
+ */
180
+ confirm(options) {
181
+ return new Promise((resolve) => {
182
+ this._confirmationService.confirm(options)
183
+ ?.subscribe((isConfirmed) => {
184
+ resolve(isConfirmed);
185
+ });
186
+ });
187
+ }
188
+ /**
189
+ * Displays a confirmation dialog to the user with a title and message that indicates
190
+ * the user is about to delete an item. The confirmation dialog has a "Delete" and "Cancel"
191
+ * button.
192
+ *
193
+ * @param options - The options for the confirmation dialog, including the item name and
194
+ * optional message.
195
+ * @returns A promise that resolves to true if the user confirms, false otherwise.
196
+ */
197
+ confirmDelete(options) {
198
+ return this.confirm({
199
+ title: options?.title ?? `Are you sure you want to delete this record`,
200
+ message: options?.message ?? `You are about to delete the selected record. Are you sure you want to proceed?`,
201
+ primaryOption: 'Delete',
202
+ });
203
+ }
204
+ /**
205
+ * Displays a confirmation dialog to the user with a title and message that indicates
206
+ * the user is about to discard changes to an item. The confirmation dialog has a "Discard"
207
+ * and "Cancel" button.
208
+ *
209
+ * @param options - The options for the confirmation dialog, including the item name and
210
+ * optional message.
211
+ * @returns A promise that resolves to true if the user confirms, false otherwise.
212
+ */
213
+ confirmDiscard(options) {
214
+ return this.confirm({
215
+ title: `Are you sure you want to discard your changes`,
216
+ message: options?.message ?? `You are about to discard your changes. Are you sure you want to proceed?`,
217
+ primaryOption: 'Discard',
218
+ });
219
+ }
220
+ /**
221
+ * Closes the confirmation dialog.
222
+ *
223
+ * This method can be used to manually close the confirmation dialog.
224
+ */
225
+ closeConfirmationDialog() {
226
+ // Close the confirmation dialog
227
+ this._confirmationService.closeDialog();
228
+ }
229
+ /**
230
+ * Retrieves the confirmation emitter from the confirmation service.
231
+ *
232
+ * @returns The confirmation emitter used for emitting confirmation events.
233
+ */
234
+ getConformationEmitter() {
235
+ return this._confirmationService.getConformationEmitter();
236
+ }
237
+ /**
238
+ * Retrieves the dialog emitter from the confirmation service.
239
+ *
240
+ * The dialog emitter is an RxJS Subject that emits whenever a confirmation dialog is
241
+ * opened or closed. The value emitted is a boolean indicating whether a dialog is
242
+ * currently open.
243
+ *
244
+ * @returns The dialog emitter used for emitting confirmation dialog events.
245
+ */
246
+ getDialogEmitter() {
247
+ return this._confirmationService.getDialogEmitter();
248
+ }
249
+ /**
250
+ * Retrieves the remove emitter from the confirmation service.
251
+ *
252
+ * The remove emitter is an RxJS Subject that emits whenever a removal confirmation
253
+ * dialog is opened or closed. The value emitted is a boolean indicating whether a
254
+ * removal dialog is currently open.
255
+ *
256
+ * @returns The remove emitter used for emitting removal confirmation dialog events.
257
+ */
258
+ getRemoveEmitter() {
259
+ return this._confirmationService.getRemoveEmitter();
260
+ }
261
+ /**
262
+ * Copies the provided text to the clipboard and displays a success notification.
263
+ *
264
+ * @param text - The text to be copied to the clipboard.
265
+ */
266
+ copyToClipboard(text) {
267
+ // Create a temporary input element to hold the text
268
+ const tempInput = document.createElement("input");
269
+ // Set the input's value to the text to be copied
270
+ tempInput.value = text;
271
+ // Append the temporary input to the document body
272
+ document.body.appendChild(tempInput);
273
+ // Select the text in the input element
274
+ tempInput.select();
275
+ // Execute the copy command
276
+ document.execCommand("copy");
277
+ // Remove the temporary input from the document body
278
+ document.body.removeChild(tempInput);
279
+ // Show a success notification
280
+ this.showSuccess({
281
+ message: "",
282
+ title: "Copied to clipboard!",
283
+ configuration: {
284
+ timeOut: 1000,
285
+ positionClass: 'toast-top-center',
286
+ easing: 'ease-in',
287
+ easeTime: 300,
288
+ extendedTimeOut: 2000,
289
+ }
290
+ });
291
+ }
292
+ /**
293
+ * Copies the current URL to the clipboard and displays a success notification.
294
+ */
295
+ copyCurrentUrlToClipboard() {
296
+ // Use the copyToClipboard method to copy the current window URL
297
+ this.copyToClipboard(window.location.href);
298
+ }
4
299
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: UiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
5
300
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: UiService, providedIn: 'root' });
6
301
  }
@@ -10,4 +305,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
10
305
  providedIn: 'root'
11
306
  }]
12
307
  }] });
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhYi1zZGsvc3JjL2xpYi91aS91aS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSzNDLE1BQU0sT0FBTyxTQUFTO3dHQUFULFNBQVM7NEdBQVQsU0FBUyxjQUZOLE1BQU07OzRGQUVULFNBQVM7a0JBSHJCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVWlTZXJ2aWNlIHt9Il19
308
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhYi1zZGsvc3JjL2xpYi91aS91aS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBT25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFnRCxtQkFBbUIsRUFBdUIsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7QUFLL0ssTUFBTSxPQUFPLFNBQVM7SUFDRCxvQkFBb0IsR0FBd0IsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDeEUsb0JBQW9CLEdBQXdCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBRXpGOzs7OztPQUtHO0lBQ0gsVUFBVSxDQUFDLE9BQTBCO1FBQ2pDLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRTdGLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDWCxLQUFLLGlCQUFpQixDQUFDLE9BQU87Z0JBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RixNQUFNO1lBRVYsS0FBSyxpQkFBaUIsQ0FBQyxLQUFLO2dCQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFF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cnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgU2NyZWVuT3Blbk9wdGlvbnMsXG4gICAgTmF2aWdhdGlvbk9wdGlvbnMsXG4gICAgQmFzZVNjcmVlbk9wdGlvbnMsXG4gICAgTmF2aWdhdGVUb1N1YmRvbWFpbk9wdGlvbnNcbn0gZnJvbSAnLi4vaW50ZXJmYWNlL3VpLmludGVyZmFjZSc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uVHlwZSwgU2NyZWVuRGlzcGxheU1vZGUgfSBmcm9tICcuLi9lbnVtL3VpLmVudW0nO1xuaW1wb3J0IHsgVGFiU2RrIH0gZnJvbSAnLi4vdGFiLXNkay5zZXJ2aWNlJztcbmltcG9ydCB7IEJhc2VOb3RpZmljYXRpb25PcHRpb25zLCBDb25maXJtYXRpb25PcHRpb25zLCBDb25maXJtYXRpb25TZXJ2aWNlLCBOb3RpZmljYXRpb25PcHRpb25zLCBOb3RpZmljYXRpb25TZXJ2aWNlLCBOb3RpZmljYXRpb25UeXBlIH0gZnJvbSAnQHRlY2hleHRlbnNvci90YWItY29yZS11dGlsaXR5JztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBVaVNlcnZpY2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX25vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UgPSBpbmplY3QoTm90aWZpY2F0aW9uU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29uZmlybWF0aW9uU2VydmljZTogQ29uZmlybWF0aW9uU2VydmljZSA9IGluamVjdChDb25maXJtYXRpb25TZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqIE9wZW4gYSBzY3JlZW4gd2l0aCB0aGUgZ2l2ZW4gb3B0aW9ucy4gVGhlIG1vZGUgZGV0ZXJtaW5lcyBob3cgdGhlIHNjcmVlbiBpc1xuICAgICAqIGRpc3BsYXllZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIGZvciBvcGVuaW5nIHRoZSBzY3JlZW4uXG4gICAgICovXG4gICAgb3BlblNjcmVlbihvcHRpb25zOiBTY3JlZW5PcGVuT3B0aW9ucyk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IG1vZGUsIHNjcmVlbklkLCByZXF0b2tlbnMsIHN1Ym1pc3Npb24sIHRpdGxlLCB3aWR0aCwgaGVpZ2h0LCBjdXN0b21DbGFzcyB9ID0gb3B0aW9ucztcblxuICAgICAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgU2NyZWVuRGlzcGxheU1vZGUuU2lkZWJhcjpcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dTaWRlYmFyKHsgc2NyZWVuSWQsIHJlcXRva2Vucywgc3VibWlzc2lvbiwgdGl0bGUsIHdpZHRoLCBoZWlnaHQsIGN1c3RvbUNsYXNzIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFNjcmVlbkRpc3BsYXlNb2RlLlBvcHVwOlxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0RpYWxvZyh7IHNjcmVlbklkLCByZXF0b2tlbnMsIHN1Ym1pc3Npb24sIHRpdGxlLCB3aWR0aCwgaGVpZ2h0LCBjdXN0b21DbGFzcyB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBTY3JlZW5EaXNwbGF5TW9kZS5TYW1lVGFiOlxuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUbyh7IHNjcmVlbklkLCByZXF0b2tlbnMgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgU2NyZWVuRGlzcGxheU1vZGUuTmV3VGFiOlxuICAgICAgICAgICAgICAgIHRoaXMub3BlbkluTmV3VGFiKHsgc2NyZWVuSWQsIHJlcXRva2VucyB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIGEgc2NyZWVuIGluIGEgc2lkZWJhci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIGZvciBvcGVuaW5nIHRoZSBzaWRlYmFyLlxuICAgICAqL1xuICAgIHNob3dTaWRlYmFyKG9wdGlvbnM6IEJhc2VTY3JlZW5PcHRpb25zKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG90aGVyQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgICAgICAgIC4uLihvcHRpb25zLnRpdGxlICYmIHsgdGl0bGU6IG9wdGlvbnMudGl0bGUgfSksXG4gICAgICAgICAgICAuLi4ob3B0aW9ucy53aWR0aCAmJiB7IHdpZHRoOiBvcHRpb25zLndpZHRoIH0pLFxuICAgICAgICAgICAgLi4uKG9wdGlvbnMuaGVpZ2h0ICYmIHsgaGVpZ2h0OiBvcHRpb25zLmhlaWdodCB9KSxcbiAgICAgICAgICAgIC4uLihvcHRpb25zLmN1c3RvbUNsYXNzICYmIHsgY3VzdG9tQ2xhc3M6IG9wdGlvbnMuY3VzdG9tQ2xhc3MgfSlcbiAgICAgICAgfTtcblxuICAgICAgICBUYWJTZGsudXRpbD8ub3BlblNjcmVlbihcbiAgICAgICAgICAgIFNjcmVlbkRpc3BsYXlNb2RlLlNpZGViYXIsXG4gICAgICAgICAgICBvcHRpb25zLnNjcmVlbklkLFxuICAgICAgICAgICAgb3B0aW9ucy5yZXF0b2tlbnMgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3B0aW9ucy5zdWJtaXNzaW9uIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKG90aGVyQ29uZmlndXJhdGlvbikubGVuZ3RoID4gMCA/IG90aGVyQ29uZmlndXJhdGlvbiA6IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIGEgc2NyZWVuIGluIGEgcG9wdXAgZGlhbG9nLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgZm9yIG9wZW5pbmcgdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBzaG93RGlhbG9nKG9wdGlvbnM6IEJhc2VTY3JlZW5PcHRpb25zKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG90aGVyQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgICAgICAgIC4uLihvcHRpb25zLnRpdGxlICYmIHsgdGl0bGU6IG9wdGlvbnMudGl0bGUgfSksXG4gICAgICAgICAgICAuLi4ob3B0aW9ucy53aWR0aCAmJiB7IHdpZHRoOiBvcHRpb25zLndpZHRoIH0pLFxuICAgICAgICAgICAgLi4uKG9wdGlvbnMuaGVpZ2h0ICYmIHsgaGVpZ2h0OiBvcHRpb25zLmhlaWdodCB9KSxcbiAgICAgICAgICAgIC4uLihvcHRpb25zLmN1c3RvbUNsYXNzICYmIHsgY3VzdG9tQ2xhc3M6IG9wdGlvbnMuY3VzdG9tQ2xhc3MgfSlcbiAgICAgICAgfTtcblxuICAgICAgICBUYWJTZGsudXRpbD8ub3BlblNjcmVlbihcbiAgICAgICAgICAgIFNjcmVlbkRpc3BsYXlNb2RlLlBvcHVwLFxuICAgICAgICAgICAgb3B0aW9ucy5zY3JlZW5JZCxcbiAgICAgICAgICAgIG9wdGlvbnMucmVxdG9rZW5zIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG9wdGlvbnMuc3VibWlzc2lvbiB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhvdGhlckNvbmZpZ3VyYXRpb24pLmxlbmd0aCA+IDAgPyBvdGhlckNvbmZpZ3VyYXRpb24gOiB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOYXZpZ2F0ZXMgdG8gYSBzY3JlZW4gd2l0aGluIHRoZSBzYW1lIHRhYi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIG5hdmlnYXRpb24sIGluY2x1ZGluZyBzY3JlZW5JZCBhbmQgb3B0aW9uYWwgcmVxdG9rZW5zLlxuICAgICAqL1xuICAgIG5hdmlnYXRlVG8ob3B0aW9uczogTmF2aWdhdGlvbk9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgVGFiU2RrLnV0aWw/Lm9wZW5TY3JlZW4oXG4gICAgICAgICAgICBTY3JlZW5EaXNwbGF5TW9kZS5TYW1lVGFiLFxuICAgICAgICAgICAgb3B0aW9ucy5zY3JlZW5JZCxcbiAgICAgICAgICAgIG9wdGlvbnMucmVxdG9rZW5zIHx8IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5hdmlnYXRlcyB0byBhIHNjcmVlbiBpbiBhIG5ldyB0YWIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBmb3IgbmF2aWdhdGlvbiwgaW5jbHVkaW5nIHNjcmVlbklkIGFuZCBvcHRpb25hbCByZXF0b2tlbnMuXG4gICAgICovXG4gICAgb3BlbkluTmV3VGFiKG9wdGlvbnM6IE5hdmlnYXRpb25PcHRpb25zKTogdm9pZCB7XG4gICAgICAgIFRhYlNkay51dGlsPy5vcGVuU2NyZWVuKFxuICAgICAgICAgICAgU2NyZWVuRGlzcGxheU1vZGUuTmV3VGFiLFxuICAgICAgICAgICAgb3B0aW9ucy5zY3JlZW5JZCxcbiAgICAgICAgICAgIG9wdGlvbnMucmVxdG9rZW5zIHx8IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5hdmlnYXRlcyB0byB0aGUgc3BlY2lmaWVkIFVSTC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1cmwgLSBUaGUgVVJMIHRvIG5hdmlnYXRlIHRvLlxuICAgICAqL1xuICAgIG5hdmlnYXRlVG9VcmwodXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgVGFiU2RrLnV0aWw/Lm5hdmlnYXRlVG9Vcmwoe1xuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgdHlwZTogTmF2aWdhdGlvblR5cGUuTmF2aWdhdGVUb1VybFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5hdmlnYXRlcyB0byBhIHNwZWNpZmllZCBzdWJkb21haW4gdXNpbmcgdGhlIHByb3ZpZGVkIG9wdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciBuYXZpZ2F0aW9uLCBpbmNsdWRpbmcgc3ViRG9tYWluLCBhcHBDb2RlLCBhbmQgdXJsLlxuICAgICAqL1xuICAgIG5hdmlnYXRlVG9TdWJkb21haW4ob3B0aW9uczogTmF2aWdhdGVUb1N1YmRvbWFpbk9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgVGFiU2RrLnV0aWw/Lm5hdmlnYXRlVG9Vcmwoe1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIHR5cGU6IE5hdmlnYXRpb25UeXBlLk5hdmlnYXRlVG9VcmxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGFjdGl2ZSBzY3JlZW4gSUQgZnJvbSB0aGUgY3VycmVudCBVUkwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgc2NyZWVuIElEIGlmIHByZXNlbnQgaW4gdGhlIFVSTCwgb3RoZXJ3aXNlIHVuZGVmaW5lZC5cbiAgICAgKi9cbiAgICBnZXRBY3RpdmVVcmxTY3JlZW5JZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICAvLyBTcGxpdCB0aGUgVVJMIHBhdGhuYW1lIHVzaW5nIHRoZSBhcHAgbmFtZSBhbmQgJy9zY3JlZW4vJyBhcyBkZWxpbWl0ZXJzXG4gICAgICAgIGNvbnN0IHVybFBhcnRzID0gd2luZG93Py5sb2NhdGlvbj8ucGF0aG5hbWU/LnNwbGl0KFRhYlNkay5zdG9yZS5hcHBOYW1lICsgJy9zY3JlZW4vJyk7XG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIHNjcmVlbiBJRCBwYXJ0IGFuZCByZW1vdmUgYW55IHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICAgICAgY29uc3Qgc2NyZWVuSWQgPSB1cmxQYXJ0cz8uWzFdPy5zcGxpdCgnPycpWzBdO1xuICAgICAgICAvLyBSZXR1cm4gdGhlIHNjcmVlbiBJRCBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gICAgICAgIHJldHVybiBzY3JlZW5JZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93IGEgbm90aWZpY2F0aW9uIHRvIHRoZSB1c2VyLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgZm9yIHRoZSBub3RpZmljYXRpb24uXG4gICAgICovXG4gICAgbm90aWZ5KG9wdGlvbnM6IE5vdGlmaWNhdGlvbk9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbm90aWZpY2F0aW9uU2VydmljZS5ub3RpZnkoe1xuICAgICAgICAgICAgdHlwZTogb3B0aW9ucy50eXBlLFxuICAgICAgICAgICAgbWVzc2FnZTogVGFiU2RrLnRyYW5zbGF0b3IudHJhbnNsYXRlKG9wdGlvbnMubWVzc2FnZSksXG4gICAgICAgICAgICAuLi4ob3B0aW9ucz8udGl0bGUgPyB7IHRpdGxlOiBUYWJTZGsudHJhbnNsYXRvci50cmFuc2xhdGUob3B0aW9ucy50aXRsZSkgfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihvcHRpb25zPy5jb25maWd1cmF0aW9uID8geyBjb25maWd1cmF0aW9uOiBvcHRpb25zLmNvbmZpZ3VyYXRpb24gfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgYSBzdWNjZXNzIG5vdGlmaWNhdGlvbiB0byB0aGUgdXNlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBub3RpZmljYXRpb24sIGluY2x1ZGluZyBtZXNzYWdlLCB0aXRsZSwgYW5kIGNvbmZpZ3VyYXRpb24uXG4gICAgICovXG4gICAgc2hvd1N1Y2Nlc3Mob3B0aW9uczogQmFzZU5vdGlmaWNhdGlvbk9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuU3VjY2VzcyxcbiAgICAgICAgICAgIHRpdGxlOiBvcHRpb25zPy50aXRsZSA/PyAnU3VjY2VzcydcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgYSB3YXJuaW5nIG5vdGlmaWNhdGlvbiB0byB0aGUgdXNlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBub3RpZmljYXRpb24sIGluY2x1ZGluZyBtZXNzYWdlLCB0aXRsZSwgYW5kIGNvbmZpZ3VyYXRpb24uXG4gICAgICovXG4gICAgc2hvd1dhcm5pbmcob3B0aW9uczogQmFzZU5vdGlmaWNhdGlvbk9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuV2FybmluZyxcbiAgICAgICAgICAgIHRpdGxlOiBvcHRpb25zPy50aXRsZSA/PyAnV2FybmluZydcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgYW4gaW5mbyBub3RpZmljYXRpb24gdG8gdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgbm90aWZpY2F0aW9uLCBpbmNsdWRpbmcgbWVzc2FnZSwgdGl0bGUsIGFuZCBjb25maWd1cmF0aW9uLlxuICAgICAqL1xuICAgIHNob3dJbmZvKG9wdGlvbnM6IEJhc2VOb3RpZmljYXRpb25PcHRpb25zKTogdm9pZCB7XG4gICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLkluZm8sXG4gICAgICAgICAgICB0aXRsZTogb3B0aW9ucz8udGl0bGUgPz8gJ0luZm8nXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc3BsYXlzIGFuIGVycm9yIG5vdGlmaWNhdGlvbiB0byB0aGUgdXNlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBub3RpZmljYXRpb24sIGluY2x1ZGluZyBtZXNzYWdlLCB0aXRsZSwgYW5kIGNvbmZpZ3VyYXRpb24uXG4gICAgICovXG4gICAgc2hvd0Vycm9yKG9wdGlvbnM6IEJhc2VOb3RpZmljYXRpb25PcHRpb25zKTogdm9pZCB7XG4gICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLkVycm9yLFxuICAgICAgICAgICAgdGl0bGU6IG9wdGlvbnM/LnRpdGxlID8/ICdFcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgYSBjb25maXJtYXRpb24gZGlhbG9nIHRvIHRoZSB1c2VyIGFuZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzXG4gICAgICogdG8gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgdXNlciBjb25maXJtZWQgdGhlIGFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBjb25maXJtYXRpb24gZGlhbG9nLCBpbmNsdWRpbmcgdGl0bGUsIG1lc3NhZ2UsXG4gICAgICogY29uZmlybVRleHQsIGNhbmNlbFRleHQsIGFuZCB2aXNpYmlsaXR5IG9mIGJ1dHRvbnMuXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgdXNlciBjb25maXJtcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGNvbmZpcm0ob3B0aW9ucz86IENvbmZpcm1hdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9jb25maXJtYXRpb25TZXJ2aWNlLmNvbmZpcm0ob3B0aW9ucylcbiAgICAgICAgICAgICAgICA/LnN1YnNjcmliZSgoaXNDb25maXJtZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShpc0NvbmZpcm1lZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc3BsYXlzIGEgY29uZmlybWF0aW9uIGRpYWxvZyB0byB0aGUgdXNlciB3aXRoIGEgdGl0bGUgYW5kIG1lc3NhZ2UgdGhhdCBpbmRpY2F0ZXNcbiAgICAgKiB0aGUgdXNlciBpcyBhYm91dCB0byBkZWxldGUgYW4gaXRlbS4gVGhlIGNvbmZpcm1hdGlvbiBkaWFsb2cgaGFzIGEgXCJEZWxldGVcIiBhbmQgXCJDYW5jZWxcIlxuICAgICAqIGJ1dHRvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBjb25maXJtYXRpb24gZGlhbG9nLCBpbmNsdWRpbmcgdGhlIGl0ZW0gbmFtZSBhbmRcbiAgICAgKiBvcHRpb25hbCBtZXNzYWdlLlxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIHVzZXIgY29uZmlybXMsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBjb25maXJtRGVsZXRlKG9wdGlvbnM/OiBDb25maXJtYXRpb25PcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpcm0oe1xuICAgICAgICAgICAgdGl0bGU6IG9wdGlvbnM/LnRpdGxlID8/IGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgcmVjb3JkYCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IG9wdGlvbnM/Lm1lc3NhZ2UgPz8gYFlvdSBhcmUgYWJvdXQgdG8gZGVsZXRlIHRoZSBzZWxlY3RlZCByZWNvcmQuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBwcm9jZWVkP2AsXG4gICAgICAgICAgICBwcmltYXJ5T3B0aW9uOiAnRGVsZXRlJyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgYSBjb25maXJtYXRpb24gZGlhbG9nIHRvIHRoZSB1c2VyIHdpdGggYSB0aXRsZSBhbmQgbWVzc2FnZSB0aGF0IGluZGljYXRlc1xuICAgICAqIHRoZSB1c2VyIGlzIGFib3V0IHRvIGRpc2NhcmQgY2hhbmdlcyB0byBhbiBpdGVtLiBUaGUgY29uZmlybWF0aW9uIGRpYWxvZyBoYXMgYSBcIkRpc2NhcmRcIlxuICAgICAqIGFuZCBcIkNhbmNlbFwiIGJ1dHRvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBjb25maXJtYXRpb24gZGlhbG9nLCBpbmNsdWRpbmcgdGhlIGl0ZW0gbmFtZSBhbmRcbiAgICAgKiBvcHRpb25hbCBtZXNzYWdlLlxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIHVzZXIgY29uZmlybXMsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBjb25maXJtRGlzY2FyZChvcHRpb25zPzogQ29uZmlybWF0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maXJtKHtcbiAgICAgICAgICAgIHRpdGxlOiBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRpc2NhcmQgeW91ciBjaGFuZ2VzYCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IG9wdGlvbnM/Lm1lc3NhZ2UgPz8gYFlvdSBhcmUgYWJvdXQgdG8gZGlzY2FyZCB5b3VyIGNoYW5nZXMuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBwcm9jZWVkP2AsXG4gICAgICAgICAgICBwcmltYXJ5T3B0aW9uOiAnRGlzY2FyZCcsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgY29uZmlybWF0aW9uIGRpYWxvZy5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIG1hbnVhbGx5IGNsb3NlIHRoZSBjb25maXJtYXRpb24gZGlhbG9nLlxuICAgICAqL1xuICAgIGNsb3NlQ29uZmlybWF0aW9uRGlhbG9nKCkge1xuICAgICAgICAvLyBDbG9zZSB0aGUgY29uZmlybWF0aW9uIGRpYWxvZ1xuICAgICAgICB0aGlzLl9jb25maXJtYXRpb25TZXJ2aWNlLmNsb3NlRGlhbG9nKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBjb25maXJtYXRpb24gZW1pdHRlciBmcm9tIHRoZSBjb25maXJtYXRpb24gc2VydmljZS5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgY29uZmlybWF0aW9uIGVtaXR0ZXIgdXNlZCBmb3IgZW1pdHRpbmcgY29uZmlybWF0aW9uIGV2ZW50cy5cbiAgICAgKi9cbiAgICBnZXRDb25mb3JtYXRpb25FbWl0dGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlybWF0aW9uU2VydmljZS5nZXRDb25mb3JtYXRpb25FbWl0dGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBkaWFsb2cgZW1pdHRlciBmcm9tIHRoZSBjb25maXJtYXRpb24gc2VydmljZS5cbiAgICAgKlxuICAgICAqIFRoZSBkaWFsb2cgZW1pdHRlciBpcyBhbiBSeEpTIFN1YmplY3QgdGhhdCBlbWl0cyB3aGVuZXZlciBhIGNvbmZpcm1hdGlvbiBkaWFsb2cgaXNcbiAgICAgKiBvcGVuZWQgb3IgY2xvc2VkLiBUaGUgdmFsdWUgZW1pdHRlZCBpcyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGEgZGlhbG9nIGlzXG4gICAgICogY3VycmVudGx5IG9wZW4uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgZGlhbG9nIGVtaXR0ZXIgdXNlZCBmb3IgZW1pdHRpbmcgY29uZmlybWF0aW9uIGRpYWxvZyBldmVudHMuXG4gICAgICovXG4gICAgZ2V0RGlhbG9nRW1pdHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpcm1hdGlvblNlcnZpY2UuZ2V0RGlhbG9nRW1pdHRlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgcmVtb3ZlIGVtaXR0ZXIgZnJvbSB0aGUgY29uZmlybWF0aW9uIHNlcnZpY2UuXG4gICAgICogXG4gICAgICogVGhlIHJlbW92ZSBlbWl0dGVyIGlzIGFuIFJ4SlMgU3ViamVjdCB0aGF0IGVtaXRzIHdoZW5ldmVyIGEgcmVtb3ZhbCBjb25maXJtYXRpb25cbiAgICAgKiBkaWFsb2cgaXMgb3BlbmVkIG9yIGNsb3NlZC4gVGhlIHZhbHVlIGVtaXR0ZWQgaXMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhXG4gICAgICogcmVtb3ZhbCBkaWFsb2cgaXMgY3VycmVudGx5IG9wZW4uXG4gICAgICogXG4gICAgICogQHJldHVybnMgVGhlIHJlbW92ZSBlbWl0dGVyIHVzZWQgZm9yIGVtaXR0aW5nIHJlbW92YWwgY29uZmlybWF0aW9uIGRpYWxvZyBldmVudHMuXG4gICAgICovXG4gICAgZ2V0UmVtb3ZlRW1pdHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpcm1hdGlvblNlcnZpY2UuZ2V0UmVtb3ZlRW1pdHRlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyB0aGUgcHJvdmlkZWQgdGV4dCB0byB0aGUgY2xpcGJvYXJkIGFuZCBkaXNwbGF5cyBhIHN1Y2Nlc3Mgbm90aWZpY2F0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRleHQgLSBUaGUgdGV4dCB0byBiZSBjb3BpZWQgdG8gdGhlIGNsaXBib2FyZC5cbiAgICAgKi9cbiAgICBjb3B5VG9DbGlwYm9hcmQodGV4dDogc3RyaW5nKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBpbnB1dCBlbGVtZW50IHRvIGhvbGQgdGhlIHRleHRcbiAgICAgICAgY29uc3QgdGVtcElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuXG4gICAgICAgIC8vIFNldCB0aGUgaW5wdXQncyB2YWx1ZSB0byB0aGUgdGV4dCB0byBiZSBjb3BpZWRcbiAgICAgICAgdGVtcElucHV0LnZhbHVlID0gdGV4dDtcblxuICAgICAgICAvLyBBcHBlbmQgdGhlIHRlbXBvcmFyeSBpbnB1dCB0byB0aGUgZG9jdW1lbnQgYm9keVxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRlbXBJbnB1dCk7XG5cbiAgICAgICAgLy8gU2VsZWN0IHRoZSB0ZXh0IGluIHRoZSBpbnB1dCBlbGVtZW50XG4gICAgICAgIHRlbXBJbnB1dC5zZWxlY3QoKTtcblxuICAgICAgICAvLyBFeGVjdXRlIHRoZSBjb3B5IGNvbW1hbmRcbiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJjb3B5XCIpO1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgdGVtcG9yYXJ5IGlucHV0IGZyb20gdGhlIGRvY3VtZW50IGJvZHlcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZW1wSW5wdXQpO1xuXG4gICAgICAgIC8vIFNob3cgYSBzdWNjZXNzIG5vdGlmaWNhdGlvblxuICAgICAgICB0aGlzLnNob3dTdWNjZXNzKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IFwiXCIsXG4gICAgICAgICAgICB0aXRsZTogXCJDb3BpZWQgdG8gY2xpcGJvYXJkIVwiLFxuICAgICAgICAgICAgY29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICAgIHRpbWVPdXQ6IDEwMDAsXG4gICAgICAgICAgICAgICAgcG9zaXRpb25DbGFzczogJ3RvYXN0LXRvcC1jZW50ZXInLFxuICAgICAgICAgICAgICAgIGVhc2luZzogJ2Vhc2UtaW4nLFxuICAgICAgICAgICAgICAgIGVhc2VUaW1lOiAzMDAsXG4gICAgICAgICAgICAgICAgZXh0ZW5kZWRUaW1lT3V0OiAyMDAwLFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgdGhlIGN1cnJlbnQgVVJMIHRvIHRoZSBjbGlwYm9hcmQgYW5kIGRpc3BsYXlzIGEgc3VjY2VzcyBub3RpZmljYXRpb24uXG4gICAgICovXG4gICAgY29weUN1cnJlbnRVcmxUb0NsaXBib2FyZCgpIHtcbiAgICAgICAgLy8gVXNlIHRoZSBjb3B5VG9DbGlwYm9hcmQgbWV0aG9kIHRvIGNvcHkgdGhlIGN1cnJlbnQgd2luZG93IFVSTFxuICAgICAgICB0aGlzLmNvcHlUb0NsaXBib2FyZCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgfVxufSJdfQ==
@@ -0,0 +1,53 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class UtilService {
4
+ // Will store the services from context
5
+ _context = null;
6
+ _initialized = false;
7
+ /**
8
+ * Initializes the UtilService with context that contains service references
9
+ *
10
+ * @param context The context object containing service references
11
+ * @returns A proxy that intercepts and delegates method calls to the appropriate service
12
+ */
13
+ init(context) {
14
+ if (this._initialized) {
15
+ return this;
16
+ }
17
+ this._context = context;
18
+ this._initialized = true;
19
+ // Return a proxy that will intercept method calls
20
+ return new Proxy(this, {
21
+ get: (target, prop) => {
22
+ // First check if the property exists directly on UtilService
23
+ if (prop in target) {
24
+ return target[prop];
25
+ }
26
+ // Convert symbol to string if needed
27
+ const propName = prop.toString();
28
+ // Check context services first
29
+ if (this._context && Object.keys(this._context).length > 0) {
30
+ // Loop through each service in the context
31
+ for (const serviceName of Object.keys(this._context)) {
32
+ const service = this._context[serviceName];
33
+ if (service && typeof service === 'object' && propName in service && typeof service[propName] === 'function') {
34
+ // Return the bound function from the service
35
+ return service[propName].bind(service);
36
+ }
37
+ }
38
+ }
39
+ // If property not found anywhere, return undefined
40
+ return undefined;
41
+ }
42
+ });
43
+ }
44
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: UtilService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
45
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: UtilService, providedIn: 'root' });
46
+ }
47
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: UtilService, decorators: [{
48
+ type: Injectable,
49
+ args: [{
50
+ providedIn: 'root'
51
+ }]
52
+ }] });
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFiLXNkay9zcmMvbGliL3V0aWwvdXRpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSzNDLE1BQU0sT0FBTyxXQUFXO0lBQ3BCLHVDQUF1QztJQUMvQixRQUFRLEdBQVEsSUFBSSxDQUFDO0lBQ3JCLFlBQVksR0FBRyxLQUFLLENBQUM7SUFFN0I7Ozs7O09BS0c7SUFDSCxJQUFJLENBQUMsT0FBWTtRQUNiLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BCLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUV6QixrREFBa0Q7UUFDbEQsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUU7WUFDbkIsR0FBRyxFQUFFLENBQUMsTUFBVyxFQUFFLElBQXFCLEVBQUUsRUFBRTtnQkFDeEMsNkRBQTZEO2dCQUM3RCxJQUFJLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDakIsT0FBUSxNQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLENBQUM7Z0JBRUQscUNBQXFDO2dCQUNyQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBRWpDLCtCQUErQjtnQkFDL0IsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDekQsMkNBQTJDO29CQUMzQyxLQUFLLE1BQU0sV0FBVyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7d0JBQ25ELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7d0JBQzNDLElBQUksT0FBTyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsSUFBSSxRQUFRLElBQUksT0FBTyxJQUFJLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFVBQVUsRUFBRSxDQUFDOzRCQUMzRyw2Q0FBNkM7NEJBQzdDLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDM0MsQ0FBQztvQkFDTCxDQUFDO2dCQUNMLENBQUM7Z0JBRUQsbURBQW1EO2dCQUNuRCxPQUFPLFNBQVMsQ0FBQztZQUNyQixDQUFDO1NBQ0osQ0FBQyxDQUFDO0lBQ1AsQ0FBQzt3R0E5Q1EsV0FBVzs0R0FBWCxXQUFXLGNBRlIsTUFBTTs7NEZBRVQsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVXRpbFNlcnZpY2Uge1xuICAgIC8vIFdpbGwgc3RvcmUgdGhlIHNlcnZpY2VzIGZyb20gY29udGV4dFxuICAgIHByaXZhdGUgX2NvbnRleHQ6IGFueSA9IG51bGw7XG4gICAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIHRoZSBVdGlsU2VydmljZSB3aXRoIGNvbnRleHQgdGhhdCBjb250YWlucyBzZXJ2aWNlIHJlZmVyZW5jZXNcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBvYmplY3QgY29udGFpbmluZyBzZXJ2aWNlIHJlZmVyZW5jZXNcbiAgICAgKiBAcmV0dXJucyBBIHByb3h5IHRoYXQgaW50ZXJjZXB0cyBhbmQgZGVsZWdhdGVzIG1ldGhvZCBjYWxscyB0byB0aGUgYXBwcm9wcmlhdGUgc2VydmljZVxuICAgICAqL1xuICAgIGluaXQoY29udGV4dDogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICAgICAgLy8gUmV0dXJuIGEgcHJveHkgdGhhdCB3aWxsIGludGVyY2VwdCBtZXRob2QgY2FsbHNcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICAgICAgICBnZXQ6ICh0YXJnZXQ6IGFueSwgcHJvcDogc3RyaW5nIHwgc3ltYm9sKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhlIHByb3BlcnR5IGV4aXN0cyBkaXJlY3RseSBvbiBVdGlsU2VydmljZVxuICAgICAgICAgICAgICAgIGlmIChwcm9wIGluIHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRhcmdldCBhcyBhbnkpW3Byb3BdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgc3ltYm9sIHRvIHN0cmluZyBpZiBuZWVkZWRcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHByb3AudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGNvbnRleHQgc2VydmljZXMgZmlyc3RcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY29udGV4dCAmJiBPYmplY3Qua2V5cyh0aGlzLl9jb250ZXh0KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIHNlcnZpY2UgaW4gdGhlIGNvbnRleHRcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzZXJ2aWNlTmFtZSBvZiBPYmplY3Qua2V5cyh0aGlzLl9jb250ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuX2NvbnRleHRbc2VydmljZU5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UgJiYgdHlwZW9mIHNlcnZpY2UgPT09ICdvYmplY3QnICYmIHByb3BOYW1lIGluIHNlcnZpY2UgJiYgdHlwZW9mIHNlcnZpY2VbcHJvcE5hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBib3VuZCBmdW5jdGlvbiBmcm9tIHRoZSBzZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VbcHJvcE5hbWVdLmJpbmQoc2VydmljZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBwcm9wZXJ0eSBub3QgZm91bmQgYW55d2hlcmUsIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59Il19
@@ -0,0 +1,40 @@
1
+ import { inject, Injectable } from '@angular/core';
2
+ import { TabBlueprintService } from '@techextensor/tab-core-utility';
3
+ import { firstValueFrom } from 'rxjs';
4
+ import { TabSdk } from '../tab-sdk.service';
5
+ import * as i0 from "@angular/core";
6
+ export class TransitionService {
7
+ _tabBlueprintService = inject(TabBlueprintService);
8
+ /**
9
+ * Retrieves the next status based on the provided payload.
10
+ *
11
+ * @param payload - The payload containing information to determine the next status.
12
+ * @returns A promise that resolves to the common API response.
13
+ */
14
+ async getNextStatus(payload) {
15
+ // Await the response from the getNextStatus method of the tabBlueprintService
16
+ const response = await firstValueFrom(this._tabBlueprintService.getNextStatus(payload));
17
+ // Return the obtained response
18
+ return response;
19
+ }
20
+ /**
21
+ * Updates the status of an entity based on the provided payload.
22
+ *
23
+ * @param payload - The payload containing information to update the status.
24
+ * @returns A promise that resolves to the common API response.
25
+ */
26
+ async updateStatus(payload) {
27
+ const response = await firstValueFrom(TabSdk.util?.updateStatus(payload));
28
+ // Return the obtained response
29
+ return response;
30
+ }
31
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TransitionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
32
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TransitionService, providedIn: 'root' });
33
+ }
34
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TransitionService, decorators: [{
35
+ type: Injectable,
36
+ args: [{
37
+ providedIn: 'root'
38
+ }]
39
+ }] });
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNpdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFiLXNkay9zcmMvbGliL3dvcmtmbG93L3RyYW5zaXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQXdDLG1CQUFtQixFQUF1QixNQUFNLGdDQUFnQyxDQUFDO0FBQ2hJLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDOztBQUs1QyxNQUFNLE9BQU8saUJBQWlCO0lBQ1Qsb0JBQW9CLEdBQXdCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBRXpGOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUEwQjtRQUMxQyw4RUFBOEU7UUFDOUUsTUFBTSxRQUFRLEdBQUcsTUFBTSxjQUFjLENBQ2pDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQ25ELENBQUM7UUFDRiwrQkFBK0I7UUFDL0IsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUE0QjtRQUMzQyxNQUFNLFFBQVEsR0FBRyxNQUFNLGNBQWMsQ0FDakMsTUFBTSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQ3JDLENBQUM7UUFDRiwrQkFBK0I7UUFDL0IsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQzt3R0E5QlEsaUJBQWlCOzRHQUFqQixpQkFBaUIsY0FGZCxNQUFNOzs0RkFFVCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25BcGlSZXNwb25zZSwgTmV4dFN0YXR1c1BheWxvYWQsIFRhYkJsdWVwcmludFNlcnZpY2UsIFVwZGF0ZVN0YXR1c1BheWxvYWQgfSBmcm9tICdAdGVjaGV4dGVuc29yL3RhYi1jb3JlLXV0aWxpdHknO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRhYlNkayB9IGZyb20gJy4uL3RhYi1zZGsuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVHJhbnNpdGlvblNlcnZpY2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYkJsdWVwcmludFNlcnZpY2U6IFRhYkJsdWVwcmludFNlcnZpY2UgPSBpbmplY3QoVGFiQmx1ZXByaW50U2VydmljZSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIG5leHQgc3RhdHVzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXlsb2FkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBheWxvYWQgLSBUaGUgcGF5bG9hZCBjb250YWluaW5nIGluZm9ybWF0aW9uIHRvIGRldGVybWluZSB0aGUgbmV4dCBzdGF0dXMuXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbW1vbiBBUEkgcmVzcG9uc2UuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0TmV4dFN0YXR1cyhwYXlsb2FkOiBOZXh0U3RhdHVzUGF5bG9hZCk6IFByb21pc2U8Q29tbW9uQXBpUmVzcG9uc2U+IHtcbiAgICAgICAgLy8gQXdhaXQgdGhlIHJlc3BvbnNlIGZyb20gdGhlIGdldE5leHRTdGF0dXMgbWV0aG9kIG9mIHRoZSB0YWJCbHVlcHJpbnRTZXJ2aWNlXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgICB0aGlzLl90YWJCbHVlcHJpbnRTZXJ2aWNlLmdldE5leHRTdGF0dXMocGF5bG9hZClcbiAgICAgICAgKTtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSBvYnRhaW5lZCByZXNwb25zZVxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgc3RhdHVzIG9mIGFuIGVudGl0eSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGF5bG9hZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXlsb2FkIC0gVGhlIHBheWxvYWQgY29udGFpbmluZyBpbmZvcm1hdGlvbiB0byB1cGRhdGUgdGhlIHN0YXR1cy5cbiAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY29tbW9uIEFQSSByZXNwb25zZS5cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVTdGF0dXMocGF5bG9hZDogVXBkYXRlU3RhdHVzUGF5bG9hZCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgICBUYWJTZGsudXRpbD8udXBkYXRlU3RhdHVzKHBheWxvYWQpXG4gICAgICAgICk7XG4gICAgICAgIC8vIFJldHVybiB0aGUgb2J0YWluZWQgcmVzcG9uc2VcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cbn0iXX0=