@decaf-ts/for-angular 0.0.10 → 0.0.11

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 (121) hide show
  1. package/dist/lib/esm2022/components/component-renderer/component-renderer.component.mjs +313 -0
  2. package/dist/lib/esm2022/components/crud-field/crud-field.component.mjs +301 -0
  3. package/dist/lib/esm2022/components/crud-form/constants.mjs +14 -0
  4. package/dist/lib/esm2022/components/crud-form/crud-form.component.mjs +139 -0
  5. package/dist/lib/esm2022/components/crud-form/types.mjs +2 -0
  6. package/dist/lib/esm2022/components/empty-state/empty-state.component.mjs +348 -0
  7. package/dist/lib/esm2022/components/fieldset/fieldset.component.mjs +225 -0
  8. package/dist/lib/esm2022/components/filter/filter.component.mjs +689 -0
  9. package/dist/lib/esm2022/components/for-angular-components.module.mjs +71 -0
  10. package/dist/lib/esm2022/components/index.mjs +20 -0
  11. package/dist/lib/esm2022/components/layout/layout.component.mjs +176 -0
  12. package/dist/lib/esm2022/components/list/constants.mjs +6 -0
  13. package/dist/lib/esm2022/components/list/list.component.mjs +1236 -0
  14. package/dist/{esm2022 → lib/esm2022}/components/list-item/list-item.component.mjs +1 -1
  15. package/dist/lib/esm2022/components/model-renderer/model-renderer.component.mjs +138 -0
  16. package/dist/lib/esm2022/components/pagination/constants.mjs +2 -0
  17. package/dist/lib/esm2022/components/pagination/pagination.component.mjs +323 -0
  18. package/dist/lib/esm2022/components/searchbar/searchbar.component.mjs +493 -0
  19. package/dist/lib/esm2022/decaf-ts-for-angular.mjs +5 -0
  20. package/dist/lib/esm2022/directives/collapsable.directive.mjs +28 -0
  21. package/dist/lib/esm2022/directives/index.mjs +2 -0
  22. package/dist/lib/esm2022/engine/DynamicModule.mjs +18 -0
  23. package/dist/lib/esm2022/engine/NgxBaseComponent.mjs +539 -0
  24. package/dist/lib/esm2022/engine/NgxCrudFormField.mjs +125 -0
  25. package/dist/lib/esm2022/engine/NgxFormService.mjs +315 -0
  26. package/dist/lib/esm2022/engine/NgxRenderingEngine.mjs +192 -0
  27. package/dist/lib/esm2022/engine/NgxRenderingEngine2.mjs +332 -0
  28. package/dist/lib/esm2022/engine/ValidatorFactory.mjs +102 -0
  29. package/dist/lib/esm2022/engine/constants.mjs +160 -0
  30. package/dist/lib/esm2022/engine/decorators.mjs +38 -0
  31. package/dist/lib/esm2022/engine/index.mjs +17 -0
  32. package/dist/lib/esm2022/engine/types.mjs +4 -0
  33. package/dist/lib/esm2022/for-angular.module.mjs +118 -0
  34. package/dist/lib/esm2022/helpers/index.mjs +13 -0
  35. package/dist/lib/esm2022/helpers/utils.mjs +415 -0
  36. package/dist/lib/esm2022/interfaces.mjs +2 -0
  37. package/dist/lib/esm2022/public-apis.mjs +14 -0
  38. package/dist/lib/fesm2022/decaf-ts-for-angular.mjs.map +1 -0
  39. package/package.json +1 -1
  40. package/dist/esm2022/components/component-renderer/component-renderer.component.mjs +0 -313
  41. package/dist/esm2022/components/crud-field/crud-field.component.mjs +0 -301
  42. package/dist/esm2022/components/crud-form/constants.mjs +0 -14
  43. package/dist/esm2022/components/crud-form/crud-form.component.mjs +0 -139
  44. package/dist/esm2022/components/crud-form/types.mjs +0 -2
  45. package/dist/esm2022/components/empty-state/empty-state.component.mjs +0 -348
  46. package/dist/esm2022/components/fieldset/fieldset.component.mjs +0 -225
  47. package/dist/esm2022/components/filter/filter.component.mjs +0 -689
  48. package/dist/esm2022/components/for-angular-components.module.mjs +0 -71
  49. package/dist/esm2022/components/index.mjs +0 -20
  50. package/dist/esm2022/components/layout/layout.component.mjs +0 -176
  51. package/dist/esm2022/components/list/constants.mjs +0 -6
  52. package/dist/esm2022/components/list/list.component.mjs +0 -1236
  53. package/dist/esm2022/components/model-renderer/model-renderer.component.mjs +0 -138
  54. package/dist/esm2022/components/pagination/constants.mjs +0 -2
  55. package/dist/esm2022/components/pagination/pagination.component.mjs +0 -323
  56. package/dist/esm2022/components/searchbar/searchbar.component.mjs +0 -493
  57. package/dist/esm2022/decaf-ts-for-angular.mjs +0 -5
  58. package/dist/esm2022/directives/collapsable.directive.mjs +0 -28
  59. package/dist/esm2022/directives/index.mjs +0 -2
  60. package/dist/esm2022/engine/DynamicModule.mjs +0 -18
  61. package/dist/esm2022/engine/NgxBaseComponent.mjs +0 -539
  62. package/dist/esm2022/engine/NgxCrudFormField.mjs +0 -125
  63. package/dist/esm2022/engine/NgxFormService.mjs +0 -315
  64. package/dist/esm2022/engine/NgxRenderingEngine.mjs +0 -192
  65. package/dist/esm2022/engine/NgxRenderingEngine2.mjs +0 -332
  66. package/dist/esm2022/engine/ValidatorFactory.mjs +0 -102
  67. package/dist/esm2022/engine/constants.mjs +0 -160
  68. package/dist/esm2022/engine/decorators.mjs +0 -38
  69. package/dist/esm2022/engine/index.mjs +0 -17
  70. package/dist/esm2022/engine/types.mjs +0 -4
  71. package/dist/esm2022/for-angular.module.mjs +0 -118
  72. package/dist/esm2022/helpers/index.mjs +0 -13
  73. package/dist/esm2022/helpers/utils.mjs +0 -415
  74. package/dist/esm2022/interfaces.mjs +0 -2
  75. package/dist/esm2022/public-apis.mjs +0 -14
  76. package/dist/fesm2022/decaf-ts-for-angular.mjs.map +0 -1
  77. /package/dist/{README.md → lib/README.md} +0 -0
  78. /package/dist/{assets → lib/assets}/i18n/en.json +0 -0
  79. /package/dist/{assets → lib/assets}/images/angular-logo.svg +0 -0
  80. /package/dist/{assets → lib/assets}/images/decaf-logo-black.svg +0 -0
  81. /package/dist/{assets → lib/assets}/images/decaf-logo-lw.svg +0 -0
  82. /package/dist/{assets → lib/assets}/images/decaf-logo-white.svg +0 -0
  83. /package/dist/{assets → lib/assets}/images/decaf-logo.svg +0 -0
  84. /package/dist/{components → lib/components}/component-renderer/component-renderer.component.d.ts +0 -0
  85. /package/dist/{components → lib/components}/crud-field/crud-field.component.d.ts +0 -0
  86. /package/dist/{components → lib/components}/crud-form/constants.d.ts +0 -0
  87. /package/dist/{components → lib/components}/crud-form/crud-form.component.d.ts +0 -0
  88. /package/dist/{components → lib/components}/crud-form/types.d.ts +0 -0
  89. /package/dist/{components → lib/components}/empty-state/empty-state.component.d.ts +0 -0
  90. /package/dist/{components → lib/components}/fieldset/fieldset.component.d.ts +0 -0
  91. /package/dist/{components → lib/components}/filter/filter.component.d.ts +0 -0
  92. /package/dist/{components → lib/components}/for-angular-components.module.d.ts +0 -0
  93. /package/dist/{components → lib/components}/index.d.ts +0 -0
  94. /package/dist/{components → lib/components}/layout/layout.component.d.ts +0 -0
  95. /package/dist/{components → lib/components}/list/constants.d.ts +0 -0
  96. /package/dist/{components → lib/components}/list/list.component.d.ts +0 -0
  97. /package/dist/{components → lib/components}/list-item/list-item.component.d.ts +0 -0
  98. /package/dist/{components → lib/components}/model-renderer/model-renderer.component.d.ts +0 -0
  99. /package/dist/{components → lib/components}/pagination/constants.d.ts +0 -0
  100. /package/dist/{components → lib/components}/pagination/pagination.component.d.ts +0 -0
  101. /package/dist/{components → lib/components}/searchbar/searchbar.component.d.ts +0 -0
  102. /package/dist/{directives → lib/directives}/collapsable.directive.d.ts +0 -0
  103. /package/dist/{directives → lib/directives}/index.d.ts +0 -0
  104. /package/dist/{engine → lib/engine}/DynamicModule.d.ts +0 -0
  105. /package/dist/{engine → lib/engine}/NgxBaseComponent.d.ts +0 -0
  106. /package/dist/{engine → lib/engine}/NgxCrudFormField.d.ts +0 -0
  107. /package/dist/{engine → lib/engine}/NgxFormService.d.ts +0 -0
  108. /package/dist/{engine → lib/engine}/NgxRenderingEngine.d.ts +0 -0
  109. /package/dist/{engine → lib/engine}/NgxRenderingEngine2.d.ts +0 -0
  110. /package/dist/{engine → lib/engine}/ValidatorFactory.d.ts +0 -0
  111. /package/dist/{engine → lib/engine}/constants.d.ts +0 -0
  112. /package/dist/{engine → lib/engine}/decorators.d.ts +0 -0
  113. /package/dist/{engine → lib/engine}/index.d.ts +0 -0
  114. /package/dist/{engine → lib/engine}/types.d.ts +0 -0
  115. /package/dist/{fesm2022 → lib/fesm2022}/decaf-ts-for-angular.mjs +0 -0
  116. /package/dist/{for-angular.module.d.ts → lib/for-angular.module.d.ts} +0 -0
  117. /package/dist/{helpers → lib/helpers}/index.d.ts +0 -0
  118. /package/dist/{helpers → lib/helpers}/utils.d.ts +0 -0
  119. /package/dist/{index.d.ts → lib/index.d.ts} +0 -0
  120. /package/dist/{interfaces.d.ts → lib/interfaces.d.ts} +0 -0
  121. /package/dist/{public-apis.d.ts → lib/public-apis.d.ts} +0 -0
@@ -0,0 +1,415 @@
1
+ import { isDevMode } from '@angular/core';
2
+ import { InjectableRegistryImp } from '@decaf-ts/injectable-decorators';
3
+ import { Primitives } from '@decaf-ts/decorator-validation';
4
+ import { getLogger } from '../for-angular.module';
5
+ let injectableRegistry;
6
+ /**
7
+ * @description Retrieves the singleton instance of the injectables registry
8
+ * @summary This function implements the singleton pattern for the InjectablesRegistry.
9
+ * It returns the existing registry instance if one exists, or creates a new instance
10
+ * if none exists. The registry is used to store and retrieve injectable dependencies
11
+ * throughout the application.
12
+ *
13
+ * @return {InjectablesRegistry} The singleton injectables registry instance
14
+ *
15
+ * @function getInjectablesRegistry
16
+ * @memberOf module:for-angular
17
+ */
18
+ export function getInjectablesRegistry() {
19
+ if (!injectableRegistry)
20
+ injectableRegistry = new InjectableRegistryImp();
21
+ return injectableRegistry;
22
+ }
23
+ /**
24
+ * @description Determines if the application is running in development mode
25
+ * @summary This function checks whether the application is currently running in a development
26
+ * environment. It uses Angular's isDevMode() function and also checks the window context
27
+ * and hostname against the provided context parameter. This is useful for enabling
28
+ * development-specific features or logging.
29
+ *
30
+ * @param {string} [context='localhost'] - The context string to check against the current environment
31
+ * @return {boolean} True if the application is running in development mode, false otherwise
32
+ *
33
+ * @function isDevelopmentMode
34
+ * @memberOf module:for-angular
35
+ */
36
+ export function isDevelopmentMode(context = 'localhost') {
37
+ if (!context)
38
+ return isDevMode();
39
+ const win = getWindow();
40
+ return (isDevMode() ||
41
+ win?.['env']?.['CONTEXT'].toLowerCase() !== context.toLowerCase() ||
42
+ win?.['location']?.hostname?.includes(context));
43
+ }
44
+ /**
45
+ * @description Dispatches a custom event to the document window
46
+ * @summary This function creates and dispatches a custom event to the browser window.
47
+ * It's useful for cross-component communication or for triggering application-wide events.
48
+ * The function allows specifying the event name, detail data, and additional event properties.
49
+ *
50
+ * @param {string} name - The name of the custom event to dispatch
51
+ * @param {unknown} detail - The data to include in the event's detail property
52
+ * @param {object} [props] - Optional additional properties for the custom event
53
+ * @return {void}
54
+ *
55
+ * @function windowEventEmitter
56
+ * @memberOf module:for-angular
57
+ */
58
+ export function windowEventEmitter(name, detail, props) {
59
+ const data = Object.assign({
60
+ bubbles: true,
61
+ composed: true,
62
+ cancelable: false,
63
+ detail: detail,
64
+ }, props || {});
65
+ getWindow().dispatchEvent(new CustomEvent(name, data));
66
+ }
67
+ /**
68
+ * @description Retrieves a property from the window's document object
69
+ * @summary This function provides a safe way to access properties on the window's document object.
70
+ * It uses the getWindowDocument function to get a reference to the document, then accesses
71
+ * the specified property. This is useful for browser environment interactions that need
72
+ * to access document properties.
73
+ *
74
+ * @param {string} key - The name of the property to retrieve from the document object
75
+ * @return {any} The value of the specified property, or undefined if the document or property doesn't exist
76
+ *
77
+ * @function getOnWindowDocument
78
+ * @memberOf module:for-angular
79
+ */
80
+ export function getOnWindowDocument(key) {
81
+ const doc = getWindowDocument()?.[key];
82
+ return doc instanceof Document ?
83
+ doc : undefined;
84
+ }
85
+ /**
86
+ * @description Retrieves the document object from the window
87
+ * @summary This function provides a safe way to access the document object from the window.
88
+ * It uses the getOnWindow function to retrieve the 'document' property from the window object.
89
+ * This is useful for browser environment interactions that need access to the document.
90
+ *
91
+ * @return {Document | undefined} The window's document object, or undefined if it doesn't exist
92
+ *
93
+ * @function getWindowDocument
94
+ * @memberOf module:for-angular
95
+ */
96
+ export function getWindowDocument() {
97
+ return getOnWindow('document');
98
+ }
99
+ /**
100
+ * @description Retrieves a property from the window object
101
+ * @summary This function provides a safe way to access properties on the window object.
102
+ * It uses the getWindow function to get a reference to the window, then accesses
103
+ * the specified property. This is useful for browser environment interactions that need
104
+ * to access window properties or APIs.
105
+ *
106
+ * @param {string} key - The name of the property to retrieve from the window object
107
+ * @return {unknown | undefined} The value of the specified property, or undefined if the window or property doesn't exist
108
+ *
109
+ * @function getOnWindow
110
+ * @memberOf module:for-angular
111
+ */
112
+ export function getOnWindow(key) {
113
+ return getWindow()?.[key];
114
+ }
115
+ /**
116
+ * @description Sets a property on the window object
117
+ * @summary This function provides a way to set properties on the window object.
118
+ * It uses the getWindow function to get a reference to the window, then sets
119
+ * the specified property to the provided value. This is useful for storing
120
+ * global data or functions that need to be accessible across the application.
121
+ *
122
+ * @param {string} key - The name of the property to set on the window object
123
+ * @param {any} value - The value to assign to the property
124
+ * @return {void}
125
+ *
126
+ * @function setOnWindow
127
+ * @memberOf module:for-angular
128
+ */
129
+ export function setOnWindow(key, value) {
130
+ getWindow()[key] = value;
131
+ }
132
+ /**
133
+ * @description Retrieves the global window object
134
+ * @summary This function provides a safe way to access the global window object.
135
+ * It uses globalThis to ensure compatibility across different JavaScript environments.
136
+ * This is the core function used by other window-related utility functions to
137
+ * access the window object.
138
+ *
139
+ * @return {Window} The global window object
140
+ *
141
+ * @function getWindow
142
+ * @memberOf module:for-angular
143
+ */
144
+ export function getWindow() {
145
+ return globalThis?.['window'];
146
+ }
147
+ /**
148
+ * @description Retrieves the width of the browser window
149
+ * @summary This function provides a convenient way to get the current width of the browser window.
150
+ * It uses the getOnWindow function to access the 'innerWidth' property of the window object.
151
+ * This is useful for responsive design implementations and viewport-based calculations.
152
+ *
153
+ * @return {number | undefined} The current width of the browser window in pixels
154
+ *
155
+ * @function getWindowWidth
156
+ * @memberOf module:for-angular
157
+ */
158
+ export function getWindowWidth() {
159
+ return getOnWindow('innerWidth') || 0;
160
+ }
161
+ /**
162
+ * @description Checks if a value is not undefined
163
+ * @summary This utility function determines whether a given value is not undefined.
164
+ * It's a simple wrapper that makes code more readable when checking for defined values.
165
+ * The function is particularly useful for checking StringOrBoolean properties that might be undefined.
166
+ *
167
+ * @param {StringOrBoolean | undefined} prop - The property to check
168
+ * @return {boolean} True if the property is not undefined, false otherwise
169
+ *
170
+ * @function isNotUndefined
171
+ * @memberOf module:for-angular
172
+ */
173
+ export function isNotUndefined(prop) {
174
+ return (prop !== undefined);
175
+ }
176
+ /**
177
+ * @description Generates a locale string from a class name or instance
178
+ * @summary This utility function converts a class name or instance into a locale string
179
+ * that can be used for internationalization purposes. It handles different input types
180
+ * (string, function, or object) and applies formatting rules to generate a consistent
181
+ * locale identifier. For short names (less than 3 parts), it reverses the dot-separated
182
+ * string. For longer names, it uses the last part as a prefix and joins the rest with
183
+ * underscores.
184
+ *
185
+ * @param {string|FunctionLike|object} instance - The input to generate the locale from (class name, constructor, or instance)
186
+ * @param {string} [suffix] - Optional string to append to the instance name before processing
187
+ * @return {string} A formatted locale string derived from the input
188
+ *
189
+ * @function getLocaleFromClassName
190
+ * @memberOf module:for-angular
191
+ */
192
+ export function getLocaleFromClassName(instance, suffix) {
193
+ if (typeof instance !== 'string')
194
+ instance =
195
+ instance.name || instance?.constructor?.name;
196
+ let name = instance;
197
+ if (suffix)
198
+ name = `${instance}${suffix.charAt(0).toUpperCase() + suffix.slice(1)}`;
199
+ name = name
200
+ .replace(/_|-/g, '')
201
+ .replace(/(?:^\w|[A-Z]|\b\w)/g, (word, index) => {
202
+ if (index > 1)
203
+ word = '.' + word;
204
+ return word.toLowerCase();
205
+ })
206
+ .split('.');
207
+ if (name.length < 3)
208
+ return name.reverse().join('.');
209
+ const preffix = name[name.length - 1];
210
+ name.pop();
211
+ name = name.join('_');
212
+ return `${preffix}.${name}`;
213
+ }
214
+ /**
215
+ * @description Generates a localized string by combining locale and phrase
216
+ * @summary This utility function creates a properly formatted locale string by combining
217
+ * a locale identifier with a phrase. It handles edge cases such as empty phrases,
218
+ * missing locales, and phrases that already include the locale prefix. This function
219
+ * is useful for ensuring consistent formatting of localized strings throughout the application.
220
+ *
221
+ * @param {string} locale - The locale identifier (e.g., 'en', 'fr')
222
+ * @param {string | undefined} phrase - The phrase to localize
223
+ * @return {string} The formatted locale string, or empty string if phrase is undefined
224
+ *
225
+ * @function generateLocaleFromString
226
+ * @memberOf module:for-angular
227
+ */
228
+ export function generateLocaleFromString(locale, phrase) {
229
+ if (!phrase)
230
+ return '';
231
+ if (!locale || phrase.includes(`${locale}.`))
232
+ return phrase;
233
+ return `${locale}.${phrase}`;
234
+ }
235
+ /**
236
+ * @description Retrieves the current locale language
237
+ * @summary This utility function gets the current locale language based on the user's browser settings.
238
+ * It provides a consistent way to access the user's language preference throughout the application.
239
+ * The function returns the browser's navigator.language value, defaulting to 'en' if not available.
240
+ *
241
+ * @return {string} The current locale language (e.g., 'en', 'fr')
242
+ *
243
+ * @function getLocaleLanguage
244
+ * @memberOf module:for-angular
245
+ */
246
+ export function getLocaleLanguage() {
247
+ const win = getWindow();
248
+ return win.navigator.language || "en";
249
+ // return win?.[WINDOW_KEYS.LANGUAGE_SELECTED] || (win.navigator.language || '').split('-')[0] || "en";
250
+ }
251
+ /**
252
+ * @description Generates a random string or number of specified length
253
+ * @summary This utility function creates a random string of a specified length.
254
+ * It can generate either alphanumeric strings (including uppercase and lowercase letters)
255
+ * or numeric-only strings. This is useful for creating random IDs, temporary passwords,
256
+ * or other random identifiers throughout the application.
257
+ *
258
+ * @param {number} [length=8] - The length of the random value to generate
259
+ * @param {boolean} [onlyNumbers=false] - Whether to generate only numeric characters
260
+ * @return {string} A randomly generated string of the specified length and character set
261
+ *
262
+ * @function generateRandomValue
263
+ * @memberOf module:for-angular
264
+ */
265
+ export function generateRandomValue(length = 8, onlyNumbers = false) {
266
+ const chars = onlyNumbers
267
+ ? '0123456789'
268
+ : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
269
+ let result = '';
270
+ for (let i = 0; i < length; i++)
271
+ result += chars.charAt(Math.floor(Math.random() * chars.length));
272
+ return result;
273
+ }
274
+ /**
275
+ * Converts a string representation of a boolean or a boolean value to a boolean type.
276
+ *
277
+ * @export
278
+ * @param {('true' | 'false' | boolean)} prop - The value to convert. Can be the string 'true', 'false', or a boolean.
279
+ * @returns {boolean} The boolean representation of the input value. Returns true if the input is the string 'true' or boolean true, false otherwise.
280
+ */
281
+ export function stringToBoolean(prop) {
282
+ if (typeof prop === 'string')
283
+ prop = prop.toLowerCase() === 'true' ? true : false;
284
+ return prop;
285
+ }
286
+ /**
287
+ * Checks if a value is a valid Date object
288
+ *
289
+ * @param {(string | Date | number)} date - The value to check. Can be a Date object, a timestamp number, or a date string
290
+ * @return {boolean} Returns true if the value is a valid Date object (not NaN), otherwise false
291
+ */
292
+ export function isValidDate(date) {
293
+ try {
294
+ return (date instanceof Date && !isNaN(date)) || (() => {
295
+ const testRegex = new RegExp(/^\d{4}-\d{2}-\d{2}$/).test(date);
296
+ if (typeof date !== Primitives.STRING || !date?.includes('T') && !testRegex)
297
+ return false;
298
+ date = date.split('T')[0];
299
+ if (!new RegExp(/^\d{4}-\d{2}-\d{2}$/).test(date))
300
+ return false;
301
+ return !!(new Date(date));
302
+ })();
303
+ }
304
+ catch (error) {
305
+ getLogger(isValidDate).error(error);
306
+ return false;
307
+ }
308
+ }
309
+ /**
310
+ * Formats a date into a localized string representation
311
+ *
312
+ * @param {(string | Date | number)} date - The date to format. Can be a Date object, a timestamp number, or a date string
313
+ * @param {string} [locale] - The locale to use for formatting. If not provided, the system's locale will be used
314
+ * @return {(Date | string)} A formatted date string in the format DD/MM/YYYY according to the specified locale,
315
+ * or the original input as a string if the date is invalid
316
+ */
317
+ export function formatDate(date, locale) {
318
+ if (!locale)
319
+ locale = getLocaleLanguage();
320
+ if (typeof date === 'string' || typeof date === 'number')
321
+ date = new Date(typeof date === 'string' ? date.replace(/\//g, '-') : date);
322
+ if (!isValidDate(date))
323
+ return `${date}`;
324
+ const r = date.toLocaleString(locale, {
325
+ year: "numeric",
326
+ day: "2-digit",
327
+ month: '2-digit'
328
+ });
329
+ return r;
330
+ }
331
+ /**
332
+ * Attempts to parse a date string, Date object, or number into a valid Date object
333
+ *
334
+ * @param {(string | Date | number)} date - The date to parse. Can be a Date object, a timestamp number,
335
+ * or a date string in the format "DD/MM/YYYY HH:MM:SS:MS"
336
+ * @return {(Date | null)} A valid Date object if parsing is successful, or null if the date is invalid
337
+ * or doesn't match the expected format
338
+ */
339
+ export function parseToValidDate(date) {
340
+ if (isValidDate(date))
341
+ return date;
342
+ if (!`${date}`.includes('/'))
343
+ return null;
344
+ const [dateString, timeString] = date.split(' ');
345
+ const [day, month, year] = dateString.split('/').map(Number);
346
+ const [hours, minutes, seconds, milliseconds] = timeString.split(':').map(Number);
347
+ date = new Date(year, month - 1, day, hours, minutes, seconds, milliseconds);
348
+ if (!isValidDate(date)) {
349
+ console.warn('parseToValidDate - Invalid date format', date);
350
+ return null;
351
+ }
352
+ return date;
353
+ }
354
+ /**
355
+ * Maps an item object using a provided mapper object and optional additional properties.
356
+ *
357
+ * @param {KeyValue} item - The source object to be mapped.
358
+ * @param {KeyValue} mapper - An object that defines the mapping rules. Keys represent the new property names,
359
+ * and values represent the path to the corresponding values in the source object.
360
+ * @param {KeyValue} [props] - Optional additional properties to be included in the mapped object.
361
+ * @returns {KeyValue} A new object with properties mapped according to the mapper object and including any additional properties.
362
+ */
363
+ export function itemMapper(item, mapper, props) {
364
+ return Object.entries(mapper).reduce((accum, [key, value]) => {
365
+ const arrayValue = value.split('.');
366
+ if (!value) {
367
+ accum[key] = value;
368
+ }
369
+ else {
370
+ if (arrayValue.length === 1) {
371
+ accum[key] = item?.[value] || value;
372
+ }
373
+ else {
374
+ let val;
375
+ for (const _value of arrayValue)
376
+ val = !val
377
+ ? item[_value]
378
+ : (typeof val === 'string' ? JSON.parse(val) : val)[_value];
379
+ if (isValidDate(new Date(val)))
380
+ val = `${formatDate(val)}`;
381
+ accum[key] = val === null || val === undefined ? value : val;
382
+ }
383
+ }
384
+ return Object.assign({}, props || {}, accum);
385
+ }, {});
386
+ }
387
+ /**
388
+ * Maps an array of data objects using a provided mapper object.
389
+ *
390
+ * @template T - The type of the resulting mapped items.
391
+ * @param {any[]} data - The array of data objects to be mapped.
392
+ * @param {KeyValue} mapper - An object that defines the mapping rules.
393
+ * @param {KeyValue} [props] - Additional properties to be included in the mapped items.
394
+ *
395
+ * @returns {T[]} - The array of mapped items. If an item in the original array does not have any non-null values after mapping,
396
+ * the original item is returned instead.
397
+ */
398
+ export function dataMapper(data, mapper, props) {
399
+ if (!data || !data.length)
400
+ return [];
401
+ return data.reduce((accum, curr) => {
402
+ const item = itemMapper(curr, mapper, props);
403
+ const hasValues = [...new Set(Object.values(item))].filter((value) => value).length >
404
+ 0;
405
+ // caso o item filtrado não possua nenhum valor, passar o objeto original
406
+ accum.push(hasValues ? item : curr);
407
+ return accum;
408
+ }, []);
409
+ }
410
+ export function removeFocusTrap() {
411
+ const doc = getWindowDocument();
412
+ if (doc?.activeElement)
413
+ doc.activeElement?.blur();
414
+ }
415
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2hlbHBlcnMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUscUJBQXFCLEVBQXVCLE1BQU0saUNBQWlDLENBQUM7QUFDN0YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVsRCxJQUFJLGtCQUF1QyxDQUFDO0FBRTVDOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQjtJQUNwQyxJQUFJLENBQUMsa0JBQWtCO1FBQ3JCLGtCQUFrQixHQUFHLElBQUkscUJBQXFCLEVBQUUsQ0FBQztJQUNuRCxPQUFPLGtCQUFrQixDQUFDO0FBQzVCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsVUFBa0IsV0FBVztJQUM3RCxJQUFJLENBQUMsT0FBTztRQUNWLE9BQU8sU0FBUyxFQUFFLENBQUM7SUFDckIsTUFBTSxHQUFHLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFDeEIsT0FBTyxDQUNMLFNBQVMsRUFBRTtRQUNYLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxDQUFDLFdBQVcsRUFBRTtRQUNqRSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUMvQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLElBQVksRUFDWixNQUFlLEVBQ2YsS0FBYztJQUVkLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQ3hCO1FBQ0UsT0FBTyxFQUFFLElBQUk7UUFDYixRQUFRLEVBQUUsSUFBSTtRQUNkLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLE1BQU0sRUFBRSxNQUFNO0tBQ2YsRUFDRCxLQUFLLElBQUksRUFBRSxDQUNaLENBQUM7SUFDRCxTQUFTLEVBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUNEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxHQUFXO0lBQzdDLE1BQU0sR0FBRyxHQUFHLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxHQUFxQixDQUFDLENBQUM7SUFDekQsT0FBTyxHQUFHLFlBQVksUUFBUSxDQUFDLENBQUM7UUFDOUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDcEIsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCO0lBQy9CLE9BQU8sV0FBVyxDQUFDLFVBQVUsQ0FBYSxDQUFDO0FBQzdDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLEdBQVc7SUFDckMsT0FBTyxTQUFTLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxHQUFXLEVBQUUsS0FBYztJQUNyRCxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDM0IsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLFNBQVM7SUFDdkIsT0FBUSxVQUF1QixFQUFFLENBQUMsUUFBUSxDQUFzQixDQUFDO0FBQ25FLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLGNBQWM7SUFDNUIsT0FBTyxXQUFXLENBQUMsWUFBWSxDQUFXLElBQUksQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBaUM7SUFDOUQsT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLENBQVksQ0FBQztBQUN6QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxRQUF3QyxFQUN4QyxNQUFlO0lBRWYsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRO1FBQzlCLFFBQVE7WUFDTCxRQUF5QixDQUFDLElBQUksSUFBSyxRQUFtQixFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUM7SUFFL0UsSUFBSSxJQUFJLEdBQXNCLFFBQVEsQ0FBQztJQUV2QyxJQUFJLE1BQU07UUFBRSxJQUFJLEdBQUcsR0FBRyxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFFcEYsSUFBSSxHQUFHLElBQUk7U0FDUixPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztTQUNuQixPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxJQUFZLEVBQUUsS0FBYSxFQUFFLEVBQUU7UUFDOUQsSUFBSSxLQUFLLEdBQUcsQ0FBQztZQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzVCLENBQUMsQ0FBQztTQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUVkLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUVsQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0QyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDWCxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QixPQUFPLEdBQUcsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO0FBRzlCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxNQUFjLEVBQ2QsTUFBMEI7SUFFMUIsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN2QixJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQzVELE9BQU8sR0FBRyxNQUFNLElBQUksTUFBTSxFQUFFLENBQUM7QUFDL0IsQ0FBQztBQUdEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCO0lBQy9CLE1BQU0sR0FBRyxHQUFHLFNBQVMsRUFBRSxDQUFDO0lBQ3hCLE9BQVEsR0FBYyxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDO0lBQ2xELHVHQUF1RztBQUN6RyxDQUFDO0FBSUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxTQUFpQixDQUFDLEVBQUUsY0FBdUIsS0FBSztJQUNsRixNQUFNLEtBQUssR0FBRyxXQUFXO1FBQ3ZCLENBQUMsQ0FBQyxZQUFZO1FBQ2QsQ0FBQyxDQUFDLGdFQUFnRSxDQUFDO0lBQ3JFLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUVuRSxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBR0Q7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUFnQztJQUM5RCxJQUFHLE9BQU8sSUFBSSxLQUFLLFFBQVE7UUFDekIsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3RELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUdEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxJQUE0QjtJQUN0RCxJQUFJLENBQUM7UUFDSCxPQUFPLENBQUMsSUFBSSxZQUFZLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUF5QixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUMxRSxNQUFNLFNBQVMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFjLENBQUMsQ0FBQTtZQUN4RSxJQUFHLE9BQU8sSUFBSSxLQUFLLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBRSxJQUFlLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUztnQkFDbkYsT0FBTyxLQUFLLENBQUM7WUFFakIsSUFBSSxHQUFJLElBQWUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkMsSUFBRyxDQUFDLElBQUksTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDOUMsT0FBTyxLQUFLLENBQUM7WUFFZixPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNOLENBQUM7SUFBQyxPQUFNLEtBQWMsRUFBRSxDQUFDO1FBQ3ZCLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBdUIsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxJQUE0QixFQUFFLE1BQTJCO0lBRWxGLElBQUcsQ0FBQyxNQUFNO1FBQ1IsTUFBTSxHQUFHLGlCQUFpQixFQUFFLENBQUM7SUFFL0IsSUFBRyxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUTtRQUNyRCxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFOUUsSUFBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7UUFDbkIsT0FBTyxHQUFHLElBQUksRUFBWSxDQUFDO0lBQzdCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFO1FBQ2xDLElBQUksRUFBRSxTQUFTO1FBQ2YsR0FBRyxFQUFFLFNBQVM7UUFDZCxLQUFLLEVBQUUsU0FBUztLQUNuQixDQUFDLENBQUM7SUFHSCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLElBQTRCO0lBQzNELElBQUcsV0FBVyxDQUFDLElBQUksQ0FBQztRQUNsQixPQUFPLElBQVksQ0FBQztJQUV0QixJQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQ3pCLE9BQU8sSUFBSSxDQUFDO0lBRWQsTUFBTSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsR0FBSSxJQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdELE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdELE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsRixJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBRTdFLElBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN0QixPQUFPLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUdEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxJQUFjLEVBQUUsTUFBZ0IsRUFBRSxLQUFnQjtJQUMzRSxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBZSxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7UUFDckUsTUFBTSxVQUFVLEdBQUksS0FBZ0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNyQixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEtBQWUsQ0FBQyxJQUFJLEtBQUssQ0FBQztZQUNoRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxHQUFHLENBQUM7Z0JBRVIsS0FBSyxNQUFNLE1BQU0sSUFBSSxVQUFVO29CQUM3QixHQUFHLEdBQUcsQ0FBQyxHQUFHO3dCQUNSLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO3dCQUNkLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBRWhFLElBQUksV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUFFLEdBQUcsR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUUzRCxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUMvRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDVCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUksSUFBUyxFQUFFLE1BQWdCLEVBQUUsS0FBZ0I7SUFDekUsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDckMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBVSxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ3RDLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFnQixFQUFFLE1BQU0sRUFBRSxLQUFLLENBQU0sQ0FBQztRQUM5RCxNQUFNLFNBQVMsR0FDYixDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNO1lBQ3hFLENBQUMsQ0FBQztRQUNKLHlFQUF5RTtRQUN6RSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNULENBQUM7QUFHRCxNQUFNLFVBQVUsZUFBZTtJQUM3QixNQUFNLEdBQUcsR0FBRyxpQkFBaUIsRUFBRSxDQUFDO0lBQ2hDLElBQUcsR0FBRyxFQUFFLGFBQWE7UUFDbEIsR0FBRyxDQUFDLGFBQTZCLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wLCBJbmplY3RhYmxlc1JlZ2lzdHJ5IH0gZnJvbSAnQGRlY2FmLXRzL2luamVjdGFibGUtZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBQcmltaXRpdmVzIH0gZnJvbSAnQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uJztcbmltcG9ydCB7IEtleVZhbHVlLCBTdHJpbmdPckJvb2xlYW4sIH0gZnJvbSAnLi4vZW5naW5lL3R5cGVzJztcbmltcG9ydCB7IEZ1bmN0aW9uTGlrZSB9IGZyb20gJy4uL2VuZ2luZS90eXBlcyc7XG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tICcuLi9mb3ItYW5ndWxhci5tb2R1bGUnO1xuXG5sZXQgaW5qZWN0YWJsZVJlZ2lzdHJ5OiBJbmplY3RhYmxlc1JlZ2lzdHJ5O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgaW5qZWN0YWJsZXMgcmVnaXN0cnlcbiAqIEBzdW1tYXJ5IFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgc2luZ2xldG9uIHBhdHRlcm4gZm9yIHRoZSBJbmplY3RhYmxlc1JlZ2lzdHJ5LlxuICogSXQgcmV0dXJucyB0aGUgZXhpc3RpbmcgcmVnaXN0cnkgaW5zdGFuY2UgaWYgb25lIGV4aXN0cywgb3IgY3JlYXRlcyBhIG5ldyBpbnN0YW5jZVxuICogaWYgbm9uZSBleGlzdHMuIFRoZSByZWdpc3RyeSBpcyB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBpbmplY3RhYmxlIGRlcGVuZGVuY2llc1xuICogdGhyb3VnaG91dCB0aGUgYXBwbGljYXRpb24uXG4gKlxuICogQHJldHVybiB7SW5qZWN0YWJsZXNSZWdpc3RyeX0gVGhlIHNpbmdsZXRvbiBpbmplY3RhYmxlcyByZWdpc3RyeSBpbnN0YW5jZVxuICpcbiAqIEBmdW5jdGlvbiBnZXRJbmplY3RhYmxlc1JlZ2lzdHJ5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1hbmd1bGFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbmplY3RhYmxlc1JlZ2lzdHJ5KCk6IEluamVjdGFibGVzUmVnaXN0cnkge1xuICBpZiAoIWluamVjdGFibGVSZWdpc3RyeSlcbiAgICBpbmplY3RhYmxlUmVnaXN0cnkgPSBuZXcgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wKCk7XG4gIHJldHVybiBpbmplY3RhYmxlUmVnaXN0cnk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERldGVybWluZXMgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgaW4gZGV2ZWxvcG1lbnQgbW9kZVxuICogQHN1bW1hcnkgVGhpcyBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciB0aGUgYXBwbGljYXRpb24gaXMgY3VycmVudGx5IHJ1bm5pbmcgaW4gYSBkZXZlbG9wbWVudFxuICogZW52aXJvbm1lbnQuIEl0IHVzZXMgQW5ndWxhcidzIGlzRGV2TW9kZSgpIGZ1bmN0aW9uIGFuZCBhbHNvIGNoZWNrcyB0aGUgd2luZG93IGNvbnRleHRcbiAqIGFuZCBob3N0bmFtZSBhZ2FpbnN0IHRoZSBwcm92aWRlZCBjb250ZXh0IHBhcmFtZXRlci4gVGhpcyBpcyB1c2VmdWwgZm9yIGVuYWJsaW5nXG4gKiBkZXZlbG9wbWVudC1zcGVjaWZpYyBmZWF0dXJlcyBvciBsb2dnaW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbY29udGV4dD0nbG9jYWxob3N0J10gLSBUaGUgY29udGV4dCBzdHJpbmcgdG8gY2hlY2sgYWdhaW5zdCB0aGUgY3VycmVudCBlbnZpcm9ubWVudFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXBwbGljYXRpb24gaXMgcnVubmluZyBpbiBkZXZlbG9wbWVudCBtb2RlLCBmYWxzZSBvdGhlcndpc2VcbiAqXG4gKiBAZnVuY3Rpb24gaXNEZXZlbG9wbWVudE1vZGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWFuZ3VsYXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGV2ZWxvcG1lbnRNb2RlKGNvbnRleHQ6IHN0cmluZyA9ICdsb2NhbGhvc3QnKTogYm9vbGVhbiB7XG4gIGlmICghY29udGV4dClcbiAgICByZXR1cm4gaXNEZXZNb2RlKCk7XG4gIGNvbnN0IHdpbiA9IGdldFdpbmRvdygpO1xuICByZXR1cm4gKFxuICAgIGlzRGV2TW9kZSgpIHx8XG4gICAgd2luPy5bJ2VudiddPy5bJ0NPTlRFWFQnXS50b0xvd2VyQ2FzZSgpICE9PSBjb250ZXh0LnRvTG93ZXJDYXNlKCkgfHxcbiAgICB3aW4/LlsnbG9jYXRpb24nXT8uaG9zdG5hbWU/LmluY2x1ZGVzKGNvbnRleHQpXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERpc3BhdGNoZXMgYSBjdXN0b20gZXZlbnQgdG8gdGhlIGRvY3VtZW50IHdpbmRvd1xuICogQHN1bW1hcnkgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGFuZCBkaXNwYXRjaGVzIGEgY3VzdG9tIGV2ZW50IHRvIHRoZSBicm93c2VyIHdpbmRvdy5cbiAqIEl0J3MgdXNlZnVsIGZvciBjcm9zcy1jb21wb25lbnQgY29tbXVuaWNhdGlvbiBvciBmb3IgdHJpZ2dlcmluZyBhcHBsaWNhdGlvbi13aWRlIGV2ZW50cy5cbiAqIFRoZSBmdW5jdGlvbiBhbGxvd3Mgc3BlY2lmeWluZyB0aGUgZXZlbnQgbmFtZSwgZGV0YWlsIGRhdGEsIGFuZCBhZGRpdGlvbmFsIGV2ZW50IHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY3VzdG9tIGV2ZW50IHRvIGRpc3BhdGNoXG4gKiBAcGFyYW0ge3Vua25vd259IGRldGFpbCAtIFRoZSBkYXRhIHRvIGluY2x1ZGUgaW4gdGhlIGV2ZW50J3MgZGV0YWlsIHByb3BlcnR5XG4gKiBAcGFyYW0ge29iamVjdH0gW3Byb3BzXSAtIE9wdGlvbmFsIGFkZGl0aW9uYWwgcHJvcGVydGllcyBmb3IgdGhlIGN1c3RvbSBldmVudFxuICogQHJldHVybiB7dm9pZH1cbiAqXG4gKiBAZnVuY3Rpb24gd2luZG93RXZlbnRFbWl0dGVyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1hbmd1bGFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aW5kb3dFdmVudEVtaXR0ZXIoXG4gIG5hbWU6IHN0cmluZyxcbiAgZGV0YWlsOiB1bmtub3duLFxuICBwcm9wcz86IG9iamVjdFxuKTogdm9pZCB7XG4gIGNvbnN0IGRhdGEgPSBPYmplY3QuYXNzaWduKFxuICAgIHtcbiAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgZGV0YWlsOiBkZXRhaWwsXG4gICAgfSxcbiAgICBwcm9wcyB8fCB7fVxuICApO1xuICAoZ2V0V2luZG93KCkgYXMgV2luZG93KS5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChuYW1lLCBkYXRhKSk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSBwcm9wZXJ0eSBmcm9tIHRoZSB3aW5kb3cncyBkb2N1bWVudCBvYmplY3RcbiAqIEBzdW1tYXJ5IFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBzYWZlIHdheSB0byBhY2Nlc3MgcHJvcGVydGllcyBvbiB0aGUgd2luZG93J3MgZG9jdW1lbnQgb2JqZWN0LlxuICogSXQgdXNlcyB0aGUgZ2V0V2luZG93RG9jdW1lbnQgZnVuY3Rpb24gdG8gZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBkb2N1bWVudCwgdGhlbiBhY2Nlc3Nlc1xuICogdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4gVGhpcyBpcyB1c2VmdWwgZm9yIGJyb3dzZXIgZW52aXJvbm1lbnQgaW50ZXJhY3Rpb25zIHRoYXQgbmVlZFxuICogdG8gYWNjZXNzIGRvY3VtZW50IHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZXRyaWV2ZSBmcm9tIHRoZSBkb2N1bWVudCBvYmplY3RcbiAqIEByZXR1cm4ge2FueX0gVGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcHJvcGVydHksIG9yIHVuZGVmaW5lZCBpZiB0aGUgZG9jdW1lbnQgb3IgcHJvcGVydHkgZG9lc24ndCBleGlzdFxuICpcbiAqIEBmdW5jdGlvbiBnZXRPbldpbmRvd0RvY3VtZW50XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1hbmd1bGFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPbldpbmRvd0RvY3VtZW50KGtleTogc3RyaW5nKTogRG9jdW1lbnQgfCB1bmRlZmluZWQge1xuICBjb25zdCBkb2MgPSBnZXRXaW5kb3dEb2N1bWVudCgpPy5ba2V5IGFzIGtleW9mIERvY3VtZW50XTtcbiAgcmV0dXJuIGRvYyBpbnN0YW5jZW9mIERvY3VtZW50ID9cbiAgICBkb2MgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgZG9jdW1lbnQgb2JqZWN0IGZyb20gdGhlIHdpbmRvd1xuICogQHN1bW1hcnkgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIHNhZmUgd2F5IHRvIGFjY2VzcyB0aGUgZG9jdW1lbnQgb2JqZWN0IGZyb20gdGhlIHdpbmRvdy5cbiAqIEl0IHVzZXMgdGhlIGdldE9uV2luZG93IGZ1bmN0aW9uIHRvIHJldHJpZXZlIHRoZSAnZG9jdW1lbnQnIHByb3BlcnR5IGZyb20gdGhlIHdpbmRvdyBvYmplY3QuXG4gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgYnJvd3NlciBlbnZpcm9ubWVudCBpbnRlcmFjdGlvbnMgdGhhdCBuZWVkIGFjY2VzcyB0byB0aGUgZG9jdW1lbnQuXG4gKlxuICogQHJldHVybiB7RG9jdW1lbnQgfCB1bmRlZmluZWR9IFRoZSB3aW5kb3cncyBkb2N1bWVudCBvYmplY3QsIG9yIHVuZGVmaW5lZCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gKlxuICogQGZ1bmN0aW9uIGdldFdpbmRvd0RvY3VtZW50XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1hbmd1bGFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXaW5kb3dEb2N1bWVudCgpOiBEb2N1bWVudCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnZXRPbldpbmRvdygnZG9jdW1lbnQnKSBhcyBEb2N1bWVudDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgcHJvcGVydHkgZnJvbSB0aGUgd2luZG93IG9iamVjdFxuICogQHN1bW1hcnkgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIHNhZmUgd2F5IHRvIGFjY2VzcyBwcm9wZXJ0aWVzIG9uIHRoZSB3aW5kb3cgb2JqZWN0LlxuICogSXQgdXNlcyB0aGUgZ2V0V2luZG93IGZ1bmN0aW9uIHRvIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgd2luZG93LCB0aGVuIGFjY2Vzc2VzXG4gKiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LiBUaGlzIGlzIHVzZWZ1bCBmb3IgYnJvd3NlciBlbnZpcm9ubWVudCBpbnRlcmFjdGlvbnMgdGhhdCBuZWVkXG4gKiB0byBhY2Nlc3Mgd2luZG93IHByb3BlcnRpZXMgb3IgQVBJcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHJldHJpZXZlIGZyb20gdGhlIHdpbmRvdyBvYmplY3RcbiAqIEByZXR1cm4ge3Vua25vd24gfCB1bmRlZmluZWR9IFRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LCBvciB1bmRlZmluZWQgaWYgdGhlIHdpbmRvdyBvciBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0XG4gKlxuICogQGZ1bmN0aW9uIGdldE9uV2luZG93XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1hbmd1bGFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPbldpbmRvdyhrZXk6IHN0cmluZyk6IHVua25vd24gfCB1bmRlZmluZWQge1xuICByZXR1cm4gZ2V0V2luZG93KCk/LltrZXldO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTZXRzIGEgcHJvcGVydHkgb24gdGhlIHdpbmRvdyBvYmplY3RcbiAqIEBzdW1tYXJ5IFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSB3YXkgdG8gc2V0IHByb3BlcnRpZXMgb24gdGhlIHdpbmRvdyBvYmplY3QuXG4gKiBJdCB1c2VzIHRoZSBnZXRXaW5kb3cgZnVuY3Rpb24gdG8gZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSB3aW5kb3csIHRoZW4gc2V0c1xuICogdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSB0byB0aGUgcHJvdmlkZWQgdmFsdWUuIFRoaXMgaXMgdXNlZnVsIGZvciBzdG9yaW5nXG4gKiBnbG9iYWwgZGF0YSBvciBmdW5jdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGFjY2Vzc2libGUgYWNyb3NzIHRoZSBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldCBvbiB0aGUgd2luZG93IG9iamVjdFxuICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGFzc2lnbiB0byB0aGUgcHJvcGVydHlcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKlxuICogQGZ1bmN0aW9uIHNldE9uV2luZG93XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1hbmd1bGFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRPbldpbmRvdyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgZ2V0V2luZG93KClba2V5XSA9IHZhbHVlO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIGdsb2JhbCB3aW5kb3cgb2JqZWN0XG4gKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgc2FmZSB3YXkgdG8gYWNjZXNzIHRoZSBnbG9iYWwgd2luZG93IG9iamVjdC5cbiAqIEl0IHVzZXMgZ2xvYmFsVGhpcyB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSBhY3Jvc3MgZGlmZmVyZW50IEphdmFTY3JpcHQgZW52aXJvbm1lbnRzLlxuICogVGhpcyBpcyB0aGUgY29yZSBmdW5jdGlvbiB1c2VkIGJ5IG90aGVyIHdpbmRvdy1yZWxhdGVkIHV0aWxpdHkgZnVuY3Rpb25zIHRvXG4gKiBhY2Nlc3MgdGhlIHdpbmRvdyBvYmplY3QuXG4gKlxuICogQHJldHVybiB7V2luZG93fSBUaGUgZ2xvYmFsIHdpbmRvdyBvYmplY3RcbiAqXG4gKiBAZnVuY3Rpb24gZ2V0V2luZG93XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1hbmd1bGFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXaW5kb3coKTogV2luZG93ICYgS2V5VmFsdWUge1xuICByZXR1cm4gKGdsb2JhbFRoaXMgYXMgS2V5VmFsdWUpPy5bJ3dpbmRvdyddIGFzIFdpbmRvdyAmIEtleVZhbHVlO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIHdpZHRoIG9mIHRoZSBicm93c2VyIHdpbmRvd1xuICogQHN1bW1hcnkgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIGNvbnZlbmllbnQgd2F5IHRvIGdldCB0aGUgY3VycmVudCB3aWR0aCBvZiB0aGUgYnJvd3NlciB3aW5kb3cuXG4gKiBJdCB1c2VzIHRoZSBnZXRPbldpbmRvdyBmdW5jdGlvbiB0byBhY2Nlc3MgdGhlICdpbm5lcldpZHRoJyBwcm9wZXJ0eSBvZiB0aGUgd2luZG93IG9iamVjdC5cbiAqIFRoaXMgaXMgdXNlZnVsIGZvciByZXNwb25zaXZlIGRlc2lnbiBpbXBsZW1lbnRhdGlvbnMgYW5kIHZpZXdwb3J0LWJhc2VkIGNhbGN1bGF0aW9ucy5cbiAqXG4gKiBAcmV0dXJuIHtudW1iZXIgfCB1bmRlZmluZWR9IFRoZSBjdXJyZW50IHdpZHRoIG9mIHRoZSBicm93c2VyIHdpbmRvdyBpbiBwaXhlbHNcbiAqXG4gKiBAZnVuY3Rpb24gZ2V0V2luZG93V2lkdGhcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWFuZ3VsYXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdpbmRvd1dpZHRoKCk6IG51bWJlciB7XG4gIHJldHVybiBnZXRPbldpbmRvdygnaW5uZXJXaWR0aCcpIGFzIG51bWJlciB8fCAwO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB2YWx1ZSBpcyAgbm90IHVuZGVmaW5lZFxuICogQHN1bW1hcnkgVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIGRldGVybWluZXMgd2hldGhlciBhIGdpdmVuIHZhbHVlIGlzIG5vdCB1bmRlZmluZWQuXG4gKiBJdCdzIGEgc2ltcGxlIHdyYXBwZXIgdGhhdCBtYWtlcyBjb2RlIG1vcmUgcmVhZGFibGUgd2hlbiBjaGVja2luZyBmb3IgZGVmaW5lZCB2YWx1ZXMuXG4gKiBUaGUgZnVuY3Rpb24gaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgY2hlY2tpbmcgU3RyaW5nT3JCb29sZWFuIHByb3BlcnRpZXMgdGhhdCBtaWdodCBiZSB1bmRlZmluZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmdPckJvb2xlYW4gfCB1bmRlZmluZWR9IHByb3AgLSBUaGUgcHJvcGVydHkgdG8gY2hlY2tcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHByb3BlcnR5IGlzIG5vdCB1bmRlZmluZWQsIGZhbHNlIG90aGVyd2lzZVxuICpcbiAqIEBmdW5jdGlvbiBpc05vdFVuZGVmaW5lZFxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItYW5ndWxhclxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOb3RVbmRlZmluZWQocHJvcDogU3RyaW5nT3JCb29sZWFuIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAocHJvcCAhPT0gdW5kZWZpbmVkKSBhcyBib29sZWFuO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBsb2NhbGUgc3RyaW5nIGZyb20gYSBjbGFzcyBuYW1lIG9yIGluc3RhbmNlXG4gKiBAc3VtbWFyeSBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gY29udmVydHMgYSBjbGFzcyBuYW1lIG9yIGluc3RhbmNlIGludG8gYSBsb2NhbGUgc3RyaW5nXG4gKiB0aGF0IGNhbiBiZSB1c2VkIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiBwdXJwb3Nlcy4gSXQgaGFuZGxlcyBkaWZmZXJlbnQgaW5wdXQgdHlwZXNcbiAqIChzdHJpbmcsIGZ1bmN0aW9uLCBvciBvYmplY3QpIGFuZCBhcHBsaWVzIGZvcm1hdHRpbmcgcnVsZXMgdG8gZ2VuZXJhdGUgYSBjb25zaXN0ZW50XG4gKiBsb2NhbGUgaWRlbnRpZmllci4gRm9yIHNob3J0IG5hbWVzIChsZXNzIHRoYW4gMyBwYXJ0cyksIGl0IHJldmVyc2VzIHRoZSBkb3Qtc2VwYXJhdGVkXG4gKiBzdHJpbmcuIEZvciBsb25nZXIgbmFtZXMsIGl0IHVzZXMgdGhlIGxhc3QgcGFydCBhcyBhIHByZWZpeCBhbmQgam9pbnMgdGhlIHJlc3Qgd2l0aFxuICogdW5kZXJzY29yZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8RnVuY3Rpb25MaWtlfG9iamVjdH0gaW5zdGFuY2UgLSBUaGUgaW5wdXQgdG8gZ2VuZXJhdGUgdGhlIGxvY2FsZSBmcm9tIChjbGFzcyBuYW1lLCBjb25zdHJ1Y3Rvciwgb3IgaW5zdGFuY2UpXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N1ZmZpeF0gLSBPcHRpb25hbCBzdHJpbmcgdG8gYXBwZW5kIHRvIHRoZSBpbnN0YW5jZSBuYW1lIGJlZm9yZSBwcm9jZXNzaW5nXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEEgZm9ybWF0dGVkIGxvY2FsZSBzdHJpbmcgZGVyaXZlZCBmcm9tIHRoZSBpbnB1dFxuICpcbiAqIEBmdW5jdGlvbiBnZXRMb2NhbGVGcm9tQ2xhc3NOYW1lXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1hbmd1bGFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2NhbGVGcm9tQ2xhc3NOYW1lKFxuICBpbnN0YW5jZTogc3RyaW5nIHwgRnVuY3Rpb25MaWtlIHwgb2JqZWN0LFxuICBzdWZmaXg/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgaW5zdGFuY2UgIT09ICdzdHJpbmcnKVxuICAgIGluc3RhbmNlID1cbiAgICAgIChpbnN0YW5jZSBhcyBGdW5jdGlvbkxpa2UpLm5hbWUgfHwgKGluc3RhbmNlIGFzIG9iamVjdCk/LmNvbnN0cnVjdG9yPy5uYW1lO1xuXG4gIGxldCBuYW1lOiBzdHJpbmcgfCBzdHJpbmdbXSA9IGluc3RhbmNlO1xuXG4gIGlmIChzdWZmaXgpIG5hbWUgPSBgJHtpbnN0YW5jZX0ke3N1ZmZpeC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN1ZmZpeC5zbGljZSgxKX1gO1xuXG4gIG5hbWUgPSBuYW1lXG4gICAgLnJlcGxhY2UoL198LS9nLCAnJylcbiAgICAucmVwbGFjZSgvKD86Xlxcd3xbQS1aXXxcXGJcXHcpL2csICh3b3JkOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChpbmRleCA+IDEpIHdvcmQgPSAnLicgKyB3b3JkO1xuICAgICAgcmV0dXJuIHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICB9KVxuICAgIC5zcGxpdCgnLicpO1xuXG4gIGlmIChuYW1lLmxlbmd0aCA8IDMpXG4gICAgcmV0dXJuIG5hbWUucmV2ZXJzZSgpLmpvaW4oJy4nKTtcblxuICBjb25zdCBwcmVmZml4ID0gbmFtZVtuYW1lLmxlbmd0aCAtIDFdO1xuICBuYW1lLnBvcCgpO1xuICBuYW1lID0gbmFtZS5qb2luKCdfJyk7XG4gIHJldHVybiBgJHtwcmVmZml4fS4ke25hbWV9YDtcblxuXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIGxvY2FsaXplZCBzdHJpbmcgYnkgY29tYmluaW5nIGxvY2FsZSBhbmQgcGhyYXNlXG4gKiBAc3VtbWFyeSBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gY3JlYXRlcyBhIHByb3Blcmx5IGZvcm1hdHRlZCBsb2NhbGUgc3RyaW5nIGJ5IGNvbWJpbmluZ1xuICogYSBsb2NhbGUgaWRlbnRpZmllciB3aXRoIGEgcGhyYXNlLiBJdCBoYW5kbGVzIGVkZ2UgY2FzZXMgc3VjaCBhcyBlbXB0eSBwaHJhc2VzLFxuICogbWlzc2luZyBsb2NhbGVzLCBhbmQgcGhyYXNlcyB0aGF0IGFscmVhZHkgaW5jbHVkZSB0aGUgbG9jYWxlIHByZWZpeC4gVGhpcyBmdW5jdGlvblxuICogaXMgdXNlZnVsIGZvciBlbnN1cmluZyBjb25zaXN0ZW50IGZvcm1hdHRpbmcgb2YgbG9jYWxpemVkIHN0cmluZ3MgdGhyb3VnaG91dCB0aGUgYXBwbGljYXRpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsZSAtIFRoZSBsb2NhbGUgaWRlbnRpZmllciAoZS5nLiwgJ2VuJywgJ2ZyJylcbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBwaHJhc2UgLSBUaGUgcGhyYXNlIHRvIGxvY2FsaXplXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgbG9jYWxlIHN0cmluZywgb3IgZW1wdHkgc3RyaW5nIGlmIHBocmFzZSBpcyB1bmRlZmluZWRcbiAqXG4gKiBAZnVuY3Rpb24gZ2VuZXJhdGVMb2NhbGVGcm9tU3RyaW5nXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1hbmd1bGFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUxvY2FsZUZyb21TdHJpbmcoXG4gIGxvY2FsZTogc3RyaW5nLFxuICBwaHJhc2U6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHtcbiAgaWYgKCFwaHJhc2UpIHJldHVybiAnJztcbiAgaWYgKCFsb2NhbGUgfHwgcGhyYXNlLmluY2x1ZGVzKGAke2xvY2FsZX0uYCkpIHJldHVybiBwaHJhc2U7XG4gIHJldHVybiBgJHtsb2NhbGV9LiR7cGhyYXNlfWA7XG59XG5cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSBjdXJyZW50IGxvY2FsZSBsYW5ndWFnZVxuICogQHN1bW1hcnkgVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIGdldHMgdGhlIGN1cnJlbnQgbG9jYWxlIGxhbmd1YWdlIGJhc2VkIG9uIHRoZSB1c2VyJ3MgYnJvd3NlciBzZXR0aW5ncy5cbiAqIEl0IHByb3ZpZGVzIGEgY29uc2lzdGVudCB3YXkgdG8gYWNjZXNzIHRoZSB1c2VyJ3MgbGFuZ3VhZ2UgcHJlZmVyZW5jZSB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbi5cbiAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBicm93c2VyJ3MgbmF2aWdhdG9yLmxhbmd1YWdlIHZhbHVlLCBkZWZhdWx0aW5nIHRvICdlbicgaWYgbm90IGF2YWlsYWJsZS5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjdXJyZW50IGxvY2FsZSBsYW5ndWFnZSAoZS5nLiwgJ2VuJywgJ2ZyJylcbiAqXG4gKiBAZnVuY3Rpb24gZ2V0TG9jYWxlTGFuZ3VhZ2VcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWFuZ3VsYXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsZUxhbmd1YWdlKCk6IHN0cmluZyB7XG4gIGNvbnN0IHdpbiA9IGdldFdpbmRvdygpO1xuICByZXR1cm4gKHdpbiBhcyBXaW5kb3cpLm5hdmlnYXRvci5sYW5ndWFnZSB8fCBcImVuXCI7XG4gIC8vIHJldHVybiB3aW4/LltXSU5ET1dfS0VZUy5MQU5HVUFHRV9TRUxFQ1RFRF0gfHwgKHdpbi5uYXZpZ2F0b3IubGFuZ3VhZ2UgfHwgJycpLnNwbGl0KCctJylbMF0gfHwgXCJlblwiO1xufVxuXG5cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgcmFuZG9tIHN0cmluZyBvciBudW1iZXIgb2Ygc3BlY2lmaWVkIGxlbmd0aFxuICogQHN1bW1hcnkgVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIGNyZWF0ZXMgYSByYW5kb20gc3RyaW5nIG9mIGEgc3BlY2lmaWVkIGxlbmd0aC5cbiAqIEl0IGNhbiBnZW5lcmF0ZSBlaXRoZXIgYWxwaGFudW1lcmljIHN0cmluZ3MgKGluY2x1ZGluZyB1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZSBsZXR0ZXJzKVxuICogb3IgbnVtZXJpYy1vbmx5IHN0cmluZ3MuIFRoaXMgaXMgdXNlZnVsIGZvciBjcmVhdGluZyByYW5kb20gSURzLCB0ZW1wb3JhcnkgcGFzc3dvcmRzLFxuICogb3Igb3RoZXIgcmFuZG9tIGlkZW50aWZpZXJzIHRocm91Z2hvdXQgdGhlIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPThdIC0gVGhlIGxlbmd0aCBvZiB0aGUgcmFuZG9tIHZhbHVlIHRvIGdlbmVyYXRlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvbmx5TnVtYmVycz1mYWxzZV0gLSBXaGV0aGVyIHRvIGdlbmVyYXRlIG9ubHkgbnVtZXJpYyBjaGFyYWN0ZXJzXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEEgcmFuZG9tbHkgZ2VuZXJhdGVkIHN0cmluZyBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCBhbmQgY2hhcmFjdGVyIHNldFxuICpcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZVJhbmRvbVZhbHVlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1hbmd1bGFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVJhbmRvbVZhbHVlKGxlbmd0aDogbnVtYmVyID0gOCwgb25seU51bWJlcnM6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gIGNvbnN0IGNoYXJzID0gb25seU51bWJlcnNcbiAgICA/ICcwMTIzNDU2Nzg5J1xuICAgIDogJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JztcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKVxuICAgIHJlc3VsdCArPSBjaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG4vKipcbiAqIENvbnZlcnRzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgYm9vbGVhbiBvciBhIGJvb2xlYW4gdmFsdWUgdG8gYSBib29sZWFuIHR5cGUuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHsoJ3RydWUnIHwgJ2ZhbHNlJyB8IGJvb2xlYW4pfSBwcm9wIC0gVGhlIHZhbHVlIHRvIGNvbnZlcnQuIENhbiBiZSB0aGUgc3RyaW5nICd0cnVlJywgJ2ZhbHNlJywgb3IgYSBib29sZWFuLlxuICogQHJldHVybnMge2Jvb2xlYW59IFRoZSBib29sZWFuIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnB1dCB2YWx1ZS4gUmV0dXJucyB0cnVlIGlmIHRoZSBpbnB1dCBpcyB0aGUgc3RyaW5nICd0cnVlJyBvciBib29sZWFuIHRydWUsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1RvQm9vbGVhbihwcm9wOiAndHJ1ZScgfCAnZmFsc2UnIHwgYm9vbGVhbik6IGJvb2xlYW4ge1xuICBpZih0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycpXG4gICAgcHJvcCA9IHByb3AudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnID8gdHJ1ZSA6IGZhbHNlO1xuICByZXR1cm4gcHJvcDtcbn1cblxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIGEgdmFsaWQgRGF0ZSBvYmplY3RcbiAqXG4gKiBAcGFyYW0geyhzdHJpbmcgfCBEYXRlIHwgbnVtYmVyKX0gZGF0ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay4gQ2FuIGJlIGEgRGF0ZSBvYmplY3QsIGEgdGltZXN0YW1wIG51bWJlciwgb3IgYSBkYXRlIHN0cmluZ1xuICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIERhdGUgb2JqZWN0IChub3QgTmFOKSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRGF0ZShkYXRlOiBzdHJpbmcgfCBEYXRlIHwgbnVtYmVyKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChkYXRlIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNOYU4oZGF0ZSBhcyB1bmtub3duIGFzIG51bWJlcikpIHx8ICgoKSA9PiB7XG4gICAgICBjb25zdCB0ZXN0UmVnZXggPSBuZXcgUmVnRXhwKC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLykudGVzdChkYXRlIGFzIHN0cmluZylcbiAgICAgIGlmKHR5cGVvZiBkYXRlICE9PSBQcmltaXRpdmVzLlNUUklORyB8fCAhKGRhdGUgYXMgc3RyaW5nKT8uaW5jbHVkZXMoJ1QnKSAmJiAhdGVzdFJlZ2V4KVxuICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgIGRhdGUgPSAoZGF0ZSBhcyBzdHJpbmcpLnNwbGl0KCdUJylbMF07XG4gICAgaWYoIW5ldyBSZWdFeHAoL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvKS50ZXN0KGRhdGUpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuICEhKG5ldyBEYXRlKGRhdGUpKTtcbiAgIH0pKCk7XG4gIH0gY2F0Y2goZXJyb3I6IHVua25vd24pIHtcbiAgICBnZXRMb2dnZXIoaXNWYWxpZERhdGUpLmVycm9yKGVycm9yIGFzIEVycm9yIHwgc3RyaW5nKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3JtYXRzIGEgZGF0ZSBpbnRvIGEgbG9jYWxpemVkIHN0cmluZyByZXByZXNlbnRhdGlvblxuICpcbiAqIEBwYXJhbSB7KHN0cmluZyB8IERhdGUgfCBudW1iZXIpfSBkYXRlIC0gVGhlIGRhdGUgdG8gZm9ybWF0LiBDYW4gYmUgYSBEYXRlIG9iamVjdCwgYSB0aW1lc3RhbXAgbnVtYmVyLCBvciBhIGRhdGUgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW2xvY2FsZV0gLSBUaGUgbG9jYWxlIHRvIHVzZSBmb3IgZm9ybWF0dGluZy4gSWYgbm90IHByb3ZpZGVkLCB0aGUgc3lzdGVtJ3MgbG9jYWxlIHdpbGwgYmUgdXNlZFxuICogQHJldHVybiB7KERhdGUgfCBzdHJpbmcpfSBBIGZvcm1hdHRlZCBkYXRlIHN0cmluZyBpbiB0aGUgZm9ybWF0IEREL01NL1lZWVkgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgbG9jYWxlLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICBvciB0aGUgb3JpZ2luYWwgaW5wdXQgYXMgYSBzdHJpbmcgaWYgdGhlIGRhdGUgaXMgaW52YWxpZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlOiBzdHJpbmcgfCBEYXRlIHwgbnVtYmVyLCBsb2NhbGU/OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBEYXRlIHwgc3RyaW5nIHtcblxuICBpZighbG9jYWxlKVxuICAgIGxvY2FsZSA9IGdldExvY2FsZUxhbmd1YWdlKCk7XG5cbiAgaWYodHlwZW9mIGRhdGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBkYXRlID09PSAnbnVtYmVyJylcbiAgICBkYXRlID0gbmV3IERhdGUodHlwZW9mIGRhdGUgPT09ICdzdHJpbmcnID8gZGF0ZS5yZXBsYWNlKC9cXC8vZywgJy0nKSA6IGRhdGUpO1xuXG4gIGlmKCFpc1ZhbGlkRGF0ZShkYXRlKSlcbiAgICByZXR1cm4gYCR7ZGF0ZX1gIGFzIHN0cmluZztcbiAgY29uc3QgciA9IGRhdGUudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7XG4gICAgICB5ZWFyOiBcIm51bWVyaWNcIixcbiAgICAgIGRheTogXCIyLWRpZ2l0XCIsXG4gICAgICBtb250aDogJzItZGlnaXQnXG4gIH0pO1xuXG5cbiAgcmV0dXJuIHI7XG59XG5cbi8qKlxuICogQXR0ZW1wdHMgdG8gcGFyc2UgYSBkYXRlIHN0cmluZywgRGF0ZSBvYmplY3QsIG9yIG51bWJlciBpbnRvIGEgdmFsaWQgRGF0ZSBvYmplY3RcbiAqXG4gKiBAcGFyYW0geyhzdHJpbmcgfCBEYXRlIHwgbnVtYmVyKX0gZGF0ZSAtIFRoZSBkYXRlIHRvIHBhcnNlLiBDYW4gYmUgYSBEYXRlIG9iamVjdCwgYSB0aW1lc3RhbXAgbnVtYmVyLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEgZGF0ZSBzdHJpbmcgaW4gdGhlIGZvcm1hdCBcIkREL01NL1lZWVkgSEg6TU06U1M6TVNcIlxuICogQHJldHVybiB7KERhdGUgfCBudWxsKX0gQSB2YWxpZCBEYXRlIG9iamVjdCBpZiBwYXJzaW5nIGlzIHN1Y2Nlc3NmdWwsIG9yIG51bGwgaWYgdGhlIGRhdGUgaXMgaW52YWxpZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgb3IgZG9lc24ndCBtYXRjaCB0aGUgZXhwZWN0ZWQgZm9ybWF0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRvVmFsaWREYXRlKGRhdGU6IHN0cmluZyB8IERhdGUgfCBudW1iZXIpOiBEYXRlIHwgbnVsbCB7XG4gIGlmKGlzVmFsaWREYXRlKGRhdGUpKVxuICAgIHJldHVybiBkYXRlIGFzIERhdGU7XG5cbiAgaWYoIWAke2RhdGV9YC5pbmNsdWRlcygnLycpKVxuICAgIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IFtkYXRlU3RyaW5nLCB0aW1lU3RyaW5nXSA9IChkYXRlIGFzIHN0cmluZykuc3BsaXQoJyAnKTtcbiAgY29uc3QgW2RheSwgbW9udGgsIHllYXJdID0gZGF0ZVN0cmluZy5zcGxpdCgnLycpLm1hcChOdW1iZXIpO1xuICBjb25zdCBbaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpc2Vjb25kc10gPSB0aW1lU3RyaW5nLnNwbGl0KCc6JykubWFwKE51bWJlcik7XG4gIGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheSwgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpc2Vjb25kcyk7XG5cbiAgaWYoIWlzVmFsaWREYXRlKGRhdGUpKSB7XG4gICAgY29uc29sZS53YXJuKCdwYXJzZVRvVmFsaWREYXRlIC0gSW52YWxpZCBkYXRlIGZvcm1hdCcsIGRhdGUpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGRhdGU7XG59XG5cblxuLyoqXG4gKiBNYXBzIGFuIGl0ZW0gb2JqZWN0IHVzaW5nIGEgcHJvdmlkZWQgbWFwcGVyIG9iamVjdCBhbmQgb3B0aW9uYWwgYWRkaXRpb25hbCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7S2V5VmFsdWV9IGl0ZW0gLSBUaGUgc291cmNlIG9iamVjdCB0byBiZSBtYXBwZWQuXG4gKiBAcGFyYW0ge0tleVZhbHVlfSBtYXBwZXIgLSBBbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBtYXBwaW5nIHJ1bGVzLiBLZXlzIHJlcHJlc2VudCB0aGUgbmV3IHByb3BlcnR5IG5hbWVzLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHZhbHVlcyByZXByZXNlbnQgdGhlIHBhdGggdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGluIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHtLZXlWYWx1ZX0gW3Byb3BzXSAtIE9wdGlvbmFsIGFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgbWFwcGVkIG9iamVjdC5cbiAqIEByZXR1cm5zIHtLZXlWYWx1ZX0gQSBuZXcgb2JqZWN0IHdpdGggcHJvcGVydGllcyBtYXBwZWQgYWNjb3JkaW5nIHRvIHRoZSBtYXBwZXIgb2JqZWN0IGFuZCBpbmNsdWRpbmcgYW55IGFkZGl0aW9uYWwgcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGl0ZW1NYXBwZXIoaXRlbTogS2V5VmFsdWUsIG1hcHBlcjogS2V5VmFsdWUsIHByb3BzPzogS2V5VmFsdWUpOiBLZXlWYWx1ZSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhtYXBwZXIpLnJlZHVjZSgoYWNjdW06IEtleVZhbHVlLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBjb25zdCBhcnJheVZhbHVlID0gKHZhbHVlIGFzIHN0cmluZykuc3BsaXQoJy4nKTtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICBhY2N1bVtrZXldID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhcnJheVZhbHVlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBhY2N1bVtrZXldID0gaXRlbT8uW3ZhbHVlIGFzIHN0cmluZ10gfHwgdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgdmFsO1xuXG4gICAgICAgIGZvciAoY29uc3QgX3ZhbHVlIG9mIGFycmF5VmFsdWUpXG4gICAgICAgICAgdmFsID0gIXZhbFxuICAgICAgICAgICAgPyBpdGVtW192YWx1ZV1cbiAgICAgICAgICAgIDogKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZSh2YWwpIDogdmFsKVtfdmFsdWVdO1xuXG4gICAgICAgIGlmIChpc1ZhbGlkRGF0ZShuZXcgRGF0ZSh2YWwpKSkgdmFsID0gYCR7Zm9ybWF0RGF0ZSh2YWwpfWA7XG5cbiAgICAgICAgYWNjdW1ba2V5XSA9IHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogdmFsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMgfHwge30sIGFjY3VtKTtcbiAgfSwge30pO1xufVxuXG4vKipcbiAqIE1hcHMgYW4gYXJyYXkgb2YgZGF0YSBvYmplY3RzIHVzaW5nIGEgcHJvdmlkZWQgbWFwcGVyIG9iamVjdC5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSByZXN1bHRpbmcgbWFwcGVkIGl0ZW1zLlxuICogQHBhcmFtIHthbnlbXX0gZGF0YSAtIFRoZSBhcnJheSBvZiBkYXRhIG9iamVjdHMgdG8gYmUgbWFwcGVkLlxuICogQHBhcmFtIHtLZXlWYWx1ZX0gbWFwcGVyIC0gQW4gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgbWFwcGluZyBydWxlcy5cbiAqIEBwYXJhbSB7S2V5VmFsdWV9IFtwcm9wc10gLSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIG1hcHBlZCBpdGVtcy5cbiAqXG4gKiBAcmV0dXJucyB7VFtdfSAtIFRoZSBhcnJheSBvZiBtYXBwZWQgaXRlbXMuIElmIGFuIGl0ZW0gaW4gdGhlIG9yaWdpbmFsIGFycmF5IGRvZXMgbm90IGhhdmUgYW55IG5vbi1udWxsIHZhbHVlcyBhZnRlciBtYXBwaW5nLFxuICogdGhlIG9yaWdpbmFsIGl0ZW0gaXMgcmV0dXJuZWQgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGFNYXBwZXI8VD4oZGF0YTogVFtdLCBtYXBwZXI6IEtleVZhbHVlLCBwcm9wcz86IEtleVZhbHVlKTogVFtdIHtcbiAgaWYgKCFkYXRhIHx8ICFkYXRhLmxlbmd0aCkgcmV0dXJuIFtdO1xuICByZXR1cm4gZGF0YS5yZWR1Y2UoKGFjY3VtOiBUW10sIGN1cnIpID0+IHtcbiAgICBjb25zdCBpdGVtID0gaXRlbU1hcHBlcihjdXJyIGFzIEtleVZhbHVlLCBtYXBwZXIsIHByb3BzKSBhcyBUO1xuICAgIGNvbnN0IGhhc1ZhbHVlcyA9XG4gICAgICBbLi4ubmV3IFNldChPYmplY3QudmFsdWVzKGl0ZW0gYXMgVFtdKSldLmZpbHRlcigodmFsdWUpID0+IHZhbHVlKS5sZW5ndGggPlxuICAgICAgMDtcbiAgICAvLyBjYXNvIG8gaXRlbSBmaWx0cmFkbyBuw6NvIHBvc3N1YSBuZW5odW0gdmFsb3IsIHBhc3NhciBvIG9iamV0byBvcmlnaW5hbFxuICAgIGFjY3VtLnB1c2goaGFzVmFsdWVzID8gaXRlbSA6IGN1cnIpO1xuICAgIHJldHVybiBhY2N1bTtcbiAgfSwgW10pO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVGb2N1c1RyYXAoKTogdm9pZCB7XG4gIGNvbnN0IGRvYyA9IGdldFdpbmRvd0RvY3VtZW50KCk7XG4gIGlmKGRvYz8uYWN0aXZlRWxlbWVudClcbiAgICAoZG9jLmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpPy5ibHVyKCk7XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvaW50ZXJmYWNlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBJbnRlcmZhY2UgZm9yIGNvbXBvbmVudHMgdGhhdCBob2xkIGFuIEVsZW1lbnRSZWZcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBjb21wb25lbnQgaG9sZGVyIGludGVyZmFjZSB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBET00gZWxlbWVudCB0aHJvdWdoIEVsZW1lbnRSZWZcbiAqIEBpbnRlcmZhY2UgQ29tcG9uZW50SG9sZGVyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1hbmd1bGFyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50SG9sZGVyIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCdzIERPTSBlbGVtZW50XG4gICAqIEBwcm9wZXJ0eSB7RWxlbWVudFJlZn0gY29tcG9uZW50IC0gVGhlIEVsZW1lbnRSZWYgaW5zdGFuY2UgcHJvdmlkaW5nIGFjY2VzcyB0byB0aGUgbmF0aXZlIERPTSBlbGVtZW50XG4gICAqL1xuICBjb21wb25lbnQ6IEVsZW1lbnRSZWY7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEludGVyZmFjZSBmb3IgZm9ybSBjb21wb25lbnRzIHRoYXQgaG9sZCBib3RoIGFuIEVsZW1lbnRSZWYgYW5kIGEgRm9ybUdyb3VwXG4gKiBAc3VtbWFyeSBFeHRlbmRzIENvbXBvbmVudEhvbGRlciB0byBpbmNsdWRlIGEgRm9ybUdyb3VwIGZvciBmb3JtIGhhbmRsaW5nIGNhcGFiaWxpdGllc1xuICogQGludGVyZmFjZSBGb3JtRWxlbWVudFxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItYW5ndWxhclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1FbGVtZW50IGV4dGVuZHMgQ29tcG9uZW50SG9sZGVyIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgQW5ndWxhciBGb3JtR3JvdXAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZm9ybSBlbGVtZW50XG4gICAqIEBwcm9wZXJ0eSB7Rm9ybUdyb3VwfHVuZGVmaW5lZH0gZm9ybUdyb3VwIC0gVGhlIGZvcm0gZ3JvdXAgaW5zdGFuY2UgZm9yIG1hbmFnaW5nIGZvcm0gY29udHJvbHMgYW5kIHZhbGlkYXRpb25cbiAgICovXG4gIGZvcm1Hcm91cDogRm9ybUdyb3VwIHwgdW5kZWZpbmVkO1xufVxuIl19
@@ -0,0 +1,14 @@
1
+ import '@decaf-ts/ui-decorators';
2
+ export * from './components';
3
+ export * from './engine';
4
+ export * from './directives';
5
+ export * from './helpers';
6
+ export * from './for-angular.module';
7
+ /**
8
+ * @description Angular integration for the Decaf framework
9
+ * @summary This module provides Angular components and services for integrating with the Decaf framework.
10
+ * It includes components for rendering models, CRUD operations, and form handling, as well as
11
+ * rendering engines and utility functions to facilitate Angular application development with Decaf.
12
+ * @module for-angular
13
+ */
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3B1YmxpYy1hcGlzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8seUJBQXlCLENBQUM7QUFDakMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQzs7Ozs7O0dBTUciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ0BkZWNhZi10cy91aS1kZWNvcmF0b3JzJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50cyc7XG5leHBvcnQgKiBmcm9tICcuL2VuZ2luZSc7XG5leHBvcnQgKiBmcm9tICcuL2RpcmVjdGl2ZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9oZWxwZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vZm9yLWFuZ3VsYXIubW9kdWxlJztcbi8qKlxuICogQGRlc2NyaXB0aW9uIEFuZ3VsYXIgaW50ZWdyYXRpb24gZm9yIHRoZSBEZWNhZiBmcmFtZXdvcmtcbiAqIEBzdW1tYXJ5IFRoaXMgbW9kdWxlIHByb3ZpZGVzIEFuZ3VsYXIgY29tcG9uZW50cyBhbmQgc2VydmljZXMgZm9yIGludGVncmF0aW5nIHdpdGggdGhlIERlY2FmIGZyYW1ld29yay5cbiAqIEl0IGluY2x1ZGVzIGNvbXBvbmVudHMgZm9yIHJlbmRlcmluZyBtb2RlbHMsIENSVUQgb3BlcmF0aW9ucywgYW5kIGZvcm0gaGFuZGxpbmcsIGFzIHdlbGwgYXNcbiAqIHJlbmRlcmluZyBlbmdpbmVzIGFuZCB1dGlsaXR5IGZ1bmN0aW9ucyB0byBmYWNpbGl0YXRlIEFuZ3VsYXIgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgd2l0aCBEZWNhZi5cbiAqIEBtb2R1bGUgZm9yLWFuZ3VsYXJcbiAqL1xuIl19