@signaltree/ng-forms 1.1.0 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,33 +2,12 @@ import * as i0 from '@angular/core';
2
2
  import { signal, isSignal, computed, EventEmitter, inject, ElementRef, Renderer2, effect, forwardRef, HostListener, Output, Input, Directive } from '@angular/core';
3
3
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
4
  import { Observable } from 'rxjs';
5
- import { signalTree } from '@signaltree/core';
5
+ import { signalTree, parsePath } from '@signaltree/core';
6
6
 
7
- /**
8
- * @fileoverview Angular Forms Integration for SignalTree
9
- *
10
- * Provides comprehensive Angular form integration including FormTree,
11
- * directives, validators, enhanced array operations, and RxJS bridge.
12
- */
13
- // ============================================
14
- // UTILITY FUNCTIONS
15
- // ============================================
16
- /**
17
- * Simple path parsing for nested field access
18
- */
19
- function parsePath(path) {
20
- return path.split('.');
21
- }
22
- // ============================================
23
- // FORM TREE IMPLEMENTATION
24
- // ============================================
25
7
  function createFormTree(initialValues, config = {}) {
26
8
  const { validators = {}, asyncValidators = {}, ...treeConfig } = config;
27
- // Create the underlying signal tree
28
9
  const valuesTree = signalTree(initialValues, treeConfig);
29
- // Ensure the state has the correct type - this is the key fix
30
10
  const flattenedState = valuesTree.state;
31
- // Create form-specific signals
32
11
  const formSignals = {
33
12
  errors: signal({}),
34
13
  asyncErrors: signal({}),
@@ -39,7 +18,6 @@ function createFormTree(initialValues, config = {}) {
39
18
  submitting: signal(false),
40
19
  };
41
20
  const markDirty = () => formSignals.dirty.set(true);
42
- // Enhance arrays with natural operations
43
21
  const enhanceArray = (arraySignal) => {
44
22
  const enhanced = arraySignal;
45
23
  enhanced.push = (item) => {
@@ -79,7 +57,6 @@ function createFormTree(initialValues, config = {}) {
79
57
  };
80
58
  return enhanced;
81
59
  };
82
- // Recursively enhance all arrays in the state
83
60
  const enhanceArraysRecursively = (obj) => {
84
61
  for (const key in obj) {
85
62
  const value = obj[key];
@@ -96,9 +73,7 @@ function createFormTree(initialValues, config = {}) {
96
73
  }
97
74
  }
98
75
  };
99
- // Enhance arrays in the state
100
76
  enhanceArraysRecursively(flattenedState);
101
- // Helper functions for nested paths
102
77
  const getNestedValue = (obj, path) => {
103
78
  const keys = parsePath(path);
104
79
  let current = obj;
@@ -133,7 +108,6 @@ function createFormTree(initialValues, config = {}) {
133
108
  const errors = {};
134
109
  const asyncErrors = {};
135
110
  const fieldsToValidate = field ? [field] : Object.keys(validators);
136
- // Sync validation
137
111
  for (const fieldPath of fieldsToValidate) {
138
112
  const validator = validators[fieldPath];
139
113
  if (validator) {
@@ -145,7 +119,6 @@ function createFormTree(initialValues, config = {}) {
145
119
  }
146
120
  }
147
121
  formSignals.errors.set(errors);
148
- // Async validation
149
122
  const asyncFieldsToValidate = field
150
123
  ? [field]
151
124
  : Object.keys(asyncValidators);
@@ -161,7 +134,6 @@ function createFormTree(initialValues, config = {}) {
161
134
  const result = asyncValidator(value);
162
135
  let error;
163
136
  if (result instanceof Observable) {
164
- // Handle Observable
165
137
  error = await new Promise((resolve) => {
166
138
  result.subscribe({
167
139
  next: (val) => resolve(val),
@@ -170,7 +142,6 @@ function createFormTree(initialValues, config = {}) {
170
142
  });
171
143
  }
172
144
  else {
173
- // Handle Promise
174
145
  error = await result;
175
146
  }
176
147
  if (error) {
@@ -187,16 +158,13 @@ function createFormTree(initialValues, config = {}) {
187
158
  }
188
159
  }
189
160
  formSignals.asyncErrors.set(asyncErrors);
190
- // Update validity
191
161
  const hasErrors = Object.keys(errors).length > 0;
192
162
  const hasAsyncErrors = Object.keys(asyncErrors).length > 0;
193
163
  const isValidating = Object.values(formSignals.asyncValidating()).some((v) => v);
194
164
  formSignals.valid.set(!hasErrors && !hasAsyncErrors && !isValidating);
195
165
  };
196
- // Create computed signals for field errors
197
166
  const fieldErrors = {};
198
167
  const fieldAsyncErrors = {};
199
- // Create error signals for all defined validators
200
168
  [...Object.keys(validators), ...Object.keys(asyncValidators)].forEach((fieldPath) => {
201
169
  fieldErrors[fieldPath] = computed(() => {
202
170
  const errors = formSignals.errors();
@@ -207,14 +175,10 @@ function createFormTree(initialValues, config = {}) {
207
175
  return errors[fieldPath];
208
176
  });
209
177
  });
210
- // Create the form tree object
211
178
  const formTree = {
212
- // Flattened state access
213
179
  state: flattenedState,
214
180
  $: flattenedState,
215
- // Form signals
216
181
  ...formSignals,
217
- // Core methods
218
182
  unwrap: () => valuesTree.unwrap(),
219
183
  setValue: (field, value) => {
220
184
  setNestedValue(field, value);
@@ -228,7 +192,6 @@ function createFormTree(initialValues, config = {}) {
228
192
  void validate();
229
193
  },
230
194
  reset: () => {
231
- // Reset each field individually to maintain signal reactivity
232
195
  const resetSignals = (current, initial) => {
233
196
  for (const [key, initialValue] of Object.entries(initial)) {
234
197
  const currentValue = current[key];
@@ -270,7 +233,6 @@ function createFormTree(initialValues, config = {}) {
270
233
  }
271
234
  },
272
235
  validate,
273
- // Field helpers
274
236
  getFieldError: (field) => fieldErrors[field] || computed(() => undefined),
275
237
  getFieldAsyncError: (field) => fieldAsyncErrors[field] || computed(() => undefined),
276
238
  getFieldTouched: (field) => computed(() => {
@@ -287,30 +249,20 @@ function createFormTree(initialValues, config = {}) {
287
249
  const asyncValidating = formSignals.asyncValidating();
288
250
  return asyncValidating[field];
289
251
  }),
290
- // Direct access
291
252
  fieldErrors,
292
253
  fieldAsyncErrors,
293
- // Keep values tree for backward compatibility
294
254
  values: valuesTree,
295
255
  };
296
256
  return formTree;
297
257
  }
298
- // ============================================
299
- // ANGULAR DIRECTIVE
300
- // ============================================
301
- /**
302
- * Simple directive for two-way binding with signals
303
- */
304
258
  class SignalValueDirective {
305
259
  signalTreeSignalValue;
306
260
  signalTreeSignalValueChange = new EventEmitter();
307
261
  elementRef = inject(ElementRef);
308
262
  renderer = inject(Renderer2);
309
263
  onChange = () => {
310
- // Empty implementation for ControlValueAccessor
311
264
  };
312
265
  onTouched = () => {
313
- // Empty implementation for ControlValueAccessor
314
266
  };
315
267
  ngOnInit() {
316
268
  effect(() => {
@@ -380,9 +332,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImpor
380
332
  type: HostListener,
381
333
  args: ['blur']
382
334
  }] } });
383
- // ============================================
384
- // VALIDATORS
385
- // ============================================
386
335
  const validators = {
387
336
  required: (message = 'Required') => (value) => !value ? message : null,
388
337
  email: (message = 'Invalid email') => (value) => {
@@ -406,9 +355,6 @@ const asyncValidators = {
406
355
  return exists ? message : null;
407
356
  },
408
357
  };
409
- // ============================================
410
- // RXJS BRIDGE
411
- // ============================================
412
358
  function toObservable(signal) {
413
359
  return new Observable((subscriber) => {
414
360
  try {
@@ -418,10 +364,8 @@ function toObservable(signal) {
418
364
  return () => effectRef.destroy();
419
365
  }
420
366
  catch {
421
- // Fallback for test environment without injection context
422
367
  subscriber.next(signal());
423
368
  return () => {
424
- // No cleanup needed for single emission
425
369
  };
426
370
  }
427
371
  });
@@ -450,14 +394,7 @@ function getChanges(oldState, newState) {
450
394
  }
451
395
  return changes;
452
396
  }
453
- // ============================================
454
- // EXPORTS
455
- // ============================================
456
397
  const SIGNAL_FORM_DIRECTIVES = [SignalValueDirective];
457
398
 
458
- /**
459
- * Generated bundle index. Do not edit.
460
- */
461
-
462
399
  export { SIGNAL_FORM_DIRECTIVES, SignalValueDirective, asyncValidators, createAuditMiddleware, createFormTree, toObservable, validators };
463
400
  //# sourceMappingURL=signaltree-ng-forms.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"signaltree-ng-forms.mjs","sources":["../tmp-esm2022/lib/ng-forms.js","../tmp-esm2022/signaltree-ng-forms.js"],"sourcesContent":["/**\n * @fileoverview Angular Forms Integration for SignalTree\n *\n * Provides comprehensive Angular form integration including FormTree,\n * directives, validators, enhanced array operations, and RxJS bridge.\n */\nimport { isSignal, signal, computed, effect, inject, Directive, Input, Output, EventEmitter, forwardRef, ElementRef, Renderer2, HostListener, } from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { signalTree } from '@signaltree/core';\nimport * as i0 from \"@angular/core\";\n// ============================================\n// UTILITY FUNCTIONS\n// ============================================\n/**\n * Simple path parsing for nested field access\n */\nfunction parsePath(path) {\n return path.split('.');\n}\n// ============================================\n// FORM TREE IMPLEMENTATION\n// ============================================\nexport function createFormTree(initialValues, config = {}) {\n const { validators = {}, asyncValidators = {}, ...treeConfig } = config;\n // Create the underlying signal tree\n const valuesTree = signalTree(initialValues, treeConfig);\n // Ensure the state has the correct type - this is the key fix\n const flattenedState = valuesTree.state;\n // Create form-specific signals\n const formSignals = {\n errors: signal({}),\n asyncErrors: signal({}),\n touched: signal({}),\n asyncValidating: signal({}),\n dirty: signal(false),\n valid: signal(true),\n submitting: signal(false),\n };\n const markDirty = () => formSignals.dirty.set(true);\n // Enhance arrays with natural operations\n const enhanceArray = (arraySignal) => {\n const enhanced = arraySignal;\n enhanced.push = (item) => {\n arraySignal.update((arr) => [...arr, item]);\n markDirty();\n };\n enhanced.removeAt = (index) => {\n arraySignal.update((arr) => arr.filter((_, i) => i !== index));\n markDirty();\n };\n enhanced.setAt = (index, value) => {\n arraySignal.update((arr) => arr.map((item, i) => (i === index ? value : item)));\n markDirty();\n };\n enhanced.insertAt = (index, item) => {\n arraySignal.update((arr) => [\n ...arr.slice(0, index),\n item,\n ...arr.slice(index),\n ]);\n markDirty();\n };\n enhanced.move = (from, to) => {\n arraySignal.update((arr) => {\n const newArr = [...arr];\n const [item] = newArr.splice(from, 1);\n if (item !== undefined) {\n newArr.splice(to, 0, item);\n }\n return newArr;\n });\n markDirty();\n };\n enhanced.clear = () => {\n arraySignal.set([]);\n markDirty();\n };\n return enhanced;\n };\n // Recursively enhance all arrays in the state\n const enhanceArraysRecursively = (obj) => {\n for (const key in obj) {\n const value = obj[key];\n if (isSignal(value)) {\n const signalValue = value();\n if (Array.isArray(signalValue)) {\n obj[key] = enhanceArray(value);\n }\n }\n else if (typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)) {\n enhanceArraysRecursively(value);\n }\n }\n };\n // Enhance arrays in the state\n enhanceArraysRecursively(flattenedState);\n // Helper functions for nested paths\n const getNestedValue = (obj, path) => {\n const keys = parsePath(path);\n let current = obj;\n for (const key of keys) {\n if (current && typeof current === 'object') {\n current = current[key];\n if (isSignal(current)) {\n current = current();\n }\n }\n else {\n return undefined;\n }\n }\n return current;\n };\n const setNestedValue = (path, value) => {\n const keys = parsePath(path);\n let current = flattenedState;\n for (let i = 0; i < keys.length - 1; i++) {\n current = current[keys[i]];\n if (!current)\n return;\n }\n const lastKey = keys[keys.length - 1];\n const target = current[lastKey];\n if (isSignal(target) && 'set' in target) {\n target.set(value);\n }\n };\n const validate = async (field) => {\n const errors = {};\n const asyncErrors = {};\n const fieldsToValidate = field ? [field] : Object.keys(validators);\n // Sync validation\n for (const fieldPath of fieldsToValidate) {\n const validator = validators[fieldPath];\n if (validator) {\n const value = getNestedValue(flattenedState, fieldPath);\n const error = validator(value);\n if (error) {\n errors[fieldPath] = error;\n }\n }\n }\n formSignals.errors.set(errors);\n // Async validation\n const asyncFieldsToValidate = field\n ? [field]\n : Object.keys(asyncValidators);\n for (const fieldPath of asyncFieldsToValidate) {\n const asyncValidator = asyncValidators[fieldPath];\n if (asyncValidator && (!field || field === fieldPath)) {\n formSignals.asyncValidating.update((v) => ({\n ...v,\n [fieldPath]: true,\n }));\n try {\n const value = getNestedValue(flattenedState, fieldPath);\n const result = asyncValidator(value);\n let error;\n if (result instanceof Observable) {\n // Handle Observable\n error = await new Promise((resolve) => {\n result.subscribe({\n next: (val) => resolve(val),\n error: () => resolve('Validation error'),\n });\n });\n }\n else {\n // Handle Promise\n error = await result;\n }\n if (error) {\n asyncErrors[fieldPath] = error;\n }\n }\n catch {\n asyncErrors[fieldPath] = 'Validation error';\n }\n formSignals.asyncValidating.update((v) => ({\n ...v,\n [fieldPath]: false,\n }));\n }\n }\n formSignals.asyncErrors.set(asyncErrors);\n // Update validity\n const hasErrors = Object.keys(errors).length > 0;\n const hasAsyncErrors = Object.keys(asyncErrors).length > 0;\n const isValidating = Object.values(formSignals.asyncValidating()).some((v) => v);\n formSignals.valid.set(!hasErrors && !hasAsyncErrors && !isValidating);\n };\n // Create computed signals for field errors\n const fieldErrors = {};\n const fieldAsyncErrors = {};\n // Create error signals for all defined validators\n [...Object.keys(validators), ...Object.keys(asyncValidators)].forEach((fieldPath) => {\n fieldErrors[fieldPath] = computed(() => {\n const errors = formSignals.errors();\n return errors[fieldPath];\n });\n fieldAsyncErrors[fieldPath] = computed(() => {\n const errors = formSignals.asyncErrors();\n return errors[fieldPath];\n });\n });\n // Create the form tree object\n const formTree = {\n // Flattened state access\n state: flattenedState,\n $: flattenedState,\n // Form signals\n ...formSignals,\n // Core methods\n unwrap: () => valuesTree.unwrap(),\n setValue: (field, value) => {\n setNestedValue(field, value);\n formSignals.touched.update((t) => ({ ...t, [field]: true }));\n markDirty();\n void validate(field);\n },\n setValues: (values) => {\n valuesTree.update((v) => ({ ...v, ...values }));\n markDirty();\n void validate();\n },\n reset: () => {\n // Reset each field individually to maintain signal reactivity\n const resetSignals = (current, initial) => {\n for (const [key, initialValue] of Object.entries(initial)) {\n const currentValue = current[key];\n if (isSignal(currentValue) && 'set' in currentValue) {\n currentValue.set(initialValue);\n }\n else if (typeof initialValue === 'object' &&\n initialValue !== null &&\n !Array.isArray(initialValue) &&\n typeof currentValue === 'object' &&\n currentValue !== null &&\n !isSignal(currentValue)) {\n resetSignals(currentValue, initialValue);\n }\n }\n };\n resetSignals(flattenedState, initialValues);\n formSignals.errors.set({});\n formSignals.asyncErrors.set({});\n formSignals.touched.set({});\n formSignals.asyncValidating.set({});\n formSignals.dirty.set(false);\n formSignals.valid.set(true);\n formSignals.submitting.set(false);\n },\n submit: async (submitFn) => {\n formSignals.submitting.set(true);\n try {\n await validate();\n if (!formSignals.valid()) {\n throw new Error('Form is invalid');\n }\n const currentValues = valuesTree.unwrap();\n const result = await submitFn(currentValues);\n return result;\n }\n finally {\n formSignals.submitting.set(false);\n }\n },\n validate,\n // Field helpers\n getFieldError: (field) => fieldErrors[field] || computed(() => undefined),\n getFieldAsyncError: (field) => fieldAsyncErrors[field] || computed(() => undefined),\n getFieldTouched: (field) => computed(() => {\n const touched = formSignals.touched();\n return touched[field];\n }),\n isFieldValid: (field) => computed(() => {\n const errors = formSignals.errors();\n const asyncErrors = formSignals.asyncErrors();\n const asyncValidating = formSignals.asyncValidating();\n return !errors[field] && !asyncErrors[field] && !asyncValidating[field];\n }),\n isFieldAsyncValidating: (field) => computed(() => {\n const asyncValidating = formSignals.asyncValidating();\n return asyncValidating[field];\n }),\n // Direct access\n fieldErrors,\n fieldAsyncErrors,\n // Keep values tree for backward compatibility\n values: valuesTree,\n };\n return formTree;\n}\n// ============================================\n// ANGULAR DIRECTIVE\n// ============================================\n/**\n * Simple directive for two-way binding with signals\n */\nexport class SignalValueDirective {\n signalTreeSignalValue;\n signalTreeSignalValueChange = new EventEmitter();\n elementRef = inject(ElementRef);\n renderer = inject(Renderer2);\n onChange = () => {\n // Empty implementation for ControlValueAccessor\n };\n onTouched = () => {\n // Empty implementation for ControlValueAccessor\n };\n ngOnInit() {\n effect(() => {\n const value = this.signalTreeSignalValue();\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', value);\n });\n }\n handleChange(event) {\n const target = event.target;\n const value = target?.value;\n if (value !== undefined) {\n this.signalTreeSignalValue.set(value);\n this.signalTreeSignalValueChange.emit(value);\n this.onChange(value);\n }\n }\n handleBlur() {\n this.onTouched();\n }\n writeValue(value) {\n if (value !== undefined) {\n this.signalTreeSignalValue.set(value);\n }\n }\n registerOnChange(fn) {\n this.onChange = fn;\n }\n registerOnTouched(fn) {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled) {\n this.renderer.setProperty(this.elementRef.nativeElement, 'disabled', isDisabled);\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: SignalValueDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.1.4\", type: SignalValueDirective, isStandalone: true, selector: \"[signalTreeSignalValue]\", inputs: { signalTreeSignalValue: \"signalTreeSignalValue\" }, outputs: { signalTreeSignalValueChange: \"signalTreeSignalValueChange\" }, host: { listeners: { \"input\": \"handleChange($event)\", \"change\": \"handleChange($event)\", \"blur\": \"handleBlur()\" } }, providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SignalValueDirective),\n multi: true,\n },\n ], ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: SignalValueDirective, decorators: [{\n type: Directive,\n args: [{\n selector: '[signalTreeSignalValue]',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SignalValueDirective),\n multi: true,\n },\n ],\n standalone: true,\n }]\n }], propDecorators: { signalTreeSignalValue: [{\n type: Input\n }], signalTreeSignalValueChange: [{\n type: Output\n }], handleChange: [{\n type: HostListener,\n args: ['input', ['$event']]\n }, {\n type: HostListener,\n args: ['change', ['$event']]\n }], handleBlur: [{\n type: HostListener,\n args: ['blur']\n }] } });\n// ============================================\n// VALIDATORS\n// ============================================\nexport const validators = {\n required: (message = 'Required') => (value) => !value ? message : null,\n email: (message = 'Invalid email') => (value) => {\n const strValue = value;\n return strValue && !strValue.includes('@') ? message : null;\n },\n minLength: (min) => (value) => {\n const strValue = value;\n return strValue && strValue.length < min ? `Min ${min} characters` : null;\n },\n pattern: (regex, message = 'Invalid format') => (value) => {\n const strValue = value;\n return strValue && !regex.test(strValue) ? message : null;\n },\n};\nexport const asyncValidators = {\n unique: (checkFn, message = 'Already exists') => async (value) => {\n if (!value)\n return null;\n const exists = await checkFn(value);\n return exists ? message : null;\n },\n};\n// ============================================\n// RXJS BRIDGE\n// ============================================\nexport function toObservable(signal) {\n return new Observable((subscriber) => {\n try {\n const effectRef = effect(() => {\n subscriber.next(signal());\n }, ...(ngDevMode ? [{ debugName: \"effectRef\" }] : []));\n return () => effectRef.destroy();\n }\n catch {\n // Fallback for test environment without injection context\n subscriber.next(signal());\n return () => {\n // No cleanup needed for single emission\n };\n }\n });\n}\nexport function createAuditMiddleware(auditLog, getMetadata) {\n return {\n id: 'audit',\n after: (action, payload, oldState, newState) => {\n const changes = getChanges(oldState, newState);\n if (Object.keys(changes).length > 0) {\n auditLog.push({\n timestamp: Date.now(),\n changes,\n metadata: getMetadata?.(),\n });\n }\n },\n };\n}\nfunction getChanges(oldState, newState) {\n const changes = {};\n for (const key in newState) {\n if (oldState[key] !== newState[key]) {\n changes[key] = newState[key];\n }\n }\n return changes;\n}\n// ============================================\n// EXPORTS\n// ============================================\nexport const SIGNAL_FORM_DIRECTIVES = [SignalValueDirective];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctZm9ybXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy1mb3Jtcy9zcmMvbGliL25nLWZvcm1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsT0FBTyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBQ04sUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLFVBQVUsRUFDVixVQUFVLEVBQ1YsU0FBUyxFQUNULFlBQVksR0FFYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQVNsQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7O0FBMkQ5QywrQ0FBK0M7QUFDL0Msb0JBQW9CO0FBQ3BCLCtDQUErQztBQUUvQzs7R0FFRztBQUNILFNBQVMsU0FBUyxDQUFDLElBQVk7SUFDN0IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFFRCwrQ0FBK0M7QUFDL0MsMkJBQTJCO0FBQzNCLCtDQUErQztBQUUvQyxNQUFNLFVBQVUsY0FBYyxDQUM1QixhQUFnQixFQUNoQixTQUdpQixFQUFFO0lBRW5CLE1BQU0sRUFBRSxVQUFVLEdBQUcsRUFBRSxFQUFFLGVBQWUsR0FBRyxFQUFFLEVBQUUsR0FBRyxVQUFVLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFeEUsb0NBQW9DO0lBQ3BDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFekQsOERBQThEO0lBQzlELE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxLQUF5QixDQUFDO0lBRTVELCtCQUErQjtJQUMvQixNQUFN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RUFBRSxDQUFDO1lBQ3BDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE9BQXFCLENBQUM7QUFDL0IsQ0FBQztBQUVELCtDQUErQztBQUMvQyxVQUFVO0FBQ1YsK0NBQStDO0FBRS9DLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVvdmVydmlldyBBbmd1bGFyIEZvcm1zIEludGVncmF0aW9uIGZvciBTaWduYWxUcmVlXG4gKlxuICogUHJvdmlkZXMgY29tcHJlaGVuc2l2ZSBBbmd1bGFyIGZvcm0gaW50ZWdyYXRpb24gaW5jbHVkaW5nIEZvcm1UcmVlLFxuICogZGlyZWN0aXZlcywgdmFsaWRhdG9ycywgZW5oYW5jZWQgYXJyYXkgb3BlcmF0aW9ucywgYW5kIFJ4SlMgYnJpZGdlLlxuICovXG5cbmltcG9ydCB7XG4gIFNpZ25hbCxcbiAgV3JpdGFibGVTaWduYWwsXG4gIGlzU2lnbmFsLFxuICBzaWduYWwsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgRGlyZWN0aXZlLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIFJlbmRlcmVyMixcbiAgSG9zdExpc3RlbmVyLFxuICBPbkluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG4vLyBSZS1leHBvcnQgY29yZSB0eXBlcyBuZWVkZWQgZm9yIGZvcm1zXG5pbXBvcnQgdHlwZSB7XG4gIFNpZ25hbFRyZWUsXG4gIFRyZWVDb25maWcsXG4gIERlZXBTaWduYWxpZnksXG4gIE1pZGRsZXdhcmUsXG59IGZyb20gJ0BzaWduYWx0cmVlL2NvcmUnO1xuaW1wb3J0IHsgc2lnbmFsVHJlZSB9IGZyb20gJ0BzaWduYWx0cmVlL2NvcmUnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRk9STSBUUkVFIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdHlwZSBBc3luY1ZhbGlkYXRvckZuPFQ+ID0gKFxuICB2YWx1ZTogVFxuKSA9PiBPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+IHwgUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcblxuZXhwb3J0IHR5cGUgRW5oYW5jZWRBcnJheVNpZ25hbDxUPiA9IFdyaXRhYmxlU2lnbmFsPFRbXT4gJiB7XG4gIHB1c2g6IChpdGVtOiBUKSA9PiB2b2lkO1xuICByZW1vdmVBdDogKGluZGV4OiBudW1iZXIpID0+IHZvaWQ7XG4gIHNldEF0OiAoaW5kZXg6IG51bWJlciwgdmFsdWU6IFQpID0+IHZvaWQ7XG4gIGluc2VydEF0OiAoaW5kZXg6IG51bWJlciwgaXRlbTogVCkgPT4gdm9pZDtcbiAgbW92ZTogKGZyb206IG51bWJlciwgdG86IG51bWJlcikgPT4gdm9pZDtcbiAgY2xlYXI6ICgpID0+IHZvaWQ7XG59O1xuXG4vKipcbiAqIEZvcm0gdHJlZSB0eXBlIHRoYXQgZmxhdHRlbnMgdGhlIHN0YXRlIGFjY2VzcyB3aGlsZSBtYWludGFpbmluZyBmb3JtLXNwZWNpZmljIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IHR5cGUgRm9ybVRyZWU8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IHtcbiAgLy8gRmxhdHRlbmVkIHN0YXRlIGFjY2VzcyAtIGRpcmVjdCBhY2Nlc3MgdG8gZm9ybSB2YWx1ZXMgYXMgc2lnbmFsc1xuICBzdGF0ZTogRGVlcFNpZ25hbGlmeTxUPjtcbiAgJDogRGVlcFNpZ25hbGlmeTxUPjsgLy8gQWxpYXMgZm9yIHN0YXRlXG5cbiAgLy8gRm9ybS1zcGVjaWZpYyBzaWduYWxzXG4gIGVycm9yczogV3JpdGFibGVTaWduYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gIGFzeW5jRXJyb3JzOiBXcml0YWJsZVNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgdG91Y2hlZDogV3JpdGFibGVTaWduYWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+O1xuICBhc3luY1ZhbGlkYXRpbmc6IFdyaXRhYmxlU2lnbmFsPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+PjtcbiAgZGlydHk6IFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+O1xuICB2YWxpZDogV3JpdGFibGVTaWduYWw8Ym9vbGVhbj47XG4gIHN1Ym1pdHRpbmc6IFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+O1xuXG4gIC8vIEZvcm0gbWV0aG9kc1xuICB1bndyYXAoKTogVDtcbiAgc2V0VmFsdWUoZmllbGQ6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuICBzZXRWYWx1ZXModmFsdWVzOiBQYXJ0aWFsPFQ+KTogdm9pZDtcbiAgcmVzZXQoKTogdm9pZDtcbiAgc3VibWl0PFRSZXN1bHQ+KHN1Ym1pdEZuOiAodmFsdWVzOiBUKSA9PiBQcm9taXNlPFRSZXN1bHQ+KTogUHJvbWlzZTxUUmVzdWx0PjtcbiAgdmFsaWRhdGUoZmllbGQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8vIEZpZWxkLWxldmVsIGhlbHBlcnNcbiAgZ2V0RmllbGRFcnJvcihmaWVsZDogc3RyaW5nKTogU2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIGdldEZpZWxkQXN5bmNFcnJvcihmaWVsZDogc3RyaW5nKTogU2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIGdldEZpZWxkVG91Y2hlZChmaWVsZDogc3RyaW5nKTogU2lnbmFsPGJvb2xlYW4gfCB1bmRlZmluZWQ+O1xuICBpc0ZpZWxkVmFsaWQoZmllbGQ6IHN0cmluZyk6IFNpZ25hbDxib29sZWFuPjtcbiAgaXNGaWVsZEFzeW5jVmFsaWRhdGluZyhmaWVsZDogc3RyaW5nKTogU2lnbmFsPGJvb2xlYW4gfCB1bmRlZmluZWQ+O1xuXG4gIC8vIERpcmVjdCBhY2Nlc3MgdG8gZmllbGQgZXJyb3JzXG4gIGZpZWxkRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBTaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPj47XG4gIGZpZWxkQXN5bmNFcnJvcnM6IFJlY29yZDxzdHJpbmcsIFNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+PjtcblxuICAvLyBLZWVwIHZhbHVlcyB0cmVlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gIHZhbHVlczogU2lnbmFsVHJlZTxUPjtcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVVElMSVRZIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBTaW1wbGUgcGF0aCBwYXJzaW5nIGZvciBuZXN0ZWQgZmllbGQgYWNjZXNzXG4gKi9cbmZ1bmN0aW9uIHBhcnNlUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBwYXRoLnNwbGl0KCcuJyk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBGT1JNIFRSRUUgSU1QTEVNRU5UQVRJT05cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGb3JtVHJlZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICBpbml0aWFsVmFsdWVzOiBULFxuICBjb25maWc6IHtcbiAgICB2YWxpZGF0b3JzPzogUmVjb3JkPHN0cmluZywgKHZhbHVlOiB1bmtub3duKSA9PiBzdHJpbmcgfCBudWxsPjtcbiAgICBhc3luY1ZhbGlkYXRvcnM/OiBSZWNvcmQ8c3RyaW5nLCBBc3luY1ZhbGlkYXRvckZuPHVua25vd24+PjtcbiAgfSAmIFRyZWVDb25maWcgPSB7fVxuKTogRm9ybVRyZWU8VD4ge1xuICBjb25zdCB7IHZhbGlkYXRvcnMgPSB7fSwgYXN5bmNWYWxpZGF0b3JzID0ge30sIC4uLnRyZWVDb25maWcgfSA9IGNvbmZpZztcblxuICAvLyBDcmVhdGUgdGhlIHVuZGVybHlpbmcgc2lnbmFsIHRyZWVcbiAgY29uc3QgdmFsdWVzVHJlZSA9IHNpZ25hbFRyZWUoaW5pdGlhbFZhbHVlcywgdHJlZUNvbmZpZyk7XG5cbiAgLy8gRW5zdXJlIHRoZSBzdGF0ZSBoYXMgdGhlIGNvcnJlY3QgdHlwZSAtIHRoaXMgaXMgdGhlIGtleSBmaXhcbiAgY29uc3QgZmxhdHRlbmVkU3RhdGUgPSB2YWx1ZXNUcmVlLnN0YXRlIGFzIERlZXBTaWduYWxpZnk8VD47XG5cbiAgLy8gQ3JlYXRlIGZvcm0tc3BlY2lmaWMgc2lnbmFsc1xuICBjb25zdCBmb3JtU2lnbmFscyA9IHtcbiAgICBlcnJvcnM6IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pih7fSksXG4gICAgYXN5bmNFcnJvcnM6IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pih7fSksXG4gICAgdG91Y2hlZDogc2lnbmFsPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+Pih7fSksXG4gICAgYXN5bmNWYWxpZGF0aW5nOiBzaWduYWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+KHt9KSxcbiAgICBkaXJ0eTogc2lnbmFsKGZhbHNlKSxcbiAgICB2YWxpZDogc2lnbmFsKHRydWUpLFxuICAgIHN1Ym1pdHRpbmc6IHNpZ25hbChmYWxzZSksXG4gIH07XG5cbiAgY29uc3QgbWFya0RpcnR5ID0gKCkgPT4gZm9ybVNpZ25hbHMuZGlydHkuc2V0KHRydWUpO1xuXG4gIC8vIEVuaGFuY2UgYXJyYXlzIHdpdGggbmF0dXJhbCBvcGVyYXRpb25zXG4gIGNvbnN0IGVuaGFuY2VBcnJheSA9IDxVPihcbiAgICBhcnJheVNpZ25hbDogV3JpdGFibGVTaWduYWw8VVtdPlxuICApOiBFbmhhbmNlZEFycmF5U2lnbmFsPFU+ID0+IHtcbiAgICBjb25zdCBlbmhhbmNlZCA9IGFycmF5U2lnbmFsIGFzIEVuaGFuY2VkQXJyYXlTaWduYWw8VT47XG5cbiAgICBlbmhhbmNlZC5wdXNoID0gKGl0ZW06IFUpID0+IHtcbiAgICAgIGFycmF5U2lnbmFsLnVwZGF0ZSgoYXJyKSA9PiBbLi4uYXJyLCBpdGVtXSk7XG4gICAgICBtYXJrRGlydHkoKTtcbiAgICB9O1xuXG4gICAgZW5oYW5jZWQucmVtb3ZlQXQgPSAoaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgYXJyYXlTaWduYWwudXBkYXRlKChhcnIpID0+IGFyci5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KSk7XG4gICAgICBtYXJrRGlydHkoKTtcbiAgICB9O1xuXG4gICAgZW5oYW5jZWQuc2V0QXQgPSAoaW5kZXg6IG51bWJlciwgdmFsdWU6IFUpID0+IHtcbiAgICAgIGFycmF5U2lnbmFsLnVwZGF0ZSgoYXJyKSA9PlxuICAgICAgICBhcnIubWFwKChpdGVtLCBpKSA9PiAoaSA9PT0gaW5kZXggPyB2YWx1ZSA6IGl0ZW0pKVxuICAgICAgKTtcbiAgICAgIG1hcmtEaXJ0eSgpO1xuICAgIH07XG5cbiAgICBlbmhhbmNlZC5pbnNlcnRBdCA9IChpbmRleDogbnVtYmVyLCBpdGVtOiBVKSA9PiB7XG4gICAgICBhcnJheVNpZ25hbC51cGRhdGUoKGFycikgPT4gW1xuICAgICAgICAuLi5hcnIuc2xpY2UoMCwgaW5kZXgpLFxuICAgICAgICBpdGVtLFxuICAgICAgICAuLi5hcnIuc2xpY2UoaW5kZXgpLFxuICAgICAgXSk7XG4gICAgICBtYXJrRGlydHkoKTtcbiAgICB9O1xuXG4gICAgZW5oYW5jZWQubW92ZSA9IChmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpID0+IHtcbiAgICAgIGFycmF5U2lnbmFsLnVwZGF0ZSgoYXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0FyciA9IFsuLi5hcnJdO1xuICAgICAgICBjb25zdCBbaXRlbV0gPSBuZXdBcnIuc3BsaWNlKGZyb20sIDEpO1xuICAgICAgICBpZiAoaXRlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmV3QXJyLnNwbGljZSh0bywgMCwgaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld0FycjtcbiAgICAgIH0pO1xuICAgICAgbWFya0RpcnR5KCk7XG4gICAgfTtcblxuICAgIGVuaGFuY2VkLmNsZWFyID0gKCkgPT4ge1xuICAgICAgYXJyYXlTaWduYWwuc2V0KFtdKTtcbiAgICAgIG1hcmtEaXJ0eSgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gZW5oYW5jZWQ7XG4gIH07XG5cbiAgLy8gUmVjdXJzaXZlbHkgZW5oYW5jZSBhbGwgYXJyYXlzIGluIHRoZSBzdGF0ZVxuICBjb25zdCBlbmhhbmNlQXJyYXlzUmVjdXJzaXZlbHkgPSAob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgIGlmIChpc1NpZ25hbCh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3Qgc2lnbmFsVmFsdWUgPSAodmFsdWUgYXMgU2lnbmFsPHVua25vd24+KSgpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzaWduYWxWYWx1ZSkpIHtcbiAgICAgICAgICBvYmpba2V5XSA9IGVuaGFuY2VBcnJheSh2YWx1ZSBhcyBXcml0YWJsZVNpZ25hbDx1bmtub3duW10+KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBlbmhhbmNlQXJyYXlzUmVjdXJzaXZlbHkodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBFbmhhbmNlIGFycmF5cyBpbiB0aGUgc3RhdGVcbiAgZW5oYW5jZUFycmF5c1JlY3Vyc2l2ZWx5KGZsYXR0ZW5lZFN0YXRlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcblxuICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBuZXN0ZWQgcGF0aHNcbiAgY29uc3QgZ2V0TmVzdGVkVmFsdWUgPSAob2JqOiBEZWVwU2lnbmFsaWZ5PFQ+LCBwYXRoOiBzdHJpbmcpOiB1bmtub3duID0+IHtcbiAgICBjb25zdCBrZXlzID0gcGFyc2VQYXRoKHBhdGgpO1xuICAgIGxldCBjdXJyZW50OiB1bmtub3duID0gb2JqO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKGN1cnJlbnQgJiYgdHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGN1cnJlbnQgPSAoY3VycmVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcbiAgICAgICAgaWYgKGlzU2lnbmFsKGN1cnJlbnQpKSB7XG4gICAgICAgICAgY3VycmVudCA9IChjdXJyZW50IGFzIFNpZ25hbDx1bmtub3duPikoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfTtcblxuICBjb25zdCBzZXROZXN0ZWRWYWx1ZSA9IChwYXRoOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgY29uc3Qga2V5cyA9IHBhcnNlUGF0aChwYXRoKTtcbiAgICBsZXQgY3VycmVudDogdW5rbm93biA9IGZsYXR0ZW5lZFN0YXRlO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgY3VycmVudCA9IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXlzW2ldXTtcbiAgICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxhc3RLZXkgPSBrZXlzW2tleXMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgdGFyZ2V0ID0gKGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2xhc3RLZXldO1xuXG4gICAgaWYgKGlzU2lnbmFsKHRhcmdldCkgJiYgJ3NldCcgaW4gdGFyZ2V0KSB7XG4gICAgICAodGFyZ2V0IGFzIFdyaXRhYmxlU2lnbmFsPHVua25vd24+KS5zZXQodmFsdWUpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB2YWxpZGF0ZSA9IGFzeW5jIChmaWVsZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGVycm9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGNvbnN0IGFzeW5jRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICBjb25zdCBmaWVsZHNUb1ZhbGlkYXRlID0gZmllbGQgPyBbZmllbGRdIDogT2JqZWN0LmtleXModmFsaWRhdG9ycyk7XG5cbiAgICAvLyBTeW5jIHZhbGlkYXRpb25cbiAgICBmb3IgKGNvbnN0IGZpZWxkUGF0aCBvZiBmaWVsZHNUb1ZhbGlkYXRlKSB7XG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSB2YWxpZGF0b3JzW2ZpZWxkUGF0aF07XG4gICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0TmVzdGVkVmFsdWUoZmxhdHRlbmVkU3RhdGUsIGZpZWxkUGF0aCk7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdG9yKHZhbHVlKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgZXJyb3JzW2ZpZWxkUGF0aF0gPSBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvcm1TaWduYWxzLmVycm9ycy5zZXQoZXJyb3JzKTtcblxuICAgIC8vIEFzeW5jIHZhbGlkYXRpb25cbiAgICBjb25zdCBhc3luY0ZpZWxkc1RvVmFsaWRhdGUgPSBmaWVsZFxuICAgICAgPyBbZmllbGRdXG4gICAgICA6IE9iamVjdC5rZXlzKGFzeW5jVmFsaWRhdG9ycyk7XG5cbiAgICBmb3IgKGNvbnN0IGZpZWxkUGF0aCBvZiBhc3luY0ZpZWxkc1RvVmFsaWRhdGUpIHtcbiAgICAgIGNvbnN0IGFzeW5jVmFsaWRhdG9yID0gYXN5bmNWYWxpZGF0b3JzW2ZpZWxkUGF0aF07XG4gICAgICBpZiAoYXN5bmNWYWxpZGF0b3IgJiYgKCFmaWVsZCB8fCBmaWVsZCA9PT0gZmllbGRQYXRoKSkge1xuICAgICAgICBmb3JtU2lnbmFscy5hc3luY1ZhbGlkYXRpbmcudXBkYXRlKCh2KSA9PiAoe1xuICAgICAgICAgIC4uLnYsXG4gICAgICAgICAgW2ZpZWxkUGF0aF06IHRydWUsXG4gICAgICAgIH0pKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0TmVzdGVkVmFsdWUoZmxhdHRlbmVkU3RhdGUsIGZpZWxkUGF0aCk7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXN5bmNWYWxpZGF0b3IodmFsdWUpO1xuXG4gICAgICAgICAgbGV0IGVycm9yOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgT2JzZXJ2YWJsZVxuICAgICAgICAgICAgZXJyb3IgPSBhd2FpdCBuZXcgUHJvbWlzZTxzdHJpbmcgfCBudWxsPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICByZXN1bHQuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiAodmFsKSA9PiByZXNvbHZlKHZhbCksXG4gICAgICAgICAgICAgICAgZXJyb3I6ICgpID0+IHJlc29sdmUoJ1ZhbGlkYXRpb24gZXJyb3InKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSGFuZGxlIFByb21pc2VcbiAgICAgICAgICAgIGVycm9yID0gYXdhaXQgcmVzdWx0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgYXN5bmNFcnJvcnNbZmllbGRQYXRoXSA9IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgYXN5bmNFcnJvcnNbZmllbGRQYXRoXSA9ICdWYWxpZGF0aW9uIGVycm9yJztcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1TaWduYWxzLmFzeW5jVmFsaWRhdGluZy51cGRhdGUoKHYpID0+ICh7XG4gICAgICAgICAgLi4udixcbiAgICAgICAgICBbZmllbGRQYXRoXTogZmFsc2UsXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3JtU2lnbmFscy5hc3luY0Vycm9ycy5zZXQoYXN5bmNFcnJvcnMpO1xuXG4gICAgLy8gVXBkYXRlIHZhbGlkaXR5XG4gICAgY29uc3QgaGFzRXJyb3JzID0gT2JqZWN0LmtleXMoZXJyb3JzKS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IGhhc0FzeW5jRXJyb3JzID0gT2JqZWN0LmtleXMoYXN5bmNFcnJvcnMpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgaXNWYWxpZGF0aW5nID0gT2JqZWN0LnZhbHVlcyhmb3JtU2lnbmFscy5hc3luY1ZhbGlkYXRpbmcoKSkuc29tZShcbiAgICAgICh2KSA9PiB2XG4gICAgKTtcblxuICAgIGZvcm1TaWduYWxzLnZhbGlkLnNldCghaGFzRXJyb3JzICYmICFoYXNBc3luY0Vycm9ycyAmJiAhaXNWYWxpZGF0aW5nKTtcbiAgfTtcblxuICAvLyBDcmVhdGUgY29tcHV0ZWQgc2lnbmFscyBmb3IgZmllbGQgZXJyb3JzXG4gIGNvbnN0IGZpZWxkRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBTaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPj4gPSB7fTtcbiAgY29uc3QgZmllbGRBc3luY0Vycm9yczogUmVjb3JkPHN0cmluZywgU2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4+ID0ge307XG5cbiAgLy8gQ3JlYXRlIGVycm9yIHNpZ25hbHMgZm9yIGFsbCBkZWZpbmVkIHZhbGlkYXRvcnNcbiAgWy4uLk9iamVjdC5rZXlzKHZhbGlkYXRvcnMpLCAuLi5PYmplY3Qua2V5cyhhc3luY1ZhbGlkYXRvcnMpXS5mb3JFYWNoKFxuICAgIChmaWVsZFBhdGgpID0+IHtcbiAgICAgIGZpZWxkRXJyb3JzW2ZpZWxkUGF0aF0gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVycm9ycyA9IGZvcm1TaWduYWxzLmVycm9ycygpO1xuICAgICAgICByZXR1cm4gZXJyb3JzW2ZpZWxkUGF0aF07XG4gICAgICB9KTtcbiAgICAgIGZpZWxkQXN5bmNFcnJvcnNbZmllbGRQYXRoXSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gZm9ybVNpZ25hbHMuYXN5bmNFcnJvcnMoKTtcbiAgICAgICAgcmV0dXJuIGVycm9yc1tmaWVsZFBhdGhdO1xuICAgICAgfSk7XG4gICAgfVxuICApO1xuXG4gIC8vIENyZWF0ZSB0aGUgZm9ybSB0cmVlIG9iamVjdFxuICBjb25zdCBmb3JtVHJlZTogRm9ybVRyZWU8VD4gPSB7XG4gICAgLy8gRmxhdHRlbmVkIHN0YXRlIGFjY2Vzc1xuICAgIHN0YXRlOiBmbGF0dGVuZWRTdGF0ZSxcbiAgICAkOiBmbGF0dGVuZWRTdGF0ZSxcblxuICAgIC8vIEZvcm0gc2lnbmFsc1xuICAgIC4uLmZvcm1TaWduYWxzLFxuXG4gICAgLy8gQ29yZSBtZXRob2RzXG4gICAgdW53cmFwOiAoKSA9PiB2YWx1ZXNUcmVlLnVud3JhcCgpLFxuXG4gICAgc2V0VmFsdWU6IChmaWVsZDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgc2V0TmVzdGVkVmFsdWUoZmllbGQsIHZhbHVlKTtcbiAgICAgIGZvcm1TaWduYWxzLnRvdWNoZWQudXBkYXRlKCh0KSA9PiAoeyAuLi50LCBbZmllbGRdOiB0cnVlIH0pKTtcbiAgICAgIG1hcmtEaXJ0eSgpO1xuICAgICAgdm9pZCB2YWxpZGF0ZShmaWVsZCk7XG4gICAgfSxcblxuICAgIHNldFZhbHVlczogKHZhbHVlczogUGFydGlhbDxUPikgPT4ge1xuICAgICAgdmFsdWVzVHJlZS51cGRhdGUoKHYpID0+ICh7IC4uLnYsIC4uLnZhbHVlcyB9KSk7XG4gICAgICBtYXJrRGlydHkoKTtcbiAgICAgIHZvaWQgdmFsaWRhdGUoKTtcbiAgICB9LFxuXG4gICAgcmVzZXQ6ICgpID0+IHtcbiAgICAgIC8vIFJlc2V0IGVhY2ggZmllbGQgaW5kaXZpZHVhbGx5IHRvIG1haW50YWluIHNpZ25hbCByZWFjdGl2aXR5XG4gICAgICBjb25zdCByZXNldFNpZ25hbHMgPSA8VFJlc2V0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgICAgICBjdXJyZW50OiBEZWVwU2lnbmFsaWZ5PFRSZXNldD4sXG4gICAgICAgIGluaXRpYWw6IFRSZXNldFxuICAgICAgKTogdm9pZCA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgaW5pdGlhbFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbml0aWFsKSkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuXG4gICAgICAgICAgaWYgKGlzU2lnbmFsKGN1cnJlbnRWYWx1ZSkgJiYgJ3NldCcgaW4gY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICAoY3VycmVudFZhbHVlIGFzIFdyaXRhYmxlU2lnbmFsPHVua25vd24+KS5zZXQoaW5pdGlhbFZhbHVlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGluaXRpYWxWYWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIGluaXRpYWxWYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoaW5pdGlhbFZhbHVlKSAmJlxuICAgICAgICAgICAgdHlwZW9mIGN1cnJlbnRWYWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgIWlzU2lnbmFsKGN1cnJlbnRWYWx1ZSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJlc2V0U2lnbmFscyhcbiAgICAgICAgICAgICAgY3VycmVudFZhbHVlIGFzIERlZXBTaWduYWxpZnk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXNldFNpZ25hbHMoZmxhdHRlbmVkU3RhdGUsIGluaXRpYWxWYWx1ZXMpO1xuXG4gICAgICBmb3JtU2lnbmFscy5lcnJvcnMuc2V0KHt9KTtcbiAgICAgIGZvcm1TaWduYWxzLmFzeW5jRXJyb3JzLnNldCh7fSk7XG4gICAgICBmb3JtU2lnbmFscy50b3VjaGVkLnNldCh7fSk7XG4gICAgICBmb3JtU2lnbmFscy5hc3luY1ZhbGlkYXRpbmcuc2V0KHt9KTtcbiAgICAgIGZvcm1TaWduYWxzLmRpcnR5LnNldChmYWxzZSk7XG4gICAgICBmb3JtU2lnbmFscy52YWxpZC5zZXQodHJ1ZSk7XG4gICAgICBmb3JtU2lnbmFscy5zdWJtaXR0aW5nLnNldChmYWxzZSk7XG4gICAgfSxcblxuICAgIHN1Ym1pdDogYXN5bmMgPFRSZXN1bHQ+KFxuICAgICAgc3VibWl0Rm46ICh2YWx1ZXM6IFQpID0+IFByb21pc2U8VFJlc3VsdD5cbiAgICApOiBQcm9taXNlPFRSZXN1bHQ+ID0+IHtcbiAgICAgIGZvcm1TaWduYWxzLnN1Ym1pdHRpbmcuc2V0KHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB2YWxpZGF0ZSgpO1xuXG4gICAgICAgIGlmICghZm9ybVNpZ25hbHMudmFsaWQoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRm9ybSBpcyBpbnZhbGlkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWVzID0gdmFsdWVzVHJlZS51bndyYXAoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3VibWl0Rm4oY3VycmVudFZhbHVlcyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBmb3JtU2lnbmFscy5zdWJtaXR0aW5nLnNldChmYWxzZSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHZhbGlkYXRlLFxuXG4gICAgLy8gRmllbGQgaGVscGVyc1xuICAgIGdldEZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PlxuICAgICAgZmllbGRFcnJvcnNbZmllbGRdIHx8IGNvbXB1dGVkKCgpID0+IHVuZGVmaW5lZCksXG5cbiAgICBnZXRGaWVsZEFzeW5jRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PlxuICAgICAgZmllbGRBc3luY0Vycm9yc1tmaWVsZF0gfHwgY29tcHV0ZWQoKCkgPT4gdW5kZWZpbmVkKSxcblxuICAgIGdldEZpZWxkVG91Y2hlZDogKGZpZWxkOiBzdHJpbmcpID0+XG4gICAgICBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRvdWNoZWQgPSBmb3JtU2lnbmFscy50b3VjaGVkKCk7XG4gICAgICAgIHJldHVybiB0b3VjaGVkW2ZpZWxkXTtcbiAgICAgIH0pLFxuXG4gICAgaXNGaWVsZFZhbGlkOiAoZmllbGQ6IHN0cmluZykgPT5cbiAgICAgIGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gZm9ybVNpZ25hbHMuZXJyb3JzKCk7XG4gICAgICAgIGNvbnN0IGFzeW5jRXJyb3JzID0gZm9ybVNpZ25hbHMuYXN5bmNFcnJvcnMoKTtcbiAgICAgICAgY29uc3QgYXN5bmNWYWxpZGF0aW5nID0gZm9ybVNpZ25hbHMuYXN5bmNWYWxpZGF0aW5nKCk7XG4gICAgICAgIHJldHVybiAhZXJyb3JzW2ZpZWxkXSAmJiAhYXN5bmNFcnJvcnNbZmllbGRdICYmICFhc3luY1ZhbGlkYXRpbmdbZmllbGRdO1xuICAgICAgfSksXG5cbiAgICBpc0ZpZWxkQXN5bmNWYWxpZGF0aW5nOiAoZmllbGQ6IHN0cmluZykgPT5cbiAgICAgIGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgYXN5bmNWYWxpZGF0aW5nID0gZm9ybVNpZ25hbHMuYXN5bmNWYWxpZGF0aW5nKCk7XG4gICAgICAgIHJldHVybiBhc3luY1ZhbGlkYXRpbmdbZmllbGRdO1xuICAgICAgfSksXG5cbiAgICAvLyBEaXJlY3QgYWNjZXNzXG4gICAgZmllbGRFcnJvcnMsXG4gICAgZmllbGRBc3luY0Vycm9ycyxcblxuICAgIC8vIEtlZXAgdmFsdWVzIHRyZWUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICB2YWx1ZXM6IHZhbHVlc1RyZWUsXG4gIH07XG5cbiAgcmV0dXJuIGZvcm1UcmVlO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQU5HVUxBUiBESVJFQ1RJVkVcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogU2ltcGxlIGRpcmVjdGl2ZSBmb3IgdHdvLXdheSBiaW5kaW5nIHdpdGggc2lnbmFsc1xuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbc2lnbmFsVHJlZVNpZ25hbFZhbHVlXScsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2lnbmFsVmFsdWVEaXJlY3RpdmUpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgU2lnbmFsVmFsdWVEaXJlY3RpdmUgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0IHtcbiAgQElucHV0KCkgc2lnbmFsVHJlZVNpZ25hbFZhbHVlITogV3JpdGFibGVTaWduYWw8dW5rbm93bj47XG4gIEBPdXRwdXQoKSBzaWduYWxUcmVlU2lnbmFsVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHVua25vd24+KCk7XG5cbiAgcHJpdmF0ZSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG5cbiAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkID0gKCkgPT4ge1xuICAgIC8vIEVtcHR5IGltcGxlbWVudGF0aW9uIGZvciBDb250cm9sVmFsdWVBY2Nlc3NvclxuICB9O1xuICBwcml2YXRlIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHtcbiAgICAvLyBFbXB0eSBpbXBsZW1lbnRhdGlvbiBmb3IgQ29udHJvbFZhbHVlQWNjZXNzb3JcbiAgfTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnNpZ25hbFRyZWVTaWduYWxWYWx1ZSgpO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgdmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignaW5wdXQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdjaGFuZ2UnLCBbJyRldmVudCddKVxuICBoYW5kbGVDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgdmFsdWUgPSB0YXJnZXQ/LnZhbHVlO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNpZ25hbFRyZWVTaWduYWxWYWx1ZS5zZXQodmFsdWUpO1xuICAgICAgdGhpcy5zaWduYWxUcmVlU2lnbmFsVmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgaGFuZGxlQmx1cigpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNpZ25hbFRyZWVTaWduYWxWYWx1ZS5zZXQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KFxuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAnZGlzYWJsZWQnLFxuICAgICAgaXNEaXNhYmxlZFxuICAgICk7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFZBTElEQVRPUlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0b3JzID0ge1xuICByZXF1aXJlZDpcbiAgICAobWVzc2FnZSA9ICdSZXF1aXJlZCcpID0+XG4gICAgKHZhbHVlOiB1bmtub3duKSA9PlxuICAgICAgIXZhbHVlID8gbWVzc2FnZSA6IG51bGwsXG5cbiAgZW1haWw6XG4gICAgKG1lc3NhZ2UgPSAnSW52YWxpZCBlbWFpbCcpID0+XG4gICAgKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBzdHJWYWx1ZSA9IHZhbHVlIGFzIHN0cmluZztcbiAgICAgIHJldHVybiBzdHJWYWx1ZSAmJiAhc3RyVmFsdWUuaW5jbHVkZXMoJ0AnKSA/IG1lc3NhZ2UgOiBudWxsO1xuICAgIH0sXG5cbiAgbWluTGVuZ3RoOiAobWluOiBudW1iZXIpID0+ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgIGNvbnN0IHN0clZhbHVlID0gdmFsdWUgYXMgc3RyaW5nO1xuICAgIHJldHVybiBzdHJWYWx1ZSAmJiBzdHJWYWx1ZS5sZW5ndGggPCBtaW4gPyBgTWluICR7bWlufSBjaGFyYWN0ZXJzYCA6IG51bGw7XG4gIH0sXG5cbiAgcGF0dGVybjpcbiAgICAocmVnZXg6IFJlZ0V4cCwgbWVzc2FnZSA9ICdJbnZhbGlkIGZvcm1hdCcpID0+XG4gICAgKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBzdHJWYWx1ZSA9IHZhbHVlIGFzIHN0cmluZztcbiAgICAgIHJldHVybiBzdHJWYWx1ZSAmJiAhcmVnZXgudGVzdChzdHJWYWx1ZSkgPyBtZXNzYWdlIDogbnVsbDtcbiAgICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGFzeW5jVmFsaWRhdG9ycyA9IHtcbiAgdW5pcXVlOlxuICAgIChcbiAgICAgIGNoZWNrRm46ICh2YWx1ZTogdW5rbm93bikgPT4gUHJvbWlzZTxib29sZWFuPixcbiAgICAgIG1lc3NhZ2UgPSAnQWxyZWFkeSBleGlzdHMnXG4gICAgKSA9PlxuICAgIGFzeW5jICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBleGlzdHMgPSBhd2FpdCBjaGVja0ZuKHZhbHVlKTtcbiAgICAgIHJldHVybiBleGlzdHMgPyBtZXNzYWdlIDogbnVsbDtcbiAgICB9LFxufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJYSlMgQlJJREdFXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgZnVuY3Rpb24gdG9PYnNlcnZhYmxlPFQ+KHNpZ25hbDogU2lnbmFsPFQ+KTogT2JzZXJ2YWJsZTxUPiB7XG4gIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoc3Vic2NyaWJlcikgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlZmZlY3RSZWYgPSBlZmZlY3QoKCkgPT4ge1xuICAgICAgICBzdWJzY3JpYmVyLm5leHQoc2lnbmFsKCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gKCkgPT4gZWZmZWN0UmVmLmRlc3Ryb3koKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZhbGxiYWNrIGZvciB0ZXN0IGVudmlyb25tZW50IHdpdGhvdXQgaW5qZWN0aW9uIGNvbnRleHRcbiAgICAgIHN1YnNjcmliZXIubmV4dChzaWduYWwoKSk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAvLyBObyBjbGVhbnVwIG5lZWRlZCBmb3Igc2luZ2xlIGVtaXNzaW9uXG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBVURJVCBNSURETEVXQVJFXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0RW50cnk8VCA9IHVua25vd24+IHtcbiAgdGltZXN0YW1wOiBudW1iZXI7XG4gIGNoYW5nZXM6IFBhcnRpYWw8VD47XG4gIG1ldGFkYXRhPzoge1xuICAgIHVzZXJJZD86IHN0cmluZztcbiAgICBzb3VyY2U/OiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBdWRpdE1pZGRsZXdhcmU8VD4oXG4gIGF1ZGl0TG9nOiBBdWRpdEVudHJ5PFQ+W10sXG4gIGdldE1ldGFkYXRhPzogKCkgPT4gQXVkaXRFbnRyeTxUPlsnbWV0YWRhdGEnXVxuKTogTWlkZGxld2FyZTxUPiB7XG4gIHJldHVybiB7XG4gICAgaWQ6ICdhdWRpdCcsXG4gICAgYWZ0ZXI6IChhY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93biwgb2xkU3RhdGU6IFQsIG5ld1N0YXRlOiBUKSA9PiB7XG4gICAgICBjb25zdCBjaGFuZ2VzID0gZ2V0Q2hhbmdlcyhvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgICAgaWYgKE9iamVjdC5rZXlzKGNoYW5nZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXVkaXRMb2cucHVzaCh7XG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgIGNoYW5nZXMsXG4gICAgICAgICAgbWV0YWRhdGE6IGdldE1ldGFkYXRhPy4oKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2hhbmdlczxUPihvbGRTdGF0ZTogVCwgbmV3U3RhdGU6IFQpOiBQYXJ0aWFsPFQ+IHtcbiAgY29uc3QgY2hhbmdlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBuZXdTdGF0ZSkge1xuICAgIGlmIChvbGRTdGF0ZVtrZXldICE9PSBuZXdTdGF0ZVtrZXldKSB7XG4gICAgICBjaGFuZ2VzW2tleV0gPSBuZXdTdGF0ZVtrZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjaGFuZ2VzIGFzIFBhcnRpYWw8VD47XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFWFBPUlRTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY29uc3QgU0lHTkFMX0ZPUk1fRElSRUNUSVZFUyA9IFtTaWduYWxWYWx1ZURpcmVjdGl2ZV07XG4iXX0=","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsdHJlZS1uZy1mb3Jtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLWZvcm1zL3NyYy9zaWduYWx0cmVlLW5nLWZvcm1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"signaltree-ng-forms.mjs","sources":["../tmp-esm2022/lib/ng-forms.js"],"sourcesContent":["import { isSignal, signal, computed, effect, inject, Directive, Input, Output, EventEmitter, forwardRef, ElementRef, Renderer2, HostListener, } from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { signalTree, parsePath } from '@signaltree/core';\nimport * as i0 from \"@angular/core\";\nexport function createFormTree(initialValues, config = {}) {\n const { validators = {}, asyncValidators = {}, ...treeConfig } = config;\n const valuesTree = signalTree(initialValues, treeConfig);\n const flattenedState = valuesTree.state;\n const formSignals = {\n errors: signal({}),\n asyncErrors: signal({}),\n touched: signal({}),\n asyncValidating: signal({}),\n dirty: signal(false),\n valid: signal(true),\n submitting: signal(false),\n };\n const markDirty = () => formSignals.dirty.set(true);\n const enhanceArray = (arraySignal) => {\n const enhanced = arraySignal;\n enhanced.push = (item) => {\n arraySignal.update((arr) => [...arr, item]);\n markDirty();\n };\n enhanced.removeAt = (index) => {\n arraySignal.update((arr) => arr.filter((_, i) => i !== index));\n markDirty();\n };\n enhanced.setAt = (index, value) => {\n arraySignal.update((arr) => arr.map((item, i) => (i === index ? value : item)));\n markDirty();\n };\n enhanced.insertAt = (index, item) => {\n arraySignal.update((arr) => [\n ...arr.slice(0, index),\n item,\n ...arr.slice(index),\n ]);\n markDirty();\n };\n enhanced.move = (from, to) => {\n arraySignal.update((arr) => {\n const newArr = [...arr];\n const [item] = newArr.splice(from, 1);\n if (item !== undefined) {\n newArr.splice(to, 0, item);\n }\n return newArr;\n });\n markDirty();\n };\n enhanced.clear = () => {\n arraySignal.set([]);\n markDirty();\n };\n return enhanced;\n };\n const enhanceArraysRecursively = (obj) => {\n for (const key in obj) {\n const value = obj[key];\n if (isSignal(value)) {\n const signalValue = value();\n if (Array.isArray(signalValue)) {\n obj[key] = enhanceArray(value);\n }\n }\n else if (typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)) {\n enhanceArraysRecursively(value);\n }\n }\n };\n enhanceArraysRecursively(flattenedState);\n const getNestedValue = (obj, path) => {\n const keys = parsePath(path);\n let current = obj;\n for (const key of keys) {\n if (current && typeof current === 'object') {\n current = current[key];\n if (isSignal(current)) {\n current = current();\n }\n }\n else {\n return undefined;\n }\n }\n return current;\n };\n const setNestedValue = (path, value) => {\n const keys = parsePath(path);\n let current = flattenedState;\n for (let i = 0; i < keys.length - 1; i++) {\n current = current[keys[i]];\n if (!current)\n return;\n }\n const lastKey = keys[keys.length - 1];\n const target = current[lastKey];\n if (isSignal(target) && 'set' in target) {\n target.set(value);\n }\n };\n const validate = async (field) => {\n const errors = {};\n const asyncErrors = {};\n const fieldsToValidate = field ? [field] : Object.keys(validators);\n for (const fieldPath of fieldsToValidate) {\n const validator = validators[fieldPath];\n if (validator) {\n const value = getNestedValue(flattenedState, fieldPath);\n const error = validator(value);\n if (error) {\n errors[fieldPath] = error;\n }\n }\n }\n formSignals.errors.set(errors);\n const asyncFieldsToValidate = field\n ? [field]\n : Object.keys(asyncValidators);\n for (const fieldPath of asyncFieldsToValidate) {\n const asyncValidator = asyncValidators[fieldPath];\n if (asyncValidator && (!field || field === fieldPath)) {\n formSignals.asyncValidating.update((v) => ({\n ...v,\n [fieldPath]: true,\n }));\n try {\n const value = getNestedValue(flattenedState, fieldPath);\n const result = asyncValidator(value);\n let error;\n if (result instanceof Observable) {\n error = await new Promise((resolve) => {\n result.subscribe({\n next: (val) => resolve(val),\n error: () => resolve('Validation error'),\n });\n });\n }\n else {\n error = await result;\n }\n if (error) {\n asyncErrors[fieldPath] = error;\n }\n }\n catch {\n asyncErrors[fieldPath] = 'Validation error';\n }\n formSignals.asyncValidating.update((v) => ({\n ...v,\n [fieldPath]: false,\n }));\n }\n }\n formSignals.asyncErrors.set(asyncErrors);\n const hasErrors = Object.keys(errors).length > 0;\n const hasAsyncErrors = Object.keys(asyncErrors).length > 0;\n const isValidating = Object.values(formSignals.asyncValidating()).some((v) => v);\n formSignals.valid.set(!hasErrors && !hasAsyncErrors && !isValidating);\n };\n const fieldErrors = {};\n const fieldAsyncErrors = {};\n [...Object.keys(validators), ...Object.keys(asyncValidators)].forEach((fieldPath) => {\n fieldErrors[fieldPath] = computed(() => {\n const errors = formSignals.errors();\n return errors[fieldPath];\n });\n fieldAsyncErrors[fieldPath] = computed(() => {\n const errors = formSignals.asyncErrors();\n return errors[fieldPath];\n });\n });\n const formTree = {\n state: flattenedState,\n $: flattenedState,\n ...formSignals,\n unwrap: () => valuesTree.unwrap(),\n setValue: (field, value) => {\n setNestedValue(field, value);\n formSignals.touched.update((t) => ({ ...t, [field]: true }));\n markDirty();\n void validate(field);\n },\n setValues: (values) => {\n valuesTree.update((v) => ({ ...v, ...values }));\n markDirty();\n void validate();\n },\n reset: () => {\n const resetSignals = (current, initial) => {\n for (const [key, initialValue] of Object.entries(initial)) {\n const currentValue = current[key];\n if (isSignal(currentValue) && 'set' in currentValue) {\n currentValue.set(initialValue);\n }\n else if (typeof initialValue === 'object' &&\n initialValue !== null &&\n !Array.isArray(initialValue) &&\n typeof currentValue === 'object' &&\n currentValue !== null &&\n !isSignal(currentValue)) {\n resetSignals(currentValue, initialValue);\n }\n }\n };\n resetSignals(flattenedState, initialValues);\n formSignals.errors.set({});\n formSignals.asyncErrors.set({});\n formSignals.touched.set({});\n formSignals.asyncValidating.set({});\n formSignals.dirty.set(false);\n formSignals.valid.set(true);\n formSignals.submitting.set(false);\n },\n submit: async (submitFn) => {\n formSignals.submitting.set(true);\n try {\n await validate();\n if (!formSignals.valid()) {\n throw new Error('Form is invalid');\n }\n const currentValues = valuesTree.unwrap();\n const result = await submitFn(currentValues);\n return result;\n }\n finally {\n formSignals.submitting.set(false);\n }\n },\n validate,\n getFieldError: (field) => fieldErrors[field] || computed(() => undefined),\n getFieldAsyncError: (field) => fieldAsyncErrors[field] || computed(() => undefined),\n getFieldTouched: (field) => computed(() => {\n const touched = formSignals.touched();\n return touched[field];\n }),\n isFieldValid: (field) => computed(() => {\n const errors = formSignals.errors();\n const asyncErrors = formSignals.asyncErrors();\n const asyncValidating = formSignals.asyncValidating();\n return !errors[field] && !asyncErrors[field] && !asyncValidating[field];\n }),\n isFieldAsyncValidating: (field) => computed(() => {\n const asyncValidating = formSignals.asyncValidating();\n return asyncValidating[field];\n }),\n fieldErrors,\n fieldAsyncErrors,\n values: valuesTree,\n };\n return formTree;\n}\nexport class SignalValueDirective {\n signalTreeSignalValue;\n signalTreeSignalValueChange = new EventEmitter();\n elementRef = inject(ElementRef);\n renderer = inject(Renderer2);\n onChange = () => {\n };\n onTouched = () => {\n };\n ngOnInit() {\n effect(() => {\n const value = this.signalTreeSignalValue();\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', value);\n });\n }\n handleChange(event) {\n const target = event.target;\n const value = target?.value;\n if (value !== undefined) {\n this.signalTreeSignalValue.set(value);\n this.signalTreeSignalValueChange.emit(value);\n this.onChange(value);\n }\n }\n handleBlur() {\n this.onTouched();\n }\n writeValue(value) {\n if (value !== undefined) {\n this.signalTreeSignalValue.set(value);\n }\n }\n registerOnChange(fn) {\n this.onChange = fn;\n }\n registerOnTouched(fn) {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled) {\n this.renderer.setProperty(this.elementRef.nativeElement, 'disabled', isDisabled);\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: SignalValueDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.1.4\", type: SignalValueDirective, isStandalone: true, selector: \"[signalTreeSignalValue]\", inputs: { signalTreeSignalValue: \"signalTreeSignalValue\" }, outputs: { signalTreeSignalValueChange: \"signalTreeSignalValueChange\" }, host: { listeners: { \"input\": \"handleChange($event)\", \"change\": \"handleChange($event)\", \"blur\": \"handleBlur()\" } }, providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SignalValueDirective),\n multi: true,\n },\n ], ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.4\", ngImport: i0, type: SignalValueDirective, decorators: [{\n type: Directive,\n args: [{\n selector: '[signalTreeSignalValue]',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SignalValueDirective),\n multi: true,\n },\n ],\n standalone: true,\n }]\n }], propDecorators: { signalTreeSignalValue: [{\n type: Input\n }], signalTreeSignalValueChange: [{\n type: Output\n }], handleChange: [{\n type: HostListener,\n args: ['input', ['$event']]\n }, {\n type: HostListener,\n args: ['change', ['$event']]\n }], handleBlur: [{\n type: HostListener,\n args: ['blur']\n }] } });\nexport const validators = {\n required: (message = 'Required') => (value) => !value ? message : null,\n email: (message = 'Invalid email') => (value) => {\n const strValue = value;\n return strValue && !strValue.includes('@') ? message : null;\n },\n minLength: (min) => (value) => {\n const strValue = value;\n return strValue && strValue.length < min ? `Min ${min} characters` : null;\n },\n pattern: (regex, message = 'Invalid format') => (value) => {\n const strValue = value;\n return strValue && !regex.test(strValue) ? message : null;\n },\n};\nexport const asyncValidators = {\n unique: (checkFn, message = 'Already exists') => async (value) => {\n if (!value)\n return null;\n const exists = await checkFn(value);\n return exists ? message : null;\n },\n};\nexport function toObservable(signal) {\n return new Observable((subscriber) => {\n try {\n const effectRef = effect(() => {\n subscriber.next(signal());\n }, ...(ngDevMode ? [{ debugName: \"effectRef\" }] : []));\n return () => effectRef.destroy();\n }\n catch {\n subscriber.next(signal());\n return () => {\n };\n }\n });\n}\nexport function createAuditMiddleware(auditLog, getMetadata) {\n return {\n id: 'audit',\n after: (action, payload, oldState, newState) => {\n const changes = getChanges(oldState, newState);\n if (Object.keys(changes).length > 0) {\n auditLog.push({\n timestamp: Date.now(),\n changes,\n metadata: getMetadata?.(),\n });\n }\n },\n };\n}\nfunction getChanges(oldState, newState) {\n const changes = {};\n for (const key in newState) {\n if (oldState[key] !== newState[key]) {\n changes[key] = newState[key];\n }\n }\n return changes;\n}\nexport const SIGNAL_FORM_DIRECTIVES = [SignalValueDirective];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctZm9ybXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy1mb3Jtcy9zcmMvbGliL25nLWZvcm1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE9BQU8sRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixVQUFVLEVBQ1YsVUFBVSxFQUNWLFNBQVMsRUFDVCxZQUFZLEdBRWIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFTbEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7QUFtRXpELE1BQU0sVUFBVSxjQUFjLENBQzVCLGFBQWdCLEVBQ2hCLFNBR2lCLEVBQUU7SUFFbkIsTUFBTSxFQUFFLFVBQVUsR0FBRyxFQUFFLEVBQUUsZUFBZSxHQUFHLEVBQUUsRUFBRSxHQUFHLFVBQVUsRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUd4RSxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBR3pELE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxLQUF5QixDQUFDO0lBRzVELE1BQU0sV0FBVyxHQUFHO1FBQ2xCLE1BQU0sRUFBRSxNQUFNLENBQXlCLEVBQUUsQ0FBQztRQUMxQyxXQUFXLEVBQUUsTUFBTSxDQUF5QixFQUFFLENBQUM7UUFDL0MsT0FBTyxFQUFFLE1BQU0sQ0FBMEIsRUFBRSxDQUFDO1FBQzVDLGVBQWUsRUFBRSxNQUFNLENBQTBCLEVBQUUsQ0FBQztRQUNwRCxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNwQixLQUFLLEVBQUUsTUFB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RUFBRTtvQkFDckIsT0FBTztvQkFDUCxRQUFRLEVBQUUsV0FBVyxFQUFFLEVBQUU7aUJBQzFCLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBSSxRQUFXLEVBQUUsUUFBVztJQUM3QyxNQUFNLE9BQU8sR0FBNEIsRUFBRSxDQUFDO0lBRTVDLEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7UUFDM0IsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sT0FBcUIsQ0FBQztBQUMvQixDQUFDO0FBTUQsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IEFuZ3VsYXIgRm9ybXMgSW50ZWdyYXRpb24gZm9yIFNpZ25hbFRyZWVcbiAqXG4gKiBQcm92aWRlcyBjb21wcmVoZW5zaXZlIEFuZ3VsYXIgZm9ybSBpbnRlZ3JhdGlvbiBpbmNsdWRpbmcgRm9ybVRyZWUsXG4gKiBkaXJlY3RpdmVzLCB2YWxpZGF0b3JzLCBlbmhhbmNlZCBhcnJheSBvcGVyYXRpb25zLCBhbmQgUnhKUyBicmlkZ2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgU2lnbmFsLFxuICBXcml0YWJsZVNpZ25hbCxcbiAgaXNTaWduYWwsXG4gIHNpZ25hbCxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBEaXJlY3RpdmUsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgRWxlbWVudFJlZixcbiAgUmVuZGVyZXIyLFxuICBIb3N0TGlzdGVuZXIsXG4gIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbi8vIFJlLWV4cG9ydCBjb3JlIHR5cGVzIG5lZWRlZCBmb3IgZm9ybXNcbmltcG9ydCB0eXBlIHtcbiAgU2lnbmFsVHJlZSxcbiAgVHJlZUNvbmZpZyxcbiAgRGVlcFNpZ25hbGlmeSxcbiAgTWlkZGxld2FyZSxcbn0gZnJvbSAnQHNpZ25hbHRyZWUvY29yZSc7XG5pbXBvcnQgeyBzaWduYWxUcmVlLCBwYXJzZVBhdGggfSBmcm9tICdAc2lnbmFsdHJlZS9jb3JlJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEZPUk0gVFJFRSBUWVBFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHR5cGUgQXN5bmNWYWxpZGF0b3JGbjxUPiA9IChcbiAgdmFsdWU6IFRcbikgPT4gT2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPiB8IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG5cbmV4cG9ydCB0eXBlIEVuaGFuY2VkQXJyYXlTaWduYWw8VD4gPSBXcml0YWJsZVNpZ25hbDxUW10+ICYge1xuICBwdXNoOiAoaXRlbTogVCkgPT4gdm9pZDtcbiAgcmVtb3ZlQXQ6IChpbmRleDogbnVtYmVyKSA9PiB2b2lkO1xuICBzZXRBdDogKGluZGV4OiBudW1iZXIsIHZhbHVlOiBUKSA9PiB2b2lkO1xuICBpbnNlcnRBdDogKGluZGV4OiBudW1iZXIsIGl0ZW06IFQpID0+IHZvaWQ7XG4gIG1vdmU6IChmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpID0+IHZvaWQ7XG4gIGNsZWFyOiAoKSA9PiB2b2lkO1xufTtcblxuLyoqXG4gKiBGb3JtIHRyZWUgdHlwZSB0aGF0IGZsYXR0ZW5zIHRoZSBzdGF0ZSBhY2Nlc3Mgd2hpbGUgbWFpbnRhaW5pbmcgZm9ybS1zcGVjaWZpYyBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCB0eXBlIEZvcm1UcmVlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSB7XG4gIC8vIEZsYXR0ZW5lZCBzdGF0ZSBhY2Nlc3MgLSBkaXJlY3QgYWNjZXNzIHRvIGZvcm0gdmFsdWVzIGFzIHNpZ25hbHNcbiAgc3RhdGU6IERlZXBTaWduYWxpZnk8VD47XG4gICQ6IERlZXBTaWduYWxpZnk8VD47IC8vIEFsaWFzIGZvciBzdGF0ZVxuXG4gIC8vIEZvcm0tc3BlY2lmaWMgc2lnbmFsc1xuICBlcnJvcnM6IFdyaXRhYmxlU2lnbmFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICBhc3luY0Vycm9yczogV3JpdGFibGVTaWduYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gIHRvdWNoZWQ6IFdyaXRhYmxlU2lnbmFsPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+PjtcbiAgYXN5bmNWYWxpZGF0aW5nOiBXcml0YWJsZVNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj47XG4gIGRpcnR5OiBXcml0YWJsZVNpZ25hbDxib29sZWFuPjtcbiAgdmFsaWQ6IFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+O1xuICBzdWJtaXR0aW5nOiBXcml0YWJsZVNpZ25hbDxib29sZWFuPjtcblxuICAvLyBGb3JtIG1ldGhvZHNcbiAgdW53cmFwKCk6IFQ7XG4gIHNldFZhbHVlKGZpZWxkOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgc2V0VmFsdWVzKHZhbHVlczogUGFydGlhbDxUPik6IHZvaWQ7XG4gIHJlc2V0KCk6IHZvaWQ7XG4gIHN1Ym1pdDxUUmVzdWx0PihzdWJtaXRGbjogKHZhbHVlczogVCkgPT4gUHJvbWlzZTxUUmVzdWx0Pik6IFByb21pc2U8VFJlc3VsdD47XG4gIHZhbGlkYXRlKGZpZWxkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcblxuICAvLyBGaWVsZC1sZXZlbCBoZWxwZXJzXG4gIGdldEZpZWxkRXJyb3IoZmllbGQ6IHN0cmluZyk6IFNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+O1xuICBnZXRGaWVsZEFzeW5jRXJyb3IoZmllbGQ6IHN0cmluZyk6IFNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+O1xuICBnZXRGaWVsZFRvdWNoZWQoZmllbGQ6IHN0cmluZyk6IFNpZ25hbDxib29sZWFuIHwgdW5kZWZpbmVkPjtcbiAgaXNGaWVsZFZhbGlkKGZpZWxkOiBzdHJpbmcpOiBTaWduYWw8Ym9vbGVhbj47XG4gIGlzRmllbGRBc3luY1ZhbGlkYXRpbmcoZmllbGQ6IHN0cmluZyk6IFNpZ25hbDxib29sZWFuIHwgdW5kZWZpbmVkPjtcblxuICAvLyBEaXJlY3QgYWNjZXNzIHRvIGZpZWxkIGVycm9yc1xuICBmaWVsZEVycm9yczogUmVjb3JkPHN0cmluZywgU2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4+O1xuICBmaWVsZEFzeW5jRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBTaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPj47XG5cbiAgLy8gS2VlcCB2YWx1ZXMgdHJlZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICB2YWx1ZXM6IFNpZ25hbFRyZWU8VD47XG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVVRJTElUWSBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBGT1JNIFRSRUUgSU1QTEVNRU5UQVRJT05cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGb3JtVHJlZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICBpbml0aWFsVmFsdWVzOiBULFxuICBjb25maWc6IHtcbiAgICB2YWxpZGF0b3JzPzogUmVjb3JkPHN0cmluZywgKHZhbHVlOiB1bmtub3duKSA9PiBzdHJpbmcgfCBudWxsPjtcbiAgICBhc3luY1ZhbGlkYXRvcnM/OiBSZWNvcmQ8c3RyaW5nLCBBc3luY1ZhbGlkYXRvckZuPHVua25vd24+PjtcbiAgfSAmIFRyZWVDb25maWcgPSB7fVxuKTogRm9ybVRyZWU8VD4ge1xuICBjb25zdCB7IHZhbGlkYXRvcnMgPSB7fSwgYXN5bmNWYWxpZGF0b3JzID0ge30sIC4uLnRyZWVDb25maWcgfSA9IGNvbmZpZztcblxuICAvLyBDcmVhdGUgdGhlIHVuZGVybHlpbmcgc2lnbmFsIHRyZWVcbiAgY29uc3QgdmFsdWVzVHJlZSA9IHNpZ25hbFRyZWUoaW5pdGlhbFZhbHVlcywgdHJlZUNvbmZpZyk7XG5cbiAgLy8gRW5zdXJlIHRoZSBzdGF0ZSBoYXMgdGhlIGNvcnJlY3QgdHlwZSAtIHRoaXMgaXMgdGhlIGtleSBmaXhcbiAgY29uc3QgZmxhdHRlbmVkU3RhdGUgPSB2YWx1ZXNUcmVlLnN0YXRlIGFzIERlZXBTaWduYWxpZnk8VD47XG5cbiAgLy8gQ3JlYXRlIGZvcm0tc3BlY2lmaWMgc2lnbmFsc1xuICBjb25zdCBmb3JtU2lnbmFscyA9IHtcbiAgICBlcnJvcnM6IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pih7fSksXG4gICAgYXN5bmNFcnJvcnM6IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pih7fSksXG4gICAgdG91Y2hlZDogc2lnbmFsPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+Pih7fSksXG4gICAgYXN5bmNWYWxpZGF0aW5nOiBzaWduYWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+KHt9KSxcbiAgICBkaXJ0eTogc2lnbmFsKGZhbHNlKSxcbiAgICB2YWxpZDogc2lnbmFsKHRydWUpLFxuICAgIHN1Ym1pdHRpbmc6IHNpZ25hbChmYWxzZSksXG4gIH07XG5cbiAgY29uc3QgbWFya0RpcnR5ID0gKCkgPT4gZm9ybVNpZ25hbHMuZGlydHkuc2V0KHRydWUpO1xuXG4gIC8vIEVuaGFuY2UgYXJyYXlzIHdpdGggbmF0dXJhbCBvcGVyYXRpb25zXG4gIGNvbnN0IGVuaGFuY2VBcnJheSA9IDxVPihcbiAgICBhcnJheVNpZ25hbDogV3JpdGFibGVTaWduYWw8VVtdPlxuICApOiBFbmhhbmNlZEFycmF5U2lnbmFsPFU+ID0+IHtcbiAgICBjb25zdCBlbmhhbmNlZCA9IGFycmF5U2lnbmFsIGFzIEVuaGFuY2VkQXJyYXlTaWduYWw8VT47XG5cbiAgICBlbmhhbmNlZC5wdXNoID0gKGl0ZW06IFUpID0+IHtcbiAgICAgIGFycmF5U2lnbmFsLnVwZGF0ZSgoYXJyKSA9PiBbLi4uYXJyLCBpdGVtXSk7XG4gICAgICBtYXJrRGlydHkoKTtcbiAgICB9O1xuXG4gICAgZW5oYW5jZWQucmVtb3ZlQXQgPSAoaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgYXJyYXlTaWduYWwudXBkYXRlKChhcnIpID0+IGFyci5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KSk7XG4gICAgICBtYXJrRGlydHkoKTtcbiAgICB9O1xuXG4gICAgZW5oYW5jZWQuc2V0QXQgPSAoaW5kZXg6IG51bWJlciwgdmFsdWU6IFUpID0+IHtcbiAgICAgIGFycmF5U2lnbmFsLnVwZGF0ZSgoYXJyKSA9PlxuICAgICAgICBhcnIubWFwKChpdGVtLCBpKSA9PiAoaSA9PT0gaW5kZXggPyB2YWx1ZSA6IGl0ZW0pKVxuICAgICAgKTtcbiAgICAgIG1hcmtEaXJ0eSgpO1xuICAgIH07XG5cbiAgICBlbmhhbmNlZC5pbnNlcnRBdCA9IChpbmRleDogbnVtYmVyLCBpdGVtOiBVKSA9PiB7XG4gICAgICBhcnJheVNpZ25hbC51cGRhdGUoKGFycikgPT4gW1xuICAgICAgICAuLi5hcnIuc2xpY2UoMCwgaW5kZXgpLFxuICAgICAgICBpdGVtLFxuICAgICAgICAuLi5hcnIuc2xpY2UoaW5kZXgpLFxuICAgICAgXSk7XG4gICAgICBtYXJrRGlydHkoKTtcbiAgICB9O1xuXG4gICAgZW5oYW5jZWQubW92ZSA9IChmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpID0+IHtcbiAgICAgIGFycmF5U2lnbmFsLnVwZGF0ZSgoYXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0FyciA9IFsuLi5hcnJdO1xuICAgICAgICBjb25zdCBbaXRlbV0gPSBuZXdBcnIuc3BsaWNlKGZyb20sIDEpO1xuICAgICAgICBpZiAoaXRlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmV3QXJyLnNwbGljZSh0bywgMCwgaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld0FycjtcbiAgICAgIH0pO1xuICAgICAgbWFya0RpcnR5KCk7XG4gICAgfTtcblxuICAgIGVuaGFuY2VkLmNsZWFyID0gKCkgPT4ge1xuICAgICAgYXJyYXlTaWduYWwuc2V0KFtdKTtcbiAgICAgIG1hcmtEaXJ0eSgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gZW5oYW5jZWQ7XG4gIH07XG5cbiAgLy8gUmVjdXJzaXZlbHkgZW5oYW5jZSBhbGwgYXJyYXlzIGluIHRoZSBzdGF0ZVxuICBjb25zdCBlbmhhbmNlQXJyYXlzUmVjdXJzaXZlbHkgPSAob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgIGlmIChpc1NpZ25hbCh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3Qgc2lnbmFsVmFsdWUgPSAodmFsdWUgYXMgU2lnbmFsPHVua25vd24+KSgpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzaWduYWxWYWx1ZSkpIHtcbiAgICAgICAgICBvYmpba2V5XSA9IGVuaGFuY2VBcnJheSh2YWx1ZSBhcyBXcml0YWJsZVNpZ25hbDx1bmtub3duW10+KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBlbmhhbmNlQXJyYXlzUmVjdXJzaXZlbHkodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBFbmhhbmNlIGFycmF5cyBpbiB0aGUgc3RhdGVcbiAgZW5oYW5jZUFycmF5c1JlY3Vyc2l2ZWx5KGZsYXR0ZW5lZFN0YXRlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcblxuICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBuZXN0ZWQgcGF0aHNcbiAgY29uc3QgZ2V0TmVzdGVkVmFsdWUgPSAob2JqOiBEZWVwU2lnbmFsaWZ5PFQ+LCBwYXRoOiBzdHJpbmcpOiB1bmtub3duID0+IHtcbiAgICBjb25zdCBrZXlzID0gcGFyc2VQYXRoKHBhdGgpO1xuICAgIGxldCBjdXJyZW50OiB1bmtub3duID0gb2JqO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKGN1cnJlbnQgJiYgdHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGN1cnJlbnQgPSAoY3VycmVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcbiAgICAgICAgaWYgKGlzU2lnbmFsKGN1cnJlbnQpKSB7XG4gICAgICAgICAgY3VycmVudCA9IChjdXJyZW50IGFzIFNpZ25hbDx1bmtub3duPikoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfTtcblxuICBjb25zdCBzZXROZXN0ZWRWYWx1ZSA9IChwYXRoOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgY29uc3Qga2V5cyA9IHBhcnNlUGF0aChwYXRoKTtcbiAgICBsZXQgY3VycmVudDogdW5rbm93biA9IGZsYXR0ZW5lZFN0YXRlO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgY3VycmVudCA9IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXlzW2ldXTtcbiAgICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxhc3RLZXkgPSBrZXlzW2tleXMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgdGFyZ2V0ID0gKGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2xhc3RLZXldO1xuXG4gICAgaWYgKGlzU2lnbmFsKHRhcmdldCkgJiYgJ3NldCcgaW4gdGFyZ2V0KSB7XG4gICAgICAodGFyZ2V0IGFzIFdyaXRhYmxlU2lnbmFsPHVua25vd24+KS5zZXQodmFsdWUpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB2YWxpZGF0ZSA9IGFzeW5jIChmaWVsZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGVycm9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGNvbnN0IGFzeW5jRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICBjb25zdCBmaWVsZHNUb1ZhbGlkYXRlID0gZmllbGQgPyBbZmllbGRdIDogT2JqZWN0LmtleXModmFsaWRhdG9ycyk7XG5cbiAgICAvLyBTeW5jIHZhbGlkYXRpb25cbiAgICBmb3IgKGNvbnN0IGZpZWxkUGF0aCBvZiBmaWVsZHNUb1ZhbGlkYXRlKSB7XG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSB2YWxpZGF0b3JzW2ZpZWxkUGF0aF07XG4gICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0TmVzdGVkVmFsdWUoZmxhdHRlbmVkU3RhdGUsIGZpZWxkUGF0aCk7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdG9yKHZhbHVlKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgZXJyb3JzW2ZpZWxkUGF0aF0gPSBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvcm1TaWduYWxzLmVycm9ycy5zZXQoZXJyb3JzKTtcblxuICAgIC8vIEFzeW5jIHZhbGlkYXRpb25cbiAgICBjb25zdCBhc3luY0ZpZWxkc1RvVmFsaWRhdGUgPSBmaWVsZFxuICAgICAgPyBbZmllbGRdXG4gICAgICA6IE9iamVjdC5rZXlzKGFzeW5jVmFsaWRhdG9ycyk7XG5cbiAgICBmb3IgKGNvbnN0IGZpZWxkUGF0aCBvZiBhc3luY0ZpZWxkc1RvVmFsaWRhdGUpIHtcbiAgICAgIGNvbnN0IGFzeW5jVmFsaWRhdG9yID0gYXN5bmNWYWxpZGF0b3JzW2ZpZWxkUGF0aF07XG4gICAgICBpZiAoYXN5bmNWYWxpZGF0b3IgJiYgKCFmaWVsZCB8fCBmaWVsZCA9PT0gZmllbGRQYXRoKSkge1xuICAgICAgICBmb3JtU2lnbmFscy5hc3luY1ZhbGlkYXRpbmcudXBkYXRlKCh2KSA9PiAoe1xuICAgICAgICAgIC4uLnYsXG4gICAgICAgICAgW2ZpZWxkUGF0aF06IHRydWUsXG4gICAgICAgIH0pKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0TmVzdGVkVmFsdWUoZmxhdHRlbmVkU3RhdGUsIGZpZWxkUGF0aCk7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXN5bmNWYWxpZGF0b3IodmFsdWUpO1xuXG4gICAgICAgICAgbGV0IGVycm9yOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgT2JzZXJ2YWJsZVxuICAgICAgICAgICAgZXJyb3IgPSBhd2FpdCBuZXcgUHJvbWlzZTxzdHJpbmcgfCBudWxsPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICByZXN1bHQuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiAodmFsKSA9PiByZXNvbHZlKHZhbCksXG4gICAgICAgICAgICAgICAgZXJyb3I6ICgpID0+IHJlc29sdmUoJ1ZhbGlkYXRpb24gZXJyb3InKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSGFuZGxlIFByb21pc2VcbiAgICAgICAgICAgIGVycm9yID0gYXdhaXQgcmVzdWx0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgYXN5bmNFcnJvcnNbZmllbGRQYXRoXSA9IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgYXN5bmNFcnJvcnNbZmllbGRQYXRoXSA9ICdWYWxpZGF0aW9uIGVycm9yJztcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1TaWduYWxzLmFzeW5jVmFsaWRhdGluZy51cGRhdGUoKHYpID0+ICh7XG4gICAgICAgICAgLi4udixcbiAgICAgICAgICBbZmllbGRQYXRoXTogZmFsc2UsXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3JtU2lnbmFscy5hc3luY0Vycm9ycy5zZXQoYXN5bmNFcnJvcnMpO1xuXG4gICAgLy8gVXBkYXRlIHZhbGlkaXR5XG4gICAgY29uc3QgaGFzRXJyb3JzID0gT2JqZWN0LmtleXMoZXJyb3JzKS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IGhhc0FzeW5jRXJyb3JzID0gT2JqZWN0LmtleXMoYXN5bmNFcnJvcnMpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgaXNWYWxpZGF0aW5nID0gT2JqZWN0LnZhbHVlcyhmb3JtU2lnbmFscy5hc3luY1ZhbGlkYXRpbmcoKSkuc29tZShcbiAgICAgICh2KSA9PiB2XG4gICAgKTtcblxuICAgIGZvcm1TaWduYWxzLnZhbGlkLnNldCghaGFzRXJyb3JzICYmICFoYXNBc3luY0Vycm9ycyAmJiAhaXNWYWxpZGF0aW5nKTtcbiAgfTtcblxuICAvLyBDcmVhdGUgY29tcHV0ZWQgc2lnbmFscyBmb3IgZmllbGQgZXJyb3JzXG4gIGNvbnN0IGZpZWxkRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBTaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPj4gPSB7fTtcbiAgY29uc3QgZmllbGRBc3luY0Vycm9yczogUmVjb3JkPHN0cmluZywgU2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4+ID0ge307XG5cbiAgLy8gQ3JlYXRlIGVycm9yIHNpZ25hbHMgZm9yIGFsbCBkZWZpbmVkIHZhbGlkYXRvcnNcbiAgWy4uLk9iamVjdC5rZXlzKHZhbGlkYXRvcnMpLCAuLi5PYmplY3Qua2V5cyhhc3luY1ZhbGlkYXRvcnMpXS5mb3JFYWNoKFxuICAgIChmaWVsZFBhdGgpID0+IHtcbiAgICAgIGZpZWxkRXJyb3JzW2ZpZWxkUGF0aF0gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVycm9ycyA9IGZvcm1TaWduYWxzLmVycm9ycygpO1xuICAgICAgICByZXR1cm4gZXJyb3JzW2ZpZWxkUGF0aF07XG4gICAgICB9KTtcbiAgICAgIGZpZWxkQXN5bmNFcnJvcnNbZmllbGRQYXRoXSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gZm9ybVNpZ25hbHMuYXN5bmNFcnJvcnMoKTtcbiAgICAgICAgcmV0dXJuIGVycm9yc1tmaWVsZFBhdGhdO1xuICAgICAgfSk7XG4gICAgfVxuICApO1xuXG4gIC8vIENyZWF0ZSB0aGUgZm9ybSB0cmVlIG9iamVjdFxuICBjb25zdCBmb3JtVHJlZTogRm9ybVRyZWU8VD4gPSB7XG4gICAgLy8gRmxhdHRlbmVkIHN0YXRlIGFjY2Vzc1xuICAgIHN0YXRlOiBmbGF0dGVuZWRTdGF0ZSxcbiAgICAkOiBmbGF0dGVuZWRTdGF0ZSxcblxuICAgIC8vIEZvcm0gc2lnbmFsc1xuICAgIC4uLmZvcm1TaWduYWxzLFxuXG4gICAgLy8gQ29yZSBtZXRob2RzXG4gICAgdW53cmFwOiAoKSA9PiB2YWx1ZXNUcmVlLnVud3JhcCgpLFxuXG4gICAgc2V0VmFsdWU6IChmaWVsZDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgc2V0TmVzdGVkVmFsdWUoZmllbGQsIHZhbHVlKTtcbiAgICAgIGZvcm1TaWduYWxzLnRvdWNoZWQudXBkYXRlKCh0KSA9PiAoeyAuLi50LCBbZmllbGRdOiB0cnVlIH0pKTtcbiAgICAgIG1hcmtEaXJ0eSgpO1xuICAgICAgdm9pZCB2YWxpZGF0ZShmaWVsZCk7XG4gICAgfSxcblxuICAgIHNldFZhbHVlczogKHZhbHVlczogUGFydGlhbDxUPikgPT4ge1xuICAgICAgdmFsdWVzVHJlZS51cGRhdGUoKHYpID0+ICh7IC4uLnYsIC4uLnZhbHVlcyB9KSk7XG4gICAgICBtYXJrRGlydHkoKTtcbiAgICAgIHZvaWQgdmFsaWRhdGUoKTtcbiAgICB9LFxuXG4gICAgcmVzZXQ6ICgpID0+IHtcbiAgICAgIC8vIFJlc2V0IGVhY2ggZmllbGQgaW5kaXZpZHVhbGx5IHRvIG1haW50YWluIHNpZ25hbCByZWFjdGl2aXR5XG4gICAgICBjb25zdCByZXNldFNpZ25hbHMgPSA8VFJlc2V0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgICAgICBjdXJyZW50OiBEZWVwU2lnbmFsaWZ5PFRSZXNldD4sXG4gICAgICAgIGluaXRpYWw6IFRSZXNldFxuICAgICAgKTogdm9pZCA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgaW5pdGlhbFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbml0aWFsKSkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuXG4gICAgICAgICAgaWYgKGlzU2lnbmFsKGN1cnJlbnRWYWx1ZSkgJiYgJ3NldCcgaW4gY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICAoY3VycmVudFZhbHVlIGFzIFdyaXRhYmxlU2lnbmFsPHVua25vd24+KS5zZXQoaW5pdGlhbFZhbHVlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGluaXRpYWxWYWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIGluaXRpYWxWYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoaW5pdGlhbFZhbHVlKSAmJlxuICAgICAgICAgICAgdHlwZW9mIGN1cnJlbnRWYWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgIWlzU2lnbmFsKGN1cnJlbnRWYWx1ZSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJlc2V0U2lnbmFscyhcbiAgICAgICAgICAgICAgY3VycmVudFZhbHVlIGFzIERlZXBTaWduYWxpZnk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXNldFNpZ25hbHMoZmxhdHRlbmVkU3RhdGUsIGluaXRpYWxWYWx1ZXMpO1xuXG4gICAgICBmb3JtU2lnbmFscy5lcnJvcnMuc2V0KHt9KTtcbiAgICAgIGZvcm1TaWduYWxzLmFzeW5jRXJyb3JzLnNldCh7fSk7XG4gICAgICBmb3JtU2lnbmFscy50b3VjaGVkLnNldCh7fSk7XG4gICAgICBmb3JtU2lnbmFscy5hc3luY1ZhbGlkYXRpbmcuc2V0KHt9KTtcbiAgICAgIGZvcm1TaWduYWxzLmRpcnR5LnNldChmYWxzZSk7XG4gICAgICBmb3JtU2lnbmFscy52YWxpZC5zZXQodHJ1ZSk7XG4gICAgICBmb3JtU2lnbmFscy5zdWJtaXR0aW5nLnNldChmYWxzZSk7XG4gICAgfSxcblxuICAgIHN1Ym1pdDogYXN5bmMgPFRSZXN1bHQ+KFxuICAgICAgc3VibWl0Rm46ICh2YWx1ZXM6IFQpID0+IFByb21pc2U8VFJlc3VsdD5cbiAgICApOiBQcm9taXNlPFRSZXN1bHQ+ID0+IHtcbiAgICAgIGZvcm1TaWduYWxzLnN1Ym1pdHRpbmcuc2V0KHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB2YWxpZGF0ZSgpO1xuXG4gICAgICAgIGlmICghZm9ybVNpZ25hbHMudmFsaWQoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRm9ybSBpcyBpbnZhbGlkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWVzID0gdmFsdWVzVHJlZS51bndyYXAoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3VibWl0Rm4oY3VycmVudFZhbHVlcyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBmb3JtU2lnbmFscy5zdWJtaXR0aW5nLnNldChmYWxzZSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHZhbGlkYXRlLFxuXG4gICAgLy8gRmllbGQgaGVscGVyc1xuICAgIGdldEZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PlxuICAgICAgZmllbGRFcnJvcnNbZmllbGRdIHx8IGNvbXB1dGVkKCgpID0+IHVuZGVmaW5lZCksXG5cbiAgICBnZXRGaWVsZEFzeW5jRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PlxuICAgICAgZmllbGRBc3luY0Vycm9yc1tmaWVsZF0gfHwgY29tcHV0ZWQoKCkgPT4gdW5kZWZpbmVkKSxcblxuICAgIGdldEZpZWxkVG91Y2hlZDogKGZpZWxkOiBzdHJpbmcpID0+XG4gICAgICBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRvdWNoZWQgPSBmb3JtU2lnbmFscy50b3VjaGVkKCk7XG4gICAgICAgIHJldHVybiB0b3VjaGVkW2ZpZWxkXTtcbiAgICAgIH0pLFxuXG4gICAgaXNGaWVsZFZhbGlkOiAoZmllbGQ6IHN0cmluZykgPT5cbiAgICAgIGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gZm9ybVNpZ25hbHMuZXJyb3JzKCk7XG4gICAgICAgIGNvbnN0IGFzeW5jRXJyb3JzID0gZm9ybVNpZ25hbHMuYXN5bmNFcnJvcnMoKTtcbiAgICAgICAgY29uc3QgYXN5bmNWYWxpZGF0aW5nID0gZm9ybVNpZ25hbHMuYXN5bmNWYWxpZGF0aW5nKCk7XG4gICAgICAgIHJldHVybiAhZXJyb3JzW2ZpZWxkXSAmJiAhYXN5bmNFcnJvcnNbZmllbGRdICYmICFhc3luY1ZhbGlkYXRpbmdbZmllbGRdO1xuICAgICAgfSksXG5cbiAgICBpc0ZpZWxkQXN5bmNWYWxpZGF0aW5nOiAoZmllbGQ6IHN0cmluZykgPT5cbiAgICAgIGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgYXN5bmNWYWxpZGF0aW5nID0gZm9ybVNpZ25hbHMuYXN5bmNWYWxpZGF0aW5nKCk7XG4gICAgICAgIHJldHVybiBhc3luY1ZhbGlkYXRpbmdbZmllbGRdO1xuICAgICAgfSksXG5cbiAgICAvLyBEaXJlY3QgYWNjZXNzXG4gICAgZmllbGRFcnJvcnMsXG4gICAgZmllbGRBc3luY0Vycm9ycyxcblxuICAgIC8vIEtlZXAgdmFsdWVzIHRyZWUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICB2YWx1ZXM6IHZhbHVlc1RyZWUsXG4gIH07XG5cbiAgcmV0dXJuIGZvcm1UcmVlO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQU5HVUxBUiBESVJFQ1RJVkVcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogU2ltcGxlIGRpcmVjdGl2ZSBmb3IgdHdvLXdheSBiaW5kaW5nIHdpdGggc2lnbmFsc1xuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbc2lnbmFsVHJlZVNpZ25hbFZhbHVlXScsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2lnbmFsVmFsdWVEaXJlY3RpdmUpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgU2lnbmFsVmFsdWVEaXJlY3RpdmUgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0IHtcbiAgQElucHV0KCkgc2lnbmFsVHJlZVNpZ25hbFZhbHVlITogV3JpdGFibGVTaWduYWw8dW5rbm93bj47XG4gIEBPdXRwdXQoKSBzaWduYWxUcmVlU2lnbmFsVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHVua25vd24+KCk7XG5cbiAgcHJpdmF0ZSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG5cbiAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkID0gKCkgPT4ge1xuICAgIC8vIEVtcHR5IGltcGxlbWVudGF0aW9uIGZvciBDb250cm9sVmFsdWVBY2Nlc3NvclxuICB9O1xuICBwcml2YXRlIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHtcbiAgICAvLyBFbXB0eSBpbXBsZW1lbnRhdGlvbiBmb3IgQ29udHJvbFZhbHVlQWNjZXNzb3JcbiAgfTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnNpZ25hbFRyZWVTaWduYWxWYWx1ZSgpO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgdmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignaW5wdXQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdjaGFuZ2UnLCBbJyRldmVudCddKVxuICBoYW5kbGVDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgdmFsdWUgPSB0YXJnZXQ/LnZhbHVlO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNpZ25hbFRyZWVTaWduYWxWYWx1ZS5zZXQodmFsdWUpO1xuICAgICAgdGhpcy5zaWduYWxUcmVlU2lnbmFsVmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgaGFuZGxlQmx1cigpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNpZ25hbFRyZWVTaWduYWxWYWx1ZS5zZXQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KFxuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAnZGlzYWJsZWQnLFxuICAgICAgaXNEaXNhYmxlZFxuICAgICk7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFZBTElEQVRPUlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0b3JzID0ge1xuICByZXF1aXJlZDpcbiAgICAobWVzc2FnZSA9ICdSZXF1aXJlZCcpID0+XG4gICAgKHZhbHVlOiB1bmtub3duKSA9PlxuICAgICAgIXZhbHVlID8gbWVzc2FnZSA6IG51bGwsXG5cbiAgZW1haWw6XG4gICAgKG1lc3NhZ2UgPSAnSW52YWxpZCBlbWFpbCcpID0+XG4gICAgKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBzdHJWYWx1ZSA9IHZhbHVlIGFzIHN0cmluZztcbiAgICAgIHJldHVybiBzdHJWYWx1ZSAmJiAhc3RyVmFsdWUuaW5jbHVkZXMoJ0AnKSA/IG1lc3NhZ2UgOiBudWxsO1xuICAgIH0sXG5cbiAgbWluTGVuZ3RoOiAobWluOiBudW1iZXIpID0+ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgIGNvbnN0IHN0clZhbHVlID0gdmFsdWUgYXMgc3RyaW5nO1xuICAgIHJldHVybiBzdHJWYWx1ZSAmJiBzdHJWYWx1ZS5sZW5ndGggPCBtaW4gPyBgTWluICR7bWlufSBjaGFyYWN0ZXJzYCA6IG51bGw7XG4gIH0sXG5cbiAgcGF0dGVybjpcbiAgICAocmVnZXg6IFJlZ0V4cCwgbWVzc2FnZSA9ICdJbnZhbGlkIGZvcm1hdCcpID0+XG4gICAgKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBzdHJWYWx1ZSA9IHZhbHVlIGFzIHN0cmluZztcbiAgICAgIHJldHVybiBzdHJWYWx1ZSAmJiAhcmVnZXgudGVzdChzdHJWYWx1ZSkgPyBtZXNzYWdlIDogbnVsbDtcbiAgICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGFzeW5jVmFsaWRhdG9ycyA9IHtcbiAgdW5pcXVlOlxuICAgIChcbiAgICAgIGNoZWNrRm46ICh2YWx1ZTogdW5rbm93bikgPT4gUHJvbWlzZTxib29sZWFuPixcbiAgICAgIG1lc3NhZ2UgPSAnQWxyZWFkeSBleGlzdHMnXG4gICAgKSA9PlxuICAgIGFzeW5jICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBleGlzdHMgPSBhd2FpdCBjaGVja0ZuKHZhbHVlKTtcbiAgICAgIHJldHVybiBleGlzdHMgPyBtZXNzYWdlIDogbnVsbDtcbiAgICB9LFxufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJYSlMgQlJJREdFXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgZnVuY3Rpb24gdG9PYnNlcnZhYmxlPFQ+KHNpZ25hbDogU2lnbmFsPFQ+KTogT2JzZXJ2YWJsZTxUPiB7XG4gIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoc3Vic2NyaWJlcikgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlZmZlY3RSZWYgPSBlZmZlY3QoKCkgPT4ge1xuICAgICAgICBzdWJzY3JpYmVyLm5leHQoc2lnbmFsKCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gKCkgPT4gZWZmZWN0UmVmLmRlc3Ryb3koKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZhbGxiYWNrIGZvciB0ZXN0IGVudmlyb25tZW50IHdpdGhvdXQgaW5qZWN0aW9uIGNvbnRleHRcbiAgICAgIHN1YnNjcmliZXIubmV4dChzaWduYWwoKSk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAvLyBObyBjbGVhbnVwIG5lZWRlZCBmb3Igc2luZ2xlIGVtaXNzaW9uXG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBVURJVCBNSURETEVXQVJFXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0RW50cnk8VCA9IHVua25vd24+IHtcbiAgdGltZXN0YW1wOiBudW1iZXI7XG4gIGNoYW5nZXM6IFBhcnRpYWw8VD47XG4gIG1ldGFkYXRhPzoge1xuICAgIHVzZXJJZD86IHN0cmluZztcbiAgICBzb3VyY2U/OiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBdWRpdE1pZGRsZXdhcmU8VD4oXG4gIGF1ZGl0TG9nOiBBdWRpdEVudHJ5PFQ+W10sXG4gIGdldE1ldGFkYXRhPzogKCkgPT4gQXVkaXRFbnRyeTxUPlsnbWV0YWRhdGEnXVxuKTogTWlkZGxld2FyZTxUPiB7XG4gIHJldHVybiB7XG4gICAgaWQ6ICdhdWRpdCcsXG4gICAgYWZ0ZXI6IChhY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93biwgb2xkU3RhdGU6IFQsIG5ld1N0YXRlOiBUKSA9PiB7XG4gICAgICBjb25zdCBjaGFuZ2VzID0gZ2V0Q2hhbmdlcyhvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgICAgaWYgKE9iamVjdC5rZXlzKGNoYW5nZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXVkaXRMb2cucHVzaCh7XG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgIGNoYW5nZXMsXG4gICAgICAgICAgbWV0YWRhdGE6IGdldE1ldGFkYXRhPy4oKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2hhbmdlczxUPihvbGRTdGF0ZTogVCwgbmV3U3RhdGU6IFQpOiBQYXJ0aWFsPFQ+IHtcbiAgY29uc3QgY2hhbmdlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBuZXdTdGF0ZSkge1xuICAgIGlmIChvbGRTdGF0ZVtrZXldICE9PSBuZXdTdGF0ZVtrZXldKSB7XG4gICAgICBjaGFuZ2VzW2tleV0gPSBuZXdTdGF0ZVtrZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjaGFuZ2VzIGFzIFBhcnRpYWw8VD47XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFWFBPUlRTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY29uc3QgU0lHTkFMX0ZPUk1fRElSRUNUSVZFUyA9IFtTaWduYWxWYWx1ZURpcmVjdGl2ZV07XG4iXX0="],"names":[],"mappings":"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"}
package/index.d.ts CHANGED
@@ -4,13 +4,6 @@ import { ControlValueAccessor } from '@angular/forms';
4
4
  import { Observable } from 'rxjs';
5
5
  import { DeepSignalify, SignalTree, TreeConfig, Middleware } from '@signaltree/core';
6
6
 
7
- /**
8
- * @fileoverview Angular Forms Integration for SignalTree
9
- *
10
- * Provides comprehensive Angular form integration including FormTree,
11
- * directives, validators, enhanced array operations, and RxJS bridge.
12
- */
13
-
14
7
  type AsyncValidatorFn<T> = (value: T) => Observable<string | null> | Promise<string | null>;
15
8
  type EnhancedArraySignal<T> = WritableSignal<T[]> & {
16
9
  push: (item: T) => void;
@@ -20,9 +13,6 @@ type EnhancedArraySignal<T> = WritableSignal<T[]> & {
20
13
  move: (from: number, to: number) => void;
21
14
  clear: () => void;
22
15
  };
23
- /**
24
- * Form tree type that flattens the state access while maintaining form-specific properties
25
- */
26
16
  type FormTree<T extends Record<string, unknown>> = {
27
17
  state: DeepSignalify<T>;
28
18
  $: DeepSignalify<T>;
@@ -52,9 +42,6 @@ declare function createFormTree<T extends Record<string, unknown>>(initialValues
52
42
  validators?: Record<string, (value: unknown) => string | null>;
53
43
  asyncValidators?: Record<string, AsyncValidatorFn<unknown>>;
54
44
  } & TreeConfig): FormTree<T>;
55
- /**
56
- * Simple directive for two-way binding with signals
57
- */
58
45
  declare class SignalValueDirective implements ControlValueAccessor, OnInit {
59
46
  signalTreeSignalValue: WritableSignal<unknown>;
60
47
  signalTreeSignalValueChange: EventEmitter<unknown>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@signaltree/ng-forms",
3
- "version": "1.1.0",
3
+ "version": "1.1.2",
4
4
  "description": "Complete Angular forms integration for SignalTree. FormTree creation, custom directives, validators, form state tracking, and RxJS bridge.",
5
5
  "peerDependencies": {
6
6
  "@angular/core": "^20.1.0",