@garrix82/reactgenie-lib 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/.env.example +22 -0
  2. package/.github/workflows/publish.yml +20 -0
  3. package/LICENSE.txt +201 -0
  4. package/README.md +621 -0
  5. package/babel.config.js +29 -0
  6. package/dist/adapters/__tests__/expo-router-adapter.test.d.ts +1 -0
  7. package/dist/adapters/expo-router-adapter.d.ts +16 -0
  8. package/dist/adapters/expo-router-adapter.js +521 -0
  9. package/dist/adapters/navigation-adapter.d.ts +20 -0
  10. package/dist/adapters/navigation-adapter.js +137 -0
  11. package/dist/audio-visualizer.d.ts +14 -0
  12. package/dist/audio-visualizer.js +123 -0
  13. package/dist/current-selection.d.ts +27 -0
  14. package/dist/current-selection.js +94 -0
  15. package/dist/errors.d.ts +19 -0
  16. package/dist/errors.js +37 -0
  17. package/dist/genie/DateTime.d.ts +66 -0
  18. package/dist/genie/DateTime.js +399 -0
  19. package/dist/genie/TimeDelta.d.ts +35 -0
  20. package/dist/genie/TimeDelta.js +169 -0
  21. package/dist/genie-view-wrapper.d.ts +1 -0
  22. package/dist/genie-view-wrapper.js +377 -0
  23. package/dist/hooks/__tests__/useSpeechRecognition.test.d.ts +1 -0
  24. package/dist/hooks/useSpeechRecognition.d.ts +28 -0
  25. package/dist/hooks/useSpeechRecognition.js +118 -0
  26. package/dist/index.d.ts +30 -0
  27. package/dist/index.js +469 -0
  28. package/dist/logger.d.ts +23 -0
  29. package/dist/logger.js +597 -0
  30. package/dist/logger.remote.test.d.ts +0 -0
  31. package/dist/modality-provider-v2.d.ts +28 -0
  32. package/dist/modality-provider-v2.js +1321 -0
  33. package/dist/modality-provider.d.ts +22 -0
  34. package/dist/modality-provider.js +373 -0
  35. package/dist/native-visibility.d.ts +28 -0
  36. package/dist/native-visibility.js +50 -0
  37. package/dist/platform/VoiceRecognitionBar.d.ts +17 -0
  38. package/dist/platform/VoiceRecognitionBar.js +332 -0
  39. package/dist/platform/components.d.ts +32 -0
  40. package/dist/platform/components.js +351 -0
  41. package/dist/platform/events.d.ts +31 -0
  42. package/dist/platform/events.js +274 -0
  43. package/dist/platform/index.d.ts +3 -0
  44. package/dist/platform/index.js +39 -0
  45. package/dist/platform/types.d.ts +79 -0
  46. package/dist/platform/types.js +97 -0
  47. package/dist/react-decorators.d.ts +87 -0
  48. package/dist/react-decorators.js +368 -0
  49. package/dist/shared-store.d.ts +74 -0
  50. package/dist/shared-store.js +589 -0
  51. package/dist/speech-recognition/__tests__/speech-recognition-groq-transport.test.d.ts +1 -0
  52. package/dist/speech-recognition/__tests__/speech-recognition-native.test.d.ts +1 -0
  53. package/dist/speech-recognition/__tests__/speech-recognition-openai-native.test.d.ts +1 -0
  54. package/dist/speech-recognition/__tests__/speech-recognition-openai.test.d.ts +1 -0
  55. package/dist/speech-recognition/__tests__/speech-recognition-unified-import.test.d.ts +0 -0
  56. package/dist/speech-recognition/__tests__/speech-recognition-unified.test.d.ts +1 -0
  57. package/dist/speech-recognition/speech-recognition-groq.d.ts +21 -0
  58. package/dist/speech-recognition/speech-recognition-groq.js +409 -0
  59. package/dist/speech-recognition/speech-recognition-mlx.d.ts +15 -0
  60. package/dist/speech-recognition/speech-recognition-mlx.js +393 -0
  61. package/dist/speech-recognition/speech-recognition-native.d.ts +24 -0
  62. package/dist/speech-recognition/speech-recognition-native.js +632 -0
  63. package/dist/speech-recognition/speech-recognition-openai-native.d.ts +40 -0
  64. package/dist/speech-recognition/speech-recognition-openai-native.js +653 -0
  65. package/dist/speech-recognition/speech-recognition-openai.d.ts +39 -0
  66. package/dist/speech-recognition/speech-recognition-openai.js +718 -0
  67. package/dist/speech-recognition/speech-recognition-unified.d.ts +93 -0
  68. package/dist/speech-recognition/speech-recognition-unified.js +589 -0
  69. package/dist/speech-recognition/utils/groq-transcription.d.ts +41 -0
  70. package/dist/speech-recognition/utils/groq-transcription.js +382 -0
  71. package/dist/speech-recognition.d.ts +7 -0
  72. package/dist/speech-recognition.js +61 -0
  73. package/dist/voice-pipeline-telemetry.d.ts +26 -0
  74. package/dist/voice-pipeline-telemetry.js +15 -0
  75. package/garrix82-reactgenie-lib-1.3.0.tgz +0 -0
  76. package/metro/index.js +3 -0
  77. package/metro/with-genie-registry.js +47 -0
  78. package/package.json +111 -0
  79. package/scripts/dry-run.js +23 -0
  80. package/scripts/generate-genie-registry.js +278 -0
  81. package/scripts/log-file-test.js +51 -0
  82. package/scripts/parse.js +26 -0
  83. package/scripts/prompt.js +19 -0
  84. package/scripts/set-script.js +200 -0
  85. package/tsconfig.json +36 -0
@@ -0,0 +1,589 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createImmutableConstructorParamsSnapshot = createImmutableConstructorParamsSnapshot;
7
+ exports.displayResult = displayResult;
8
+ exports.executeGenieCode = executeGenieCode;
9
+ exports.extractQueryIntentFromAst = extractQueryIntentFromAst;
10
+ exports.resetGenieNavigation = resetGenieNavigation;
11
+ exports.useGenieSelector = exports.useGenieCodeSelector = exports.uiActive = void 0;
12
+ var _modalityProviderV = require("./modality-provider-v2");
13
+ var _reactDecorators = require("./react-decorators");
14
+ var _reactRedux = require("react-redux");
15
+ var _reactgenieDsl = require("@garrix82/reactgenie-dsl");
16
+ var _logger = require("./logger");
17
+ var _errors = require("./errors");
18
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
19
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
20
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
21
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
22
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
23
+ let uiActive = exports.uiActive = true;
24
+ const DEFAULT_RESULT_WINDOW_MAX = 40;
25
+ const DEFAULT_RESULT_WINDOW_TTL_MS = 5 * 60 * 1000;
26
+ function getConstructorParamsFromResultValue(value) {
27
+ if (!value || typeof value._getConstructorParams !== "function") {
28
+ return null;
29
+ }
30
+ return value._getConstructorParams();
31
+ }
32
+ function deepFreezeObject(value) {
33
+ if (!value || typeof value !== "object") {
34
+ return value;
35
+ }
36
+ Object.freeze(value);
37
+ for (const key of Object.keys(value)) {
38
+ const nested = value[key];
39
+ if (nested && typeof nested === "object" && !Object.isFrozen(nested)) {
40
+ deepFreezeObject(nested);
41
+ }
42
+ }
43
+ return value;
44
+ }
45
+ function cloneDetachedValue(value) {
46
+ try {
47
+ const nativeStructuredClone = globalThis.structuredClone;
48
+ const cloned = typeof nativeStructuredClone === "function" ? nativeStructuredClone(value) : JSON.parse(JSON.stringify(value));
49
+ return deepFreezeObject(cloned);
50
+ } catch (error) {
51
+ _logger.logger.warn("[ReactGenie] Unable to clone constructor params for result window snapshot", error);
52
+ return null;
53
+ }
54
+ }
55
+ function createImmutableConstructorParamsSnapshot(value) {
56
+ const constructorParams = getConstructorParamsFromResultValue(value);
57
+ if (!constructorParams || typeof constructorParams !== "object") {
58
+ return null;
59
+ }
60
+ const snapshot = cloneDetachedValue(constructorParams);
61
+ if (!snapshot || typeof snapshot !== "object") {
62
+ return null;
63
+ }
64
+ return snapshot;
65
+ }
66
+ function ensureResultWindowDefaults(state) {
67
+ // `genieDispatch` starts from a shallow copy of the previous state.
68
+ // Clone mutable result-window containers before writes so we don't mutate
69
+ // references from the previous Redux state snapshot.
70
+ state.resultWindowByRef = state.resultWindowByRef ? _objectSpread({}, state.resultWindowByRef) : {};
71
+ state.resultWindowOrder = state.resultWindowOrder ? [...state.resultWindowOrder] : [];
72
+ if (!state.resultWindowMax || state.resultWindowMax <= 0) {
73
+ state.resultWindowMax = DEFAULT_RESULT_WINDOW_MAX;
74
+ }
75
+ if (!state.resultWindowTtlMs || state.resultWindowTtlMs <= 0) {
76
+ state.resultWindowTtlMs = DEFAULT_RESULT_WINDOW_TTL_MS;
77
+ }
78
+ if (!Number.isFinite(state.resultWindowSequence)) {
79
+ state.resultWindowSequence = 0;
80
+ }
81
+ }
82
+ function pruneResultWindow(state, now = Date.now()) {
83
+ ensureResultWindowDefaults(state);
84
+ const minCreatedAt = now - state.resultWindowTtlMs;
85
+ state.resultWindowOrder = state.resultWindowOrder.filter(resultRef => {
86
+ const entry = state.resultWindowByRef[resultRef];
87
+ if (!entry) {
88
+ return false;
89
+ }
90
+ if (entry.createdAt < minCreatedAt) {
91
+ delete state.resultWindowByRef[resultRef];
92
+ return false;
93
+ }
94
+ return true;
95
+ });
96
+ while (state.resultWindowOrder.length > state.resultWindowMax) {
97
+ const oldestRef = state.resultWindowOrder.shift();
98
+ if (!oldestRef) break;
99
+ delete state.resultWindowByRef[oldestRef];
100
+ }
101
+ }
102
+ function putResultWindowEntry(state, entry) {
103
+ ensureResultWindowDefaults(state);
104
+ state.resultWindowSequence += 1;
105
+ const resultRef = `rg-${entry.eventId}-${state.resultWindowSequence}`;
106
+ const createdAt = Date.now();
107
+ const completeEntry = _objectSpread(_objectSpread({}, entry), {}, {
108
+ resultRef,
109
+ createdAt
110
+ });
111
+ state.resultWindowByRef[resultRef] = completeEntry;
112
+ state.resultWindowOrder.push(resultRef);
113
+ pruneResultWindow(state, createdAt);
114
+ return completeEntry;
115
+ }
116
+ function hashString(value) {
117
+ let hash = 0;
118
+ for (let i = 0; i < value.length; i++) {
119
+ hash = (hash << 5) - hash + value.charCodeAt(i);
120
+ hash |= 0;
121
+ }
122
+ return Math.abs(hash).toString(36);
123
+ }
124
+ function accessorFieldToPath(field) {
125
+ if (typeof field === "string") {
126
+ return field;
127
+ }
128
+ if (!field || typeof field !== "object") {
129
+ return null;
130
+ }
131
+ if (field.type === "access") {
132
+ const parent = accessorFieldToPath(field.parent);
133
+ if (!parent || typeof field.access !== "string") {
134
+ return null;
135
+ }
136
+ return `${parent}.${field.access}`;
137
+ }
138
+ return null;
139
+ }
140
+ function astValueToPrimitive(ast) {
141
+ if (!ast || typeof ast !== "object") return undefined;
142
+ if (ast.type === "string" || ast.type === "int" || ast.type === "float" || ast.type === "boolean") {
143
+ return ast.value;
144
+ }
145
+ if (ast.type === "object") {
146
+ if (ast.objectType === "string" || ast.objectType === "number" || ast.objectType === "float" || ast.objectType === "int" || ast.objectType === "boolean" || ast.objectType === "bool") {
147
+ return ast.value;
148
+ }
149
+ }
150
+ return undefined;
151
+ }
152
+ function collectFunctionCalls(ast, calls = []) {
153
+ if (!ast || typeof ast !== "object") {
154
+ return calls;
155
+ }
156
+ if (ast.type === "index") {
157
+ calls.push({
158
+ type: "function_call",
159
+ func_name: "index",
160
+ parameters: [{
161
+ parameter: "index",
162
+ value: {
163
+ type: "int",
164
+ value: ast.index
165
+ }
166
+ }]
167
+ });
168
+ return collectFunctionCalls(ast.parent, calls);
169
+ }
170
+ if (ast.type === "access") {
171
+ if (ast.access && ast.access.type === "function_call") {
172
+ calls.push(ast.access);
173
+ }
174
+ return collectFunctionCalls(ast.parent, calls);
175
+ }
176
+ return calls;
177
+ }
178
+ function getCallParam(call, paramName) {
179
+ if (!call || !Array.isArray(call.parameters)) return undefined;
180
+ const entry = call.parameters.find(param => param.parameter === paramName);
181
+ return entry?.value;
182
+ }
183
+ function extractQueryIntentFromAst(ast) {
184
+ const calls = collectFunctionCalls(ast, []).reverse();
185
+ const ops = [];
186
+ for (const call of calls) {
187
+ const funcName = call?.func_name;
188
+ if (funcName === "matching" || funcName === "contains" || funcName === "equals") {
189
+ const fieldAst = getCallParam(call, "field");
190
+ const valueAst = getCallParam(call, "value");
191
+ const fieldPath = accessorFieldToPath(fieldAst?.field);
192
+ const value = astValueToPrimitive(valueAst);
193
+ if (fieldPath && value !== undefined) {
194
+ ops.push({
195
+ kind: funcName,
196
+ field: fieldPath,
197
+ value
198
+ });
199
+ }
200
+ continue;
201
+ }
202
+ if (funcName === "between") {
203
+ const fieldAst = getCallParam(call, "field");
204
+ const from = astValueToPrimitive(getCallParam(call, "from"));
205
+ const to = astValueToPrimitive(getCallParam(call, "to"));
206
+ const fieldPath = accessorFieldToPath(fieldAst?.field);
207
+ if (fieldPath && (from !== undefined || to !== undefined)) {
208
+ ops.push(_objectSpread(_objectSpread({
209
+ kind: "between",
210
+ field: fieldPath
211
+ }, from !== undefined ? {
212
+ from
213
+ } : {}), to !== undefined ? {
214
+ to
215
+ } : {}));
216
+ }
217
+ continue;
218
+ }
219
+ if (funcName === "sort") {
220
+ const fieldAst = getCallParam(call, "field");
221
+ const ascending = astValueToPrimitive(getCallParam(call, "ascending"));
222
+ const fieldPath = accessorFieldToPath(fieldAst?.field);
223
+ if (fieldPath) {
224
+ ops.push({
225
+ kind: "sort",
226
+ field: fieldPath,
227
+ ascending: ascending === undefined ? true : Boolean(ascending)
228
+ });
229
+ }
230
+ continue;
231
+ }
232
+ if (funcName === "index") {
233
+ const index = astValueToPrimitive(getCallParam(call, "index"));
234
+ if (typeof index === "number") {
235
+ ops.push({
236
+ kind: "index",
237
+ value: index
238
+ });
239
+ }
240
+ continue;
241
+ }
242
+ if (funcName === "length") {
243
+ ops.push({
244
+ kind: "length"
245
+ });
246
+ }
247
+ }
248
+ if (ops.length === 0) return null;
249
+ const serialized = JSON.stringify(ops);
250
+ return {
251
+ ops,
252
+ hash: hashString(serialized)
253
+ };
254
+ }
255
+ const useGenieCodeSelector = command => {
256
+ return async state => {
257
+ exports.uiActive = uiActive = false;
258
+ (0, _reactgenieDsl.setSharedState)(state);
259
+ const result = await _modalityProviderV.GenieInterpreter.dslInterpreter.interpret(command);
260
+ // logger.info(`executed result ${result}`);
261
+ // logger.info(`after executing state ${JSON.stringify(state)}`);
262
+ exports.uiActive = uiActive = true;
263
+ return result;
264
+ };
265
+ };
266
+ exports.useGenieCodeSelector = useGenieCodeSelector;
267
+ const shallowEqualWithArray = (left, right) => {
268
+ if (Array.isArray(left) && Array.isArray(right)) {
269
+ if (left.length !== right.length) {
270
+ return false;
271
+ }
272
+ for (let i = 0; i < left.length; i++) {
273
+ if (!shallowEqualWithArray(left[i], right[i])) {
274
+ return false;
275
+ }
276
+ }
277
+ return true;
278
+ } else {
279
+ return (0, _reactRedux.shallowEqual)(left, right);
280
+ }
281
+ };
282
+ const convertGenieClassToState = obj => {
283
+ if (Array.isArray(obj)) {
284
+ return obj.map(element => convertGenieClassToState(element));
285
+ } else if (obj === null || obj === undefined || obj.constructor === undefined) {
286
+ return obj;
287
+ } else if (obj.constructor.prototype instanceof _reactgenieDsl.GenieObject) {
288
+ if (obj.constructor.prototype instanceof _reactgenieDsl.DataClass) {
289
+ return _objectSpread({
290
+ __genieObjectType: "DataClass",
291
+ __genieObjectClass: obj.constructor.name,
292
+ __genieObjectKey: obj[obj.genieKey]
293
+ }, obj.__getState());
294
+ } else if (obj.constructor.prototype instanceof _reactgenieDsl.HelperClass) {
295
+ return _objectSpread({
296
+ __genieObjectType: "HelperClass",
297
+ __genieObjectClass: obj.constructor.name
298
+ }, obj.localStore);
299
+ }
300
+ throw new Error("Unknown GenieObject type");
301
+ } else {
302
+ return obj;
303
+ }
304
+ };
305
+ const useGenieSelector = selector => {
306
+ let selectorResult = undefined;
307
+ (0, _reactRedux.useSelector)(state => {
308
+ (0, _reactgenieDsl.setSharedState)(state);
309
+ selectorResult = selector(state);
310
+ return convertGenieClassToState(selectorResult);
311
+ }, shallowEqualWithArray);
312
+ return selectorResult;
313
+ };
314
+ exports.useGenieSelector = useGenieSelector;
315
+ const RESULT_PREVIEW_MAX_LENGTH = 160;
316
+ function truncateText(value, maxLength) {
317
+ if (value.length <= maxLength) {
318
+ return value;
319
+ }
320
+ return `${value.slice(0, Math.max(0, maxLength - 1)).trimEnd()}…`;
321
+ }
322
+ function createSystemMessage(minimalText, fullText, type = "info", shouldSpeak = false, origin = "system") {
323
+ return {
324
+ minimalText,
325
+ fullText,
326
+ type,
327
+ shouldSpeak,
328
+ origin,
329
+ message: fullText
330
+ };
331
+ }
332
+ function createUserFacingMessage(error, origin, shouldSpeakByDefault) {
333
+ return {
334
+ minimalText: error.minimalText,
335
+ fullText: error.fullText,
336
+ type: error.type,
337
+ shouldSpeak: error.shouldSpeak ?? shouldSpeakByDefault,
338
+ origin,
339
+ message: error.fullText
340
+ };
341
+ }
342
+ function safeSerializeValue(value) {
343
+ if (value === null || value === undefined) {
344
+ return "none";
345
+ }
346
+ const serialized = String(value);
347
+ return truncateText(serialized, RESULT_PREVIEW_MAX_LENGTH);
348
+ }
349
+ function buildResultDigest(result, parsed) {
350
+ if (!result || typeof result !== "object") {
351
+ return {
352
+ parsed,
353
+ status: "unknown",
354
+ resultType: "unknown"
355
+ };
356
+ }
357
+ if (result.type === "array") {
358
+ const values = Array.isArray(result.value) ? result.value : [];
359
+ const first = values.length > 0 ? values[0] : null;
360
+ const firstObjectType = first?.objectType || null;
361
+ const firstPreview = first && first.type === "object" ? safeSerializeValue(first.value) : null;
362
+ return {
363
+ parsed,
364
+ status: "ok",
365
+ resultType: "array",
366
+ count: values.length,
367
+ firstObjectType,
368
+ firstPreview
369
+ };
370
+ }
371
+ if (result.type === "object") {
372
+ return {
373
+ parsed,
374
+ status: "ok",
375
+ resultType: "object",
376
+ objectType: result.objectType || "unknown",
377
+ preview: safeSerializeValue(result.value)
378
+ };
379
+ }
380
+ return {
381
+ parsed,
382
+ status: "ok",
383
+ resultType: "unknown"
384
+ };
385
+ }
386
+ async function executeGenieCode(command, options = {}) {
387
+ const sanitized = typeof command === "string" ? command.trim() : "";
388
+ const messageOrigin = options.origin ?? "system";
389
+ const shouldSpeakErrors = Boolean(options.shouldSpeakErrors);
390
+ // logger.info(`executing command : ${sanitized}`);
391
+
392
+ if (!sanitized) {
393
+ (0, _reactgenieDsl.genieDispatch)(() => {
394
+ const reactGenieState = _reactgenieDsl.sharedState;
395
+ reactGenieState.message = createSystemMessage("No actionable command.", "I heard you, but there is no actionable command to run.", "info", shouldSpeakErrors, messageOrigin);
396
+ });
397
+ return {
398
+ success: false,
399
+ results: [new Error("No actionable command")]
400
+ };
401
+ }
402
+
403
+ // Guard against GenieInterpreter not being initialized
404
+ if (!_modalityProviderV.GenieInterpreter || !_modalityProviderV.GenieInterpreter.dslInterpreter) {
405
+ _logger.logger.error('GenieInterpreter is not initialized');
406
+ (0, _reactgenieDsl.genieDispatch)(() => {
407
+ const reactGenieState = _reactgenieDsl.sharedState;
408
+ reactGenieState.message = createSystemMessage("System not ready.", "System not ready. Please try again.", "error", shouldSpeakErrors, messageOrigin);
409
+ });
410
+ return {
411
+ success: false,
412
+ results: [new Error('GenieInterpreter not initialized')]
413
+ };
414
+ }
415
+ try {
416
+ const result = await _modalityProviderV.GenieInterpreter.dslInterpreter.interpretSteps(sanitized);
417
+ // console.log(`executed result ${result}`);
418
+ return {
419
+ success: true,
420
+ results: result
421
+ };
422
+ } catch (e) {
423
+ _logger.logger.error('error executing command:', sanitized, e);
424
+ (0, _reactgenieDsl.genieDispatch)(() => {
425
+ const reactGenieState = _reactgenieDsl.sharedState;
426
+ reactGenieState.message = (0, _errors.isGenieUserFacingError)(e) ? createUserFacingMessage(e, messageOrigin, shouldSpeakErrors) : createSystemMessage("I could not process that.", "Sorry, I don't understand...", "error", shouldSpeakErrors, messageOrigin);
427
+ });
428
+ return {
429
+ success: false,
430
+ results: [e]
431
+ };
432
+ }
433
+ }
434
+ function displayResult(executionResult, transcript, parsed, genieInterfaces) {
435
+ (0, _reactgenieDsl.genieDispatch)(() => {
436
+ let allDisplayingObjects = [];
437
+ let displayingObject = null;
438
+ let displayingObjectType = "";
439
+ const statementResult = executionResult.results[0];
440
+ const statementAst = statementResult?.ast;
441
+ const resultSteps = statementResult["steps"];
442
+ const queryIntent = extractQueryIntentFromAst(statementAst);
443
+ let lastResult = true;
444
+ for (let i = resultSteps.length - 1; i >= 0; i--) {
445
+ if (i != resultSteps.length - 1) {
446
+ lastResult = false;
447
+ }
448
+ const step = resultSteps[i];
449
+ allDisplayingObjects = [];
450
+ // console.log(`last executed step ${JSON.stringify(step)}`);
451
+ const stepResult = step.result;
452
+ if (stepResult.type === "object") {
453
+ allDisplayingObjects.push(stepResult);
454
+ } else if (stepResult.type === "array") {
455
+ for (const element of stepResult.value) {
456
+ allDisplayingObjects.push(element);
457
+ }
458
+ }
459
+ const primaryValue = allDisplayingObjects.length > 0 ? allDisplayingObjects[0].value : null;
460
+ // check if object can be displayed
461
+ if (allDisplayingObjects.length === 1) {
462
+ displayingObjectType = allDisplayingObjects[0].objectType;
463
+ displayingObject = allDisplayingObjects[0];
464
+ if (primaryValue && Object.hasOwn(allDisplayingObjects[0], "value") && Object.hasOwn(primaryValue, "localStore") && allDisplayingObjects[0].value.localStore.__genieObjectType === "HelperClass") {
465
+ displayingObjectType = "undefined";
466
+ displayingObject = null;
467
+ }
468
+ } else if (allDisplayingObjects.length > 1) {
469
+ displayingObjectType = allDisplayingObjects[0].objectType + "[]";
470
+ displayingObject = allDisplayingObjects;
471
+ if (primaryValue && Object.hasOwn(allDisplayingObjects[0], "value") && Object.hasOwn(primaryValue, "localStore") && allDisplayingObjects[0].value.localStore.__genieObjectType === "HelperClass") {
472
+ displayingObjectType = "undefined";
473
+ displayingObject = null;
474
+ }
475
+ } else if (allDisplayingObjects.length === 0) {
476
+ displayingObjectType = "undefined";
477
+ displayingObject = null;
478
+ }
479
+ // if displayingObjectType in the keys of AllGenieObjectInterfaces
480
+ if (_reactDecorators.AllGenieObjectInterfaces.supportedTypes.has(displayingObjectType)) {
481
+ break;
482
+ }
483
+ }
484
+ let cannotdisplay = false;
485
+ let onScreen = true;
486
+ let instantiatedDisplayingObject = null;
487
+ if (displayingObject != null) {
488
+ // if displayingObject is an array
489
+ if (displayingObject instanceof Array) {
490
+ // always display
491
+ onScreen = false;
492
+ instantiatedDisplayingObject = [];
493
+ for (const element of displayingObject) {
494
+ const Instance = (0, _reactDecorators.InstantiateGenieObject)({
495
+ className: element.objectType,
496
+ key: element.value
497
+ });
498
+ if (Instance === undefined) {
499
+ cannotdisplay = true;
500
+ break;
501
+ }
502
+ instantiatedDisplayingObject.push(Instance);
503
+ }
504
+ } else {
505
+ const Instance = (0, _reactDecorators.InstantiateGenieObject)({
506
+ className: displayingObject.objectType,
507
+ key: displayingObject.value
508
+ });
509
+ if (Instance === undefined) cannotdisplay = true;else {
510
+ if (lastResult) {
511
+ // always display
512
+ onScreen = false;
513
+ } else {
514
+ // check if displayingObjects is on screen already
515
+ const targetInterface = genieInterfaces.find(genieInterface => genieInterface.className === Instance.constructor.name && (0, _reactRedux.shallowEqual)(genieInterface.key, Instance._getConstructorParams()));
516
+ if (!targetInterface) {
517
+ onScreen = false;
518
+ }
519
+ }
520
+ instantiatedDisplayingObject = Instance;
521
+ }
522
+ }
523
+ }
524
+ _modalityProviderV.GenieInterpreter.nlParser.respond(transcript, parsed, JSON.stringify(buildResultDigest(
525
+ // now we only display the last result
526
+ executionResult.results[executionResult.results.length - 1].result, parsed))).then(result => {
527
+ console.log(`respond result: ${result}`);
528
+ (0, _reactgenieDsl.genieDispatch)(() => {
529
+ const reactGenieState = _reactgenieDsl.sharedState;
530
+ if (result !== null) {
531
+ reactGenieState.message = _objectSpread(_objectSpread({}, result), {}, {
532
+ origin: "voice",
533
+ message: result.fullText
534
+ });
535
+ }
536
+ let resultEntry = null;
537
+ if (!cannotdisplay && allDisplayingObjects.length > 0) {
538
+ const orderedConstructorParams = allDisplayingObjects.map(displayingObject => createImmutableConstructorParamsSnapshot(displayingObject.value)).filter(params => params !== null && typeof params === "object");
539
+ if (orderedConstructorParams.length > 0 && displayingObjectType) {
540
+ const predictedEventId = reactGenieState.navStack + 1;
541
+ resultEntry = putResultWindowEntry(reactGenieState, {
542
+ eventId: predictedEventId,
543
+ resultObjectType: displayingObjectType,
544
+ orderedConstructorParams
545
+ });
546
+ }
547
+ }
548
+ if (!onScreen && !cannotdisplay) {
549
+ reactGenieState.navState = {
550
+ objectViewClassName: _reactDecorators.AllGenieObjectInterfaces.getInterfaces(instantiatedDisplayingObject).viewClassName,
551
+ objectConstructorParams: allDisplayingObjects.length === 1 ? allDisplayingObjects[0].value._getConstructorParams() : {
552
+ elements: allDisplayingObjects.map(displayingObject => displayingObject.value._getConstructorParams())
553
+ },
554
+ queryIntent,
555
+ resultRef: resultEntry?.resultRef ?? null,
556
+ resultObjectType: displayingObjectType || null
557
+ };
558
+ reactGenieState.navStack += 1;
559
+ }
560
+ });
561
+ }).catch(error => {
562
+ _logger.logger.error('error generating response:', error);
563
+ (0, _reactgenieDsl.genieDispatch)(() => {
564
+ const reactGenieState = _reactgenieDsl.sharedState;
565
+ reactGenieState.message = createSystemMessage("Done.", "Done.", "info", false);
566
+ });
567
+ });
568
+
569
+ // console.log(`after executing state ${JSON.stringify(sharedState)}`);
570
+ });
571
+ }
572
+
573
+ /**
574
+ * Reset navigation state to prevent infinite navigation loops
575
+ * Call this after intercepting and handling navigation in expo-router
576
+ */
577
+ function resetGenieNavigation() {
578
+ (0, _reactgenieDsl.genieDispatch)(() => {
579
+ const reactGenieState = _reactgenieDsl.sharedState;
580
+ reactGenieState.navState = {
581
+ objectViewClassName: null,
582
+ objectConstructorParams: null,
583
+ queryIntent: null,
584
+ resultRef: null,
585
+ resultObjectType: null
586
+ };
587
+ });
588
+ }
589
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9kYWxpdHlQcm92aWRlclYiLCJyZXF1aXJlIiwiX3JlYWN0RGVjb3JhdG9ycyIsIl9yZWFjdFJlZHV4IiwiX3JlYWN0Z2VuaWVEc2wiLCJfbG9nZ2VyIiwiX2Vycm9ycyIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJfdG9Qcm9wZXJ0eUtleSIsInZhbHVlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJpIiwiX3RvUHJpbWl0aXZlIiwiU3ltYm9sIiwidG9QcmltaXRpdmUiLCJjYWxsIiwiVHlwZUVycm9yIiwiU3RyaW5nIiwiTnVtYmVyIiwidWlBY3RpdmUiLCJleHBvcnRzIiwiREVGQVVMVF9SRVNVTFRfV0lORE9XX01BWCIsIkRFRkFVTFRfUkVTVUxUX1dJTkRPV19UVExfTVMiLCJnZXRDb25zdHJ1Y3RvclBhcmFtc0Zyb21SZXN1bHRWYWx1ZSIsIl9nZXRDb25zdHJ1Y3RvclBhcmFtcyIsImRlZXBGcmVlemVPYmplY3QiLCJmcmVlemUiLCJrZXkiLCJuZXN0ZWQiLCJpc0Zyb3plbiIsImNsb25lRGV0YWNoZWRWYWx1ZSIsIm5hdGl2ZVN0cnVjdHVyZWRDbG9uZSIsImdsb2JhbFRoaXMiLCJzdHJ1Y3R1cmVkQ2xvbmUiLCJjbG9uZWQiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJlcnJvciIsImxvZ2dlciIsIndhcm4iLCJjcmVhdGVJbW11dGFibGVDb25zdHJ1Y3RvclBhcmFtc1NuYXBzaG90IiwiY29uc3RydWN0b3JQYXJhbXMiLCJzbmFwc2hvdCIsImVuc3VyZVJlc3VsdFdpbmRvd0RlZmF1bHRzIiwic3RhdGUiLCJyZXN1bHRXaW5kb3dCeVJlZiIsInJlc3VsdFdpbmRvd09yZGVyIiwicmVzdWx0V2luZG93TWF4IiwicmVzdWx0V2luZG93VHRsTXMiLCJpc0Zpbml0ZSIsInJlc3VsdFdpbmRvd1NlcXVlbmNlIiwicHJ1bmVSZXN1bHRXaW5kb3ciLCJub3ciLCJEYXRlIiwibWluQ3JlYXRlZEF0IiwicmVzdWx0UmVmIiwiZW50cnkiLCJjcmVhdGVkQXQiLCJvbGRlc3RSZWYiLCJzaGlmdCIsInB1dFJlc3VsdFdpbmRvd0VudHJ5IiwiZXZlbnRJZCIsImNvbXBsZXRlRW50cnkiLCJoYXNoU3RyaW5nIiwiaGFzaCIsImNoYXJDb2RlQXQiLCJNYXRoIiwiYWJzIiwidG9TdHJpbmciLCJhY2Nlc3NvckZpZWxkVG9QYXRoIiwiZmllbGQiLCJ0eXBlIiwicGFyZW50IiwiYWNjZXNzIiwiYXN0VmFsdWVUb1ByaW1pdGl2ZSIsImFzdCIsInVuZGVmaW5lZCIsIm9iamVjdFR5cGUiLCJjb2xsZWN0RnVuY3Rpb25DYWxscyIsImNhbGxzIiwiZnVuY19uYW1lIiwicGFyYW1ldGVycyIsInBhcmFtZXRlciIsImluZGV4IiwiZ2V0Q2FsbFBhcmFtIiwicGFyYW1OYW1lIiwiQXJyYXkiLCJpc0FycmF5IiwiZmluZCIsInBhcmFtIiwiZXh0cmFjdFF1ZXJ5SW50ZW50RnJvbUFzdCIsInJldmVyc2UiLCJvcHMiLCJmdW5jTmFtZSIsImZpZWxkQXN0IiwidmFsdWVBc3QiLCJmaWVsZFBhdGgiLCJraW5kIiwiZnJvbSIsInRvIiwiYXNjZW5kaW5nIiwiQm9vbGVhbiIsInNlcmlhbGl6ZWQiLCJ1c2VHZW5pZUNvZGVTZWxlY3RvciIsImNvbW1hbmQiLCJzZXRTaGFyZWRTdGF0ZSIsInJlc3VsdCIsIkdlbmllSW50ZXJwcmV0ZXIiLCJkc2xJbnRlcnByZXRlciIsImludGVycHJldCIsInNoYWxsb3dFcXVhbFdpdGhBcnJheSIsImxlZnQiLCJyaWdodCIsInNoYWxsb3dFcXVhbCIsImNvbnZlcnRHZW5pZUNsYXNzVG9TdGF0ZSIsIm9iaiIsIm1hcCIsImVsZW1lbnQiLCJjb25zdHJ1Y3RvciIsInByb3RvdHlwZSIsIkdlbmllT2JqZWN0IiwiRGF0YUNsYXNzIiwiX19nZW5pZU9iamVjdFR5cGUiLCJfX2dlbmllT2JqZWN0Q2xhc3MiLCJuYW1lIiwiX19nZW5pZU9iamVjdEtleSIsImdlbmllS2V5IiwiX19nZXRTdGF0ZSIsIkhlbHBlckNsYXNzIiwibG9jYWxTdG9yZSIsIkVycm9yIiwidXNlR2VuaWVTZWxlY3RvciIsInNlbGVjdG9yIiwic2VsZWN0b3JSZXN1bHQiLCJ1c2VTZWxlY3RvciIsIlJFU1VMVF9QUkVWSUVXX01BWF9MRU5HVEgiLCJ0cnVuY2F0ZVRleHQiLCJtYXhMZW5ndGgiLCJzbGljZSIsIm1heCIsInRyaW1FbmQiLCJjcmVhdGVTeXN0ZW1NZXNzYWdlIiwibWluaW1hbFRleHQiLCJmdWxsVGV4dCIsInNob3VsZFNwZWFrIiwib3JpZ2luIiwibWVzc2FnZSIsImNyZWF0ZVVzZXJGYWNpbmdNZXNzYWdlIiwic2hvdWxkU3BlYWtCeURlZmF1bHQiLCJzYWZlU2VyaWFsaXplVmFsdWUiLCJidWlsZFJlc3VsdERpZ2VzdCIsInBhcnNlZCIsInN0YXR1cyIsInJlc3VsdFR5cGUiLCJ2YWx1ZXMiLCJmaXJzdCIsImZpcnN0T2JqZWN0VHlwZSIsImZpcnN0UHJldmlldyIsImNvdW50IiwicHJldmlldyIsImV4ZWN1dGVHZW5pZUNvZGUiLCJvcHRpb25zIiwic2FuaXRpemVkIiwidHJpbSIsIm1lc3NhZ2VPcmlnaW4iLCJzaG91bGRTcGVha0Vycm9ycyIsImdlbmllRGlzcGF0Y2giLCJyZWFjdEdlbmllU3RhdGUiLCJzaGFyZWRTdGF0ZSIsInN1Y2Nlc3MiLCJyZXN1bHRzIiwiaW50ZXJwcmV0U3RlcHMiLCJpc0dlbmllVXNlckZhY2luZ0Vycm9yIiwiZGlzcGxheVJlc3VsdCIsImV4ZWN1dGlvblJlc3VsdCIsInRyYW5zY3JpcHQiLCJnZW5pZUludGVyZmFjZXMiLCJhbGxEaXNwbGF5aW5nT2JqZWN0cyIsImRpc3BsYXlpbmdPYmplY3QiLCJkaXNwbGF5aW5nT2JqZWN0VHlwZSIsInN0YXRlbWVudFJlc3VsdCIsInN0YXRlbWVudEFzdCIsInJlc3VsdFN0ZXBzIiwicXVlcnlJbnRlbnQiLCJsYXN0UmVzdWx0Iiwic3RlcCIsInN0ZXBSZXN1bHQiLCJwcmltYXJ5VmFsdWUiLCJoYXNPd24iLCJBbGxHZW5pZU9iamVjdEludGVyZmFjZXMiLCJzdXBwb3J0ZWRUeXBlcyIsImhhcyIsImNhbm5vdGRpc3BsYXkiLCJvblNjcmVlbiIsImluc3RhbnRpYXRlZERpc3BsYXlpbmdPYmplY3QiLCJJbnN0YW5jZSIsIkluc3RhbnRpYXRlR2VuaWVPYmplY3QiLCJjbGFzc05hbWUiLCJ0YXJnZXRJbnRlcmZhY2UiLCJnZW5pZUludGVyZmFjZSIsIm5sUGFyc2VyIiwicmVzcG9uZCIsInRoZW4iLCJjb25zb2xlIiwibG9nIiwicmVzdWx0RW50cnkiLCJvcmRlcmVkQ29uc3RydWN0b3JQYXJhbXMiLCJwYXJhbXMiLCJwcmVkaWN0ZWRFdmVudElkIiwibmF2U3RhY2siLCJyZXN1bHRPYmplY3RUeXBlIiwibmF2U3RhdGUiLCJvYmplY3RWaWV3Q2xhc3NOYW1lIiwiZ2V0SW50ZXJmYWNlcyIsInZpZXdDbGFzc05hbWUiLCJvYmplY3RDb25zdHJ1Y3RvclBhcmFtcyIsImVsZW1lbnRzIiwiY2F0Y2giLCJyZXNldEdlbmllTmF2aWdhdGlvbiJdLCJzb3VyY2VzIjpbIi4uL3NyYy9zaGFyZWQtc3RvcmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR2VuaWVJbnRlcnByZXRlciB9IGZyb20gXCIuL21vZGFsaXR5LXByb3ZpZGVyLXYyXCI7XG5pbXBvcnQge1xuICBBbGxHZW5pZU9iamVjdEludGVyZmFjZXMsXG4gIEdlbmllSW50ZXJmYWNlU3BlYyxcbiAgSW5zdGFudGlhdGVHZW5pZU9iamVjdCxcbn0gZnJvbSBcIi4vcmVhY3QtZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgc2hhbGxvd0VxdWFsLCB1c2VTZWxlY3RvciB9IGZyb20gXCJyZWFjdC1yZWR1eFwiO1xuaW1wb3J0IHtcbiAgRGF0YUNsYXNzLFxuICBHZW5pZU9iamVjdCxcbiAgSGVscGVyQ2xhc3MsXG4gIHNldFNoYXJlZFN0YXRlLFxufSBmcm9tIFwiQGdhcnJpeDgyL3JlYWN0Z2VuaWUtZHNsXCI7XG5pbXBvcnQgeyBnZW5pZURpc3BhdGNoLCBzaGFyZWRTdGF0ZSB9IGZyb20gXCJAZ2Fycml4ODIvcmVhY3RnZW5pZS1kc2xcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuL2xvZ2dlclwiO1xuaW1wb3J0IHsgR2VuaWVVc2VyRmFjaW5nRXJyb3IsIGlzR2VuaWVVc2VyRmFjaW5nRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcblxuZXhwb3J0IHR5cGUgUmVhY3RHZW5pZVN0YXRlID0ge1xuICBtZXNzYWdlOiBSZWFjdEdlbmllTWVzc2FnZTtcbiAgbmF2U3RhdGU6IE5hdmlnYXRvclN0YXRlO1xuICBuYXZTdGFjazogbnVtYmVyO1xuICByZXN1bHRXaW5kb3dCeVJlZjogUmVjb3JkPHN0cmluZywgUmVzdWx0V2luZG93RW50cnk+O1xuICByZXN1bHRXaW5kb3dPcmRlcjogc3RyaW5nW107XG4gIHJlc3VsdFdpbmRvd01heDogbnVtYmVyO1xuICByZXN1bHRXaW5kb3dUdGxNczogbnVtYmVyO1xuICByZXN1bHRXaW5kb3dTZXF1ZW5jZTogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgUmVhY3RHZW5pZU1lc3NhZ2UgPSBBZ2VudFJlc3BvbnNlUGF5bG9hZCAmIHtcbiAgb3JpZ2luOiBcInZvaWNlXCIgfCBcInN5c3RlbVwiO1xuICBtZXNzYWdlPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgUXVlcnlJbnRlbnRPcGVyYXRpb24gPVxuICB8IHtcbiAgICAgIGtpbmQ6IFwibWF0Y2hpbmdcIiB8IFwiY29udGFpbnNcIiB8IFwiZXF1YWxzXCI7XG4gICAgICBmaWVsZDogc3RyaW5nO1xuICAgICAgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XG4gICAgfVxuICB8IHtcbiAgICAgIGtpbmQ6IFwiYmV0d2VlblwiO1xuICAgICAgZmllbGQ6IHN0cmluZztcbiAgICAgIGZyb20/OiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuICAgICAgdG8/OiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuICAgIH1cbiAgfCB7XG4gICAgICBraW5kOiBcInNvcnRcIjtcbiAgICAgIGZpZWxkOiBzdHJpbmc7XG4gICAgICBhc2NlbmRpbmc6IGJvb2xlYW47XG4gICAgfVxuICB8IHtcbiAgICAgIGtpbmQ6IFwiaW5kZXhcIjtcbiAgICAgIHZhbHVlOiBudW1iZXI7XG4gICAgfVxuICB8IHtcbiAgICAgIGtpbmQ6IFwibGVuZ3RoXCI7XG4gICAgfTtcblxuZXhwb3J0IHR5cGUgUXVlcnlJbnRlbnQgPSB7XG4gIG9wczogUXVlcnlJbnRlbnRPcGVyYXRpb25bXTtcbiAgaGFzaDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgUmVzdWx0V2luZG93RW50cnkgPSB7XG4gIHJlc3VsdFJlZjogc3RyaW5nO1xuICBldmVudElkOiBudW1iZXI7XG4gIHJlc3VsdE9iamVjdFR5cGU6IHN0cmluZztcbiAgb3JkZXJlZENvbnN0cnVjdG9yUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W107XG4gIGNyZWF0ZWRBdDogbnVtYmVyO1xufTtcblxudHlwZSBBZ2VudFJlc3BvbnNlUGF5bG9hZCA9IHtcbiAgbWluaW1hbFRleHQ6IHN0cmluZztcbiAgZnVsbFRleHQ6IHN0cmluZztcbiAgdHlwZTogXCJpbmZvXCIgfCBcImVycm9yXCIgfCBcInN1Y2Nlc3NcIiB8IFwid2FybmluZ1wiO1xuICBzaG91bGRTcGVhazogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBsZXQgdWlBY3RpdmUgPSB0cnVlO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5hdmlnYXRvclN0YXRlIHtcbiAgb2JqZWN0Vmlld0NsYXNzTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgb2JqZWN0Q29uc3RydWN0b3JQYXJhbXM6IGFueTtcbiAgcXVlcnlJbnRlbnQ/OiBRdWVyeUludGVudCB8IG51bGw7XG4gIHJlc3VsdFJlZj86IHN0cmluZyB8IG51bGw7XG4gIHJlc3VsdE9iamVjdFR5cGU/OiBzdHJpbmcgfCBudWxsO1xufVxuXG5jb25zdCBERUZBVUxUX1JFU1VMVF9XSU5ET1dfTUFYID0gNDA7XG5jb25zdCBERUZBVUxUX1JFU1VMVF9XSU5ET1dfVFRMX01TID0gNSAqIDYwICogMTAwMDtcblxuZnVuY3Rpb24gZ2V0Q29uc3RydWN0b3JQYXJhbXNGcm9tUmVzdWx0VmFsdWUodmFsdWU6IGFueSk6IGFueSB8IG51bGwge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZS5fZ2V0Q29uc3RydWN0b3JQYXJhbXMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB2YWx1ZS5fZ2V0Q29uc3RydWN0b3JQYXJhbXMoKTtcbn1cblxuZnVuY3Rpb24gZGVlcEZyZWV6ZU9iamVjdDxUPih2YWx1ZTogVCk6IFQge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBPYmplY3QuZnJlZXplKHZhbHVlKTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUgYXMgYW55KSkge1xuICAgIGNvbnN0IG5lc3RlZCA9ICh2YWx1ZSBhcyBhbnkpW2tleV07XG4gICAgaWYgKG5lc3RlZCAmJiB0eXBlb2YgbmVzdGVkID09PSBcIm9iamVjdFwiICYmICFPYmplY3QuaXNGcm96ZW4obmVzdGVkKSkge1xuICAgICAgZGVlcEZyZWV6ZU9iamVjdChuZXN0ZWQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNsb25lRGV0YWNoZWRWYWx1ZTxUPih2YWx1ZTogVCk6IFQgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBuYXRpdmVTdHJ1Y3R1cmVkQ2xvbmUgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLnN0cnVjdHVyZWRDbG9uZTtcbiAgICBjb25zdCBjbG9uZWQgPVxuICAgICAgdHlwZW9mIG5hdGl2ZVN0cnVjdHVyZWRDbG9uZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gbmF0aXZlU3RydWN0dXJlZENsb25lKHZhbHVlKVxuICAgICAgICA6IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICByZXR1cm4gZGVlcEZyZWV6ZU9iamVjdChjbG9uZWQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgXCJbUmVhY3RHZW5pZV0gVW5hYmxlIHRvIGNsb25lIGNvbnN0cnVjdG9yIHBhcmFtcyBmb3IgcmVzdWx0IHdpbmRvdyBzbmFwc2hvdFwiLFxuICAgICAgZXJyb3IsXG4gICAgKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW1tdXRhYmxlQ29uc3RydWN0b3JQYXJhbXNTbmFwc2hvdChcbiAgdmFsdWU6IGFueSxcbik6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsIHtcbiAgY29uc3QgY29uc3RydWN0b3JQYXJhbXMgPSBnZXRDb25zdHJ1Y3RvclBhcmFtc0Zyb21SZXN1bHRWYWx1ZSh2YWx1ZSk7XG4gIGlmICghY29uc3RydWN0b3JQYXJhbXMgfHwgdHlwZW9mIGNvbnN0cnVjdG9yUGFyYW1zICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qgc25hcHNob3QgPSBjbG9uZURldGFjaGVkVmFsdWUoY29uc3RydWN0b3JQYXJhbXMpO1xuICBpZiAoIXNuYXBzaG90IHx8IHR5cGVvZiBzbmFwc2hvdCAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBzbmFwc2hvdCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG5mdW5jdGlvbiBlbnN1cmVSZXN1bHRXaW5kb3dEZWZhdWx0cyhzdGF0ZTogUmVhY3RHZW5pZVN0YXRlKSB7XG4gIC8vIGBnZW5pZURpc3BhdGNoYCBzdGFydHMgZnJvbSBhIHNoYWxsb3cgY29weSBvZiB0aGUgcHJldmlvdXMgc3RhdGUuXG4gIC8vIENsb25lIG11dGFibGUgcmVzdWx0LXdpbmRvdyBjb250YWluZXJzIGJlZm9yZSB3cml0ZXMgc28gd2UgZG9uJ3QgbXV0YXRlXG4gIC8vIHJlZmVyZW5jZXMgZnJvbSB0aGUgcHJldmlvdXMgUmVkdXggc3RhdGUgc25hcHNob3QuXG4gIHN0YXRlLnJlc3VsdFdpbmRvd0J5UmVmID0gc3RhdGUucmVzdWx0V2luZG93QnlSZWZcbiAgICA/IHsgLi4uc3RhdGUucmVzdWx0V2luZG93QnlSZWYgfVxuICAgIDoge307XG4gIHN0YXRlLnJlc3VsdFdpbmRvd09yZGVyID0gc3RhdGUucmVzdWx0V2luZG93T3JkZXJcbiAgICA/IFsuLi5zdGF0ZS5yZXN1bHRXaW5kb3dPcmRlcl1cbiAgICA6IFtdO1xuICBpZiAoIXN0YXRlLnJlc3VsdFdpbmRvd01heCB8fCBzdGF0ZS5yZXN1bHRXaW5kb3dNYXggPD0gMCkge1xuICAgIHN0YXRlLnJlc3VsdFdpbmRvd01heCA9IERFRkFVTFRfUkVTVUxUX1dJTkRPV19NQVg7XG4gIH1cbiAgaWYgKCFzdGF0ZS5yZXN1bHRXaW5kb3dUdGxNcyB8fCBzdGF0ZS5yZXN1bHRXaW5kb3dUdGxNcyA8PSAwKSB7XG4gICAgc3RhdGUucmVzdWx0V2luZG93VHRsTXMgPSBERUZBVUxUX1JFU1VMVF9XSU5ET1dfVFRMX01TO1xuICB9XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHN0YXRlLnJlc3VsdFdpbmRvd1NlcXVlbmNlKSkge1xuICAgIHN0YXRlLnJlc3VsdFdpbmRvd1NlcXVlbmNlID0gMDtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcnVuZVJlc3VsdFdpbmRvdyhzdGF0ZTogUmVhY3RHZW5pZVN0YXRlLCBub3cgPSBEYXRlLm5vdygpKSB7XG4gIGVuc3VyZVJlc3VsdFdpbmRvd0RlZmF1bHRzKHN0YXRlKTtcbiAgY29uc3QgbWluQ3JlYXRlZEF0ID0gbm93IC0gc3RhdGUucmVzdWx0V2luZG93VHRsTXM7XG4gIHN0YXRlLnJlc3VsdFdpbmRvd09yZGVyID0gc3RhdGUucmVzdWx0V2luZG93T3JkZXIuZmlsdGVyKChyZXN1bHRSZWYpID0+IHtcbiAgICBjb25zdCBlbnRyeSA9IHN0YXRlLnJlc3VsdFdpbmRvd0J5UmVmW3Jlc3VsdFJlZl07XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZW50cnkuY3JlYXRlZEF0IDwgbWluQ3JlYXRlZEF0KSB7XG4gICAgICBkZWxldGUgc3RhdGUucmVzdWx0V2luZG93QnlSZWZbcmVzdWx0UmVmXTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xuXG4gIHdoaWxlIChzdGF0ZS5yZXN1bHRXaW5kb3dPcmRlci5sZW5ndGggPiBzdGF0ZS5yZXN1bHRXaW5kb3dNYXgpIHtcbiAgICBjb25zdCBvbGRlc3RSZWYgPSBzdGF0ZS5yZXN1bHRXaW5kb3dPcmRlci5zaGlmdCgpO1xuICAgIGlmICghb2xkZXN0UmVmKSBicmVhaztcbiAgICBkZWxldGUgc3RhdGUucmVzdWx0V2luZG93QnlSZWZbb2xkZXN0UmVmXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdXRSZXN1bHRXaW5kb3dFbnRyeShcbiAgc3RhdGU6IFJlYWN0R2VuaWVTdGF0ZSxcbiAgZW50cnk6IE9taXQ8UmVzdWx0V2luZG93RW50cnksIFwicmVzdWx0UmVmXCIgfCBcImNyZWF0ZWRBdFwiPixcbik6IFJlc3VsdFdpbmRvd0VudHJ5IHtcbiAgZW5zdXJlUmVzdWx0V2luZG93RGVmYXVsdHMoc3RhdGUpO1xuICBzdGF0ZS5yZXN1bHRXaW5kb3dTZXF1ZW5jZSArPSAxO1xuICBjb25zdCByZXN1bHRSZWYgPSBgcmctJHtlbnRyeS5ldmVudElkfS0ke3N0YXRlLnJlc3VsdFdpbmRvd1NlcXVlbmNlfWA7XG4gIGNvbnN0IGNyZWF0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IGNvbXBsZXRlRW50cnk6IFJlc3VsdFdpbmRvd0VudHJ5ID0ge1xuICAgIC4uLmVudHJ5LFxuICAgIHJlc3VsdFJlZixcbiAgICBjcmVhdGVkQXQsXG4gIH07XG4gIHN0YXRlLnJlc3VsdFdpbmRvd0J5UmVmW3Jlc3VsdFJlZl0gPSBjb21wbGV0ZUVudHJ5O1xuICBzdGF0ZS5yZXN1bHRXaW5kb3dPcmRlci5wdXNoKHJlc3VsdFJlZik7XG4gIHBydW5lUmVzdWx0V2luZG93KHN0YXRlLCBjcmVhdGVkQXQpO1xuICByZXR1cm4gY29tcGxldGVFbnRyeTtcbn1cblxuZnVuY3Rpb24gaGFzaFN0cmluZyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGhhc2ggPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIHZhbHVlLmNoYXJDb2RlQXQoaSk7XG4gICAgaGFzaCB8PSAwO1xuICB9XG4gIHJldHVybiBNYXRoLmFicyhoYXNoKS50b1N0cmluZygzNik7XG59XG5cbmZ1bmN0aW9uIGFjY2Vzc29yRmllbGRUb1BhdGgoZmllbGQ6IGFueSk6IHN0cmluZyB8IG51bGwge1xuICBpZiAodHlwZW9mIGZpZWxkID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGZpZWxkO1xuICB9XG4gIGlmICghZmllbGQgfHwgdHlwZW9mIGZpZWxkICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09IFwiYWNjZXNzXCIpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBhY2Nlc3NvckZpZWxkVG9QYXRoKGZpZWxkLnBhcmVudCk7XG4gICAgaWYgKCFwYXJlbnQgfHwgdHlwZW9mIGZpZWxkLmFjY2VzcyAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBgJHtwYXJlbnR9LiR7ZmllbGQuYWNjZXNzfWA7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGFzdFZhbHVlVG9QcmltaXRpdmUoYXN0OiBhbnkpOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFhc3QgfHwgdHlwZW9mIGFzdCAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGFzdC50eXBlID09PSBcInN0cmluZ1wiIHx8IGFzdC50eXBlID09PSBcImludFwiIHx8IGFzdC50eXBlID09PSBcImZsb2F0XCIgfHwgYXN0LnR5cGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIGFzdC52YWx1ZTtcbiAgfVxuICBpZiAoYXN0LnR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICBpZiAoXG4gICAgICBhc3Qub2JqZWN0VHlwZSA9PT0gXCJzdHJpbmdcIiB8fFxuICAgICAgYXN0Lm9iamVjdFR5cGUgPT09IFwibnVtYmVyXCIgfHxcbiAgICAgIGFzdC5vYmplY3RUeXBlID09PSBcImZsb2F0XCIgfHxcbiAgICAgIGFzdC5vYmplY3RUeXBlID09PSBcImludFwiIHx8XG4gICAgICBhc3Qub2JqZWN0VHlwZSA9PT0gXCJib29sZWFuXCIgfHxcbiAgICAgIGFzdC5vYmplY3RUeXBlID09PSBcImJvb2xcIlxuICAgICkge1xuICAgICAgcmV0dXJuIGFzdC52YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gY29sbGVjdEZ1bmN0aW9uQ2FsbHMoYXN0OiBhbnksIGNhbGxzOiBhbnlbXSA9IFtdKTogYW55W10ge1xuICBpZiAoIWFzdCB8fCB0eXBlb2YgYXN0ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIGNhbGxzO1xuICB9XG5cbiAgaWYgKGFzdC50eXBlID09PSBcImluZGV4XCIpIHtcbiAgICBjYWxscy5wdXNoKHtcbiAgICAgIHR5cGU6IFwiZnVuY3Rpb25fY2FsbFwiLFxuICAgICAgZnVuY19uYW1lOiBcImluZGV4XCIsXG4gICAgICBwYXJhbWV0ZXJzOiBbeyBwYXJhbWV0ZXI6IFwiaW5kZXhcIiwgdmFsdWU6IHsgdHlwZTogXCJpbnRcIiwgdmFsdWU6IGFzdC5pbmRleCB9IH1dLFxuICAgIH0pO1xuICAgIHJldHVybiBjb2xsZWN0RnVuY3Rpb25DYWxscyhhc3QucGFyZW50LCBjYWxscyk7XG4gIH1cblxuICBpZiAoYXN0LnR5cGUgPT09IFwiYWNjZXNzXCIpIHtcbiAgICBpZiAoYXN0LmFjY2VzcyAmJiBhc3QuYWNjZXNzLnR5cGUgPT09IFwiZnVuY3Rpb25fY2FsbFwiKSB7XG4gICAgICBjYWxscy5wdXNoKGFzdC5hY2Nlc3MpO1xuICAgIH1cbiAgICByZXR1cm4gY29sbGVjdEZ1bmN0aW9uQ2FsbHMoYXN0LnBhcmVudCwgY2FsbHMpO1xuICB9XG5cbiAgcmV0dXJuIGNhbGxzO1xufVxuXG5mdW5jdGlvbiBnZXRDYWxsUGFyYW0oY2FsbDogYW55LCBwYXJhbU5hbWU6IHN0cmluZyk6IGFueSB8IHVuZGVmaW5lZCB7XG4gIGlmICghY2FsbCB8fCAhQXJyYXkuaXNBcnJheShjYWxsLnBhcmFtZXRlcnMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBlbnRyeSA9IGNhbGwucGFyYW1ldGVycy5maW5kKChwYXJhbTogYW55KSA9PiBwYXJhbS5wYXJhbWV0ZXIgPT09IHBhcmFtTmFtZSk7XG4gIHJldHVybiBlbnRyeT8udmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UXVlcnlJbnRlbnRGcm9tQXN0KGFzdDogYW55KTogUXVlcnlJbnRlbnQgfCBudWxsIHtcbiAgY29uc3QgY2FsbHMgPSBjb2xsZWN0RnVuY3Rpb25DYWxscyhhc3QsIFtdKS5yZXZlcnNlKCk7XG4gIGNvbnN0IG9wczogUXVlcnlJbnRlbnRPcGVyYXRpb25bXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgY2FsbCBvZiBjYWxscykge1xuICAgIGNvbnN0IGZ1bmNOYW1lID0gY2FsbD8uZnVuY19uYW1lO1xuICAgIGlmIChmdW5jTmFtZSA9PT0gXCJtYXRjaGluZ1wiIHx8IGZ1bmNOYW1lID09PSBcImNvbnRhaW5zXCIgfHwgZnVuY05hbWUgPT09IFwiZXF1YWxzXCIpIHtcbiAgICAgIGNvbnN0IGZpZWxkQXN0ID0gZ2V0Q2FsbFBhcmFtKGNhbGwsIFwiZmllbGRcIik7XG4gICAgICBjb25zdCB2YWx1ZUFzdCA9IGdldENhbGxQYXJhbShjYWxsLCBcInZhbHVlXCIpO1xuICAgICAgY29uc3QgZmllbGRQYXRoID0gYWNjZXNzb3JGaWVsZFRvUGF0aChmaWVsZEFzdD8uZmllbGQpO1xuICAgICAgY29uc3QgdmFsdWUgPSBhc3RWYWx1ZVRvUHJpbWl0aXZlKHZhbHVlQXN0KTtcbiAgICAgIGlmIChmaWVsZFBhdGggJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcHMucHVzaCh7XG4gICAgICAgICAga2luZDogZnVuY05hbWUsXG4gICAgICAgICAgZmllbGQ6IGZpZWxkUGF0aCxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoZnVuY05hbWUgPT09IFwiYmV0d2VlblwiKSB7XG4gICAgICBjb25zdCBmaWVsZEFzdCA9IGdldENhbGxQYXJhbShjYWxsLCBcImZpZWxkXCIpO1xuICAgICAgY29uc3QgZnJvbSA9IGFzdFZhbHVlVG9QcmltaXRpdmUoZ2V0Q2FsbFBhcmFtKGNhbGwsIFwiZnJvbVwiKSk7XG4gICAgICBjb25zdCB0byA9IGFzdFZhbHVlVG9QcmltaXRpdmUoZ2V0Q2FsbFBhcmFtKGNhbGwsIFwidG9cIikpO1xuICAgICAgY29uc3QgZmllbGRQYXRoID0gYWNjZXNzb3JGaWVsZFRvUGF0aChmaWVsZEFzdD8uZmllbGQpO1xuICAgICAgaWYgKGZpZWxkUGF0aCAmJiAoZnJvbSAhPT0gdW5kZWZpbmVkIHx8IHRvICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIG9wcy5wdXNoKHtcbiAgICAgICAgICBraW5kOiBcImJldHdlZW5cIixcbiAgICAgICAgICBmaWVsZDogZmllbGRQYXRoLFxuICAgICAgICAgIC4uLihmcm9tICE9PSB1bmRlZmluZWQgPyB7IGZyb20gfSA6IHt9KSxcbiAgICAgICAgICAuLi4odG8gIT09IHVuZGVmaW5lZCA/IHsgdG8gfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoZnVuY05hbWUgPT09IFwic29ydFwiKSB7XG4gICAgICBjb25zdCBmaWVsZEFzdCA9IGdldENhbGxQYXJhbShjYWxsLCBcImZpZWxkXCIpO1xuICAgICAgY29uc3QgYXNjZW5kaW5nID0gYXN0VmFsdWVUb1ByaW1pdGl2ZShnZXRDYWxsUGFyYW0oY2FsbCwgXCJhc2NlbmRpbmdcIikpO1xuICAgICAgY29uc3QgZmllbGRQYXRoID0gYWNjZXNzb3JGaWVsZFRvUGF0aChmaWVsZEFzdD8uZmllbGQpO1xuICAgICAgaWYgKGZpZWxkUGF0aCkge1xuICAgICAgICBvcHMucHVzaCh7XG4gICAgICAgICAga2luZDogXCJzb3J0XCIsXG4gICAgICAgICAgZmllbGQ6IGZpZWxkUGF0aCxcbiAgICAgICAgICBhc2NlbmRpbmc6IGFzY2VuZGluZyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IEJvb2xlYW4oYXNjZW5kaW5nKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoZnVuY05hbWUgPT09IFwiaW5kZXhcIikge1xuICAgICAgY29uc3QgaW5kZXggPSBhc3RWYWx1ZVRvUHJpbWl0aXZlKGdldENhbGxQYXJhbShjYWxsLCBcImluZGV4XCIpKTtcbiAgICAgIGlmICh0eXBlb2YgaW5kZXggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgb3BzLnB1c2goe1xuICAgICAgICAgIGtpbmQ6IFwiaW5kZXhcIixcbiAgICAgICAgICB2YWx1ZTogaW5kZXgsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGZ1bmNOYW1lID09PSBcImxlbmd0aFwiKSB7XG4gICAgICBvcHMucHVzaCh7IGtpbmQ6IFwibGVuZ3RoXCIgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeShvcHMpO1xuICByZXR1cm4ge1xuICAgIG9wcyxcbiAgICBoYXNoOiBoYXNoU3RyaW5nKHNlcmlhbGl6ZWQpLFxuICB9O1xufVxuXG5leHBvcnQgY29uc3QgdXNlR2VuaWVDb2RlU2VsZWN0b3IgPSAoY29tbWFuZDogc3RyaW5nKSA9PiB7XG4gIHJldHVybiBhc3luYyAoc3RhdGU6IGFueSkgPT4ge1xuICAgIHVpQWN0aXZlID0gZmFsc2U7XG4gICAgc2V0U2hhcmVkU3RhdGUoc3RhdGUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IEdlbmllSW50ZXJwcmV0ZXIuZHNsSW50ZXJwcmV0ZXIuaW50ZXJwcmV0KGNvbW1hbmQpO1xuICAgIC8vIGxvZ2dlci5pbmZvKGBleGVjdXRlZCByZXN1bHQgJHtyZXN1bHR9YCk7XG4gICAgLy8gbG9nZ2VyLmluZm8oYGFmdGVyIGV4ZWN1dGluZyBzdGF0ZSAke0pTT04uc3RyaW5naWZ5KHN0YXRlKX1gKTtcbiAgICB1aUFjdGl2ZSA9IHRydWU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn07XG5cbmNvbnN0IHNoYWxsb3dFcXVhbFdpdGhBcnJheSA9IChsZWZ0OiBhbnksIHJpZ2h0OiBhbnkpID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkobGVmdCkgJiYgQXJyYXkuaXNBcnJheShyaWdodCkpIHtcbiAgICBpZiAobGVmdC5sZW5ndGggIT09IHJpZ2h0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlZnQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghc2hhbGxvd0VxdWFsV2l0aEFycmF5KGxlZnRbaV0sIHJpZ2h0W2ldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzaGFsbG93RXF1YWwobGVmdCwgcmlnaHQpO1xuICB9XG59O1xuXG5jb25zdCBjb252ZXJ0R2VuaWVDbGFzc1RvU3RhdGUgPSAob2JqOiBhbnkpID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiBvYmoubWFwKChlbGVtZW50KSA9PiBjb252ZXJ0R2VuaWVDbGFzc1RvU3RhdGUoZWxlbWVudCkpO1xuICB9IGVsc2UgaWYgKFxuICAgIG9iaiA9PT0gbnVsbCB8fFxuICAgIG9iaiA9PT0gdW5kZWZpbmVkIHx8XG4gICAgb2JqLmNvbnN0cnVjdG9yID09PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfSBlbHNlIGlmIChvYmouY29uc3RydWN0b3IucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuaWVPYmplY3QpIHtcbiAgICBpZiAob2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBpbnN0YW5jZW9mIERhdGFDbGFzcykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX19nZW5pZU9iamVjdFR5cGU6IFwiRGF0YUNsYXNzXCIsXG4gICAgICAgIF9fZ2VuaWVPYmplY3RDbGFzczogb2JqLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgICAgIF9fZ2VuaWVPYmplY3RLZXk6IG9ialtvYmouZ2VuaWVLZXldLFxuICAgICAgICAuLi5vYmouX19nZXRTdGF0ZSgpLFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgaW5zdGFuY2VvZiBIZWxwZXJDbGFzcykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX19nZW5pZU9iamVjdFR5cGU6IFwiSGVscGVyQ2xhc3NcIixcbiAgICAgICAgX19nZW5pZU9iamVjdENsYXNzOiBvYmouY29uc3RydWN0b3IubmFtZSxcbiAgICAgICAgLi4ub2JqLmxvY2FsU3RvcmUsXG4gICAgICB9O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIEdlbmllT2JqZWN0IHR5cGVcIik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHVzZUdlbmllU2VsZWN0b3IgPSAoc2VsZWN0b3I6IGFueSkgPT4ge1xuICBsZXQgc2VsZWN0b3JSZXN1bHQ6IGFueSA9IHVuZGVmaW5lZDtcbiAgdXNlU2VsZWN0b3IoKHN0YXRlOiBhbnkpID0+IHtcbiAgICBzZXRTaGFyZWRTdGF0ZShzdGF0ZSk7XG4gICAgc2VsZWN0b3JSZXN1bHQgPSBzZWxlY3RvcihzdGF0ZSk7XG4gICAgcmV0dXJuIGNvbnZlcnRHZW5pZUNsYXNzVG9TdGF0ZShzZWxlY3RvclJlc3VsdCk7XG4gIH0sIHNoYWxsb3dFcXVhbFdpdGhBcnJheSk7XG4gIHJldHVybiBzZWxlY3RvclJlc3VsdDtcbn07XG5cbnR5cGUgR2VuaWVDb2RlUmVzdWx0ID0ge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICByZXN1bHRzOiBhbnlbXTtcbn07XG5cbmNvbnN0IFJFU1VMVF9QUkVWSUVXX01BWF9MRU5HVEggPSAxNjA7XG5cbmZ1bmN0aW9uIHRydW5jYXRlVGV4dCh2YWx1ZTogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICh2YWx1ZS5sZW5ndGggPD0gbWF4TGVuZ3RoKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiBgJHt2YWx1ZS5zbGljZSgwLCBNYXRoLm1heCgwLCBtYXhMZW5ndGggLSAxKSkudHJpbUVuZCgpfeKApmA7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN5c3RlbU1lc3NhZ2UoXG4gIG1pbmltYWxUZXh0OiBzdHJpbmcsXG4gIGZ1bGxUZXh0OiBzdHJpbmcsXG4gIHR5cGU6IEFnZW50UmVzcG9uc2VQYXlsb2FkW1widHlwZVwiXSA9IFwiaW5mb1wiLFxuICBzaG91bGRTcGVhayA9IGZhbHNlLFxuICBvcmlnaW46IFJlYWN0R2VuaWVNZXNzYWdlW1wib3JpZ2luXCJdID0gXCJzeXN0ZW1cIixcbik6IFJlYWN0R2VuaWVNZXNzYWdlIHtcbiAgcmV0dXJuIHtcbiAgICBtaW5pbWFsVGV4dCxcbiAgICBmdWxsVGV4dCxcbiAgICB0eXBlLFxuICAgIHNob3VsZFNwZWFrLFxuICAgIG9yaWdpbixcbiAgICBtZXNzYWdlOiBmdWxsVGV4dCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVXNlckZhY2luZ01lc3NhZ2UoXG4gIGVycm9yOiBHZW5pZVVzZXJGYWNpbmdFcnJvcixcbiAgb3JpZ2luOiBSZWFjdEdlbmllTWVzc2FnZVtcIm9yaWdpblwiXSxcbiAgc2hvdWxkU3BlYWtCeURlZmF1bHQ6IGJvb2xlYW4sXG4pOiBSZWFjdEdlbmllTWVzc2FnZSB7XG4gIHJldHVybiB7XG4gICAgbWluaW1hbFRleHQ6IGVycm9yLm1pbmltYWxUZXh0LFxuICAgIGZ1bGxUZXh0OiBlcnJvci5mdWxsVGV4dCxcbiAgICB0eXBlOiBlcnJvci50eXBlLFxuICAgIHNob3VsZFNwZWFrOiBlcnJvci5zaG91bGRTcGVhayA/PyBzaG91bGRTcGVha0J5RGVmYXVsdCxcbiAgICBvcmlnaW4sXG4gICAgbWVzc2FnZTogZXJyb3IuZnVsbFRleHQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNhZmVTZXJpYWxpemVWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIFwibm9uZVwiO1xuICB9XG4gIGNvbnN0IHNlcmlhbGl6ZWQgPSBTdHJpbmcodmFsdWUpO1xuICByZXR1cm4gdHJ1bmNhdGVUZXh0KHNlcmlhbGl6ZWQsIFJFU1VMVF9QUkVWSUVXX01BWF9MRU5HVEgpO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlc3VsdERpZ2VzdChyZXN1bHQ6IGFueSwgcGFyc2VkOiBzdHJpbmcpIHtcbiAgaWYgKCFyZXN1bHQgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiB7XG4gICAgICBwYXJzZWQsXG4gICAgICBzdGF0dXM6IFwidW5rbm93blwiLFxuICAgICAgcmVzdWx0VHlwZTogXCJ1bmtub3duXCIsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChyZXN1bHQudHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgY29uc3QgdmFsdWVzID0gQXJyYXkuaXNBcnJheShyZXN1bHQudmFsdWUpID8gcmVzdWx0LnZhbHVlIDogW107XG4gICAgY29uc3QgZmlyc3QgPSB2YWx1ZXMubGVuZ3RoID4gMCA/IHZhbHVlc1swXSA6IG51bGw7XG4gICAgY29uc3QgZmlyc3RPYmplY3RUeXBlID0gZmlyc3Q/Lm9iamVjdFR5cGUgfHwgbnVsbDtcbiAgICBjb25zdCBmaXJzdFByZXZpZXcgPVxuICAgICAgZmlyc3QgJiYgZmlyc3QudHlwZSA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IHNhZmVTZXJpYWxpemVWYWx1ZShmaXJzdC52YWx1ZSlcbiAgICAgICAgOiBudWxsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcnNlZCxcbiAgICAgIHN0YXR1czogXCJva1wiLFxuICAgICAgcmVzdWx0VHlwZTogXCJhcnJheVwiLFxuICAgICAgY291bnQ6IHZhbHVlcy5sZW5ndGgsXG4gICAgICBmaXJzdE9iamVjdFR5cGUsXG4gICAgICBmaXJzdFByZXZpZXcsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChyZXN1bHQudHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiB7XG4gICAgICBwYXJzZWQsXG4gICAgICBzdGF0dXM6IFwib2tcIixcbiAgICAgIHJlc3VsdFR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBvYmplY3RUeXBlOiByZXN1bHQub2JqZWN0VHlwZSB8fCBcInVua25vd25cIixcbiAgICAgIHByZXZpZXc6IHNhZmVTZXJpYWxpemVWYWx1ZShyZXN1bHQudmFsdWUpLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBhcnNlZCxcbiAgICBzdGF0dXM6IFwib2tcIixcbiAgICByZXN1bHRUeXBlOiBcInVua25vd25cIixcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVHZW5pZUNvZGUoXG4gIGNvbW1hbmQ6IHVua25vd24sXG4gIG9wdGlvbnM6IHtcbiAgICBvcmlnaW4/OiBSZWFjdEdlbmllTWVzc2FnZVtcIm9yaWdpblwiXTtcbiAgICBzaG91bGRTcGVha0Vycm9ycz86IGJvb2xlYW47XG4gIH0gPSB7fSxcbik6IFByb21pc2U8R2VuaWVDb2RlUmVzdWx0PiB7XG4gICAgY29uc3Qgc2FuaXRpemVkID1cbiAgICAgIHR5cGVvZiBjb21tYW5kID09PSBcInN0cmluZ1wiID8gY29tbWFuZC50cmltKCkgOiBcIlwiO1xuICAgIGNvbnN0IG1lc3NhZ2VPcmlnaW4gPSBvcHRpb25zLm9yaWdpbiA/PyBcInN5c3RlbVwiO1xuICAgIGNvbnN0IHNob3VsZFNwZWFrRXJyb3JzID0gQm9vbGVhbihvcHRpb25zLnNob3VsZFNwZWFrRXJyb3JzKTtcbiAgICAvLyBsb2dnZXIuaW5mbyhgZXhlY3V0aW5nIGNvbW1hbmQgOiAke3Nhbml0aXplZH1gKTtcblxuICAgIGlmICghc2FuaXRpemVkKSB7XG4gICAgICBnZW5pZURpc3BhdGNoKCgpID0+IHtcbiAgICAgICAgY29uc3QgcmVhY3RHZW5pZVN0YXRlID0gc2hhcmVkU3RhdGUgYXMgUmVhY3RHZW5pZVN0YXRlO1xuICAgICAgICByZWFjdEdlbmllU3RhdGUubWVzc2FnZSA9IGNyZWF0ZVN5c3RlbU1lc3NhZ2UoXG4gICAgICAgICAgXCJObyBhY3Rpb25hYmxlIGNvbW1hbmQuXCIsXG4gICAgICAgICAgXCJJIGhlYXJkIHlvdSwgYnV0IHRoZXJlIGlzIG5vIGFjdGlvbmFibGUgY29tbWFuZCB0byBydW4uXCIsXG4gICAgICAgICAgXCJpbmZvXCIsXG4gICAgICAgICAgc2hvdWxkU3BlYWtFcnJvcnMsXG4gICAgICAgICAgbWVzc2FnZU9yaWdpbixcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIHJlc3VsdHM6IFtuZXcgRXJyb3IoXCJObyBhY3Rpb25hYmxlIGNvbW1hbmRcIildLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBHdWFyZCBhZ2FpbnN0IEdlbmllSW50ZXJwcmV0ZXIgbm90IGJlaW5nIGluaXRpYWxpemVkXG4gICAgaWYgKCFHZW5pZUludGVycHJldGVyIHx8ICFHZW5pZUludGVycHJldGVyLmRzbEludGVycHJldGVyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0dlbmllSW50ZXJwcmV0ZXIgaXMgbm90IGluaXRpYWxpemVkJyk7XG4gICAgICBnZW5pZURpc3BhdGNoKCgpID0+IHtcbiAgICAgICAgY29uc3QgcmVhY3RHZW5pZVN0YXRlID0gc2hhcmVkU3RhdGUgYXMgUmVhY3RHZW5pZVN0YXRlO1xuICAgICAgICByZWFjdEdlbmllU3RhdGUubWVzc2FnZSA9IGNyZWF0ZVN5c3RlbU1lc3NhZ2UoXG4gICAgICAgICAgXCJTeXN0ZW0gbm90IHJlYWR5LlwiLFxuICAgICAgICAgIFwiU3lzdGVtIG5vdCByZWFkeS4gUGxlYXNlIHRyeSBhZ2Fpbi5cIixcbiAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgICAgc2hvdWxkU3BlYWtFcnJvcnMsXG4gICAgICAgICAgbWVzc2FnZU9yaWdpbixcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIHJlc3VsdHM6IFtuZXcgRXJyb3IoJ0dlbmllSW50ZXJwcmV0ZXIgbm90IGluaXRpYWxpemVkJyldLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgYXdhaXQgR2VuaWVJbnRlcnByZXRlci5kc2xJbnRlcnByZXRlci5pbnRlcnByZXRTdGVwcyhzYW5pdGl6ZWQpO1xuICAgICAgLy8gY29uc29sZS5sb2coYGV4ZWN1dGVkIHJlc3VsdCAke3Jlc3VsdH1gKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIHJlc3VsdHM6IHJlc3VsdCxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLmVycm9yKCdlcnJvciBleGVjdXRpbmcgY29tbWFuZDonLCBzYW5pdGl6ZWQsIGUpO1xuICAgICAgZ2VuaWVEaXNwYXRjaCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlYWN0R2VuaWVTdGF0ZSA9IHNoYXJlZFN0YXRlIGFzIFJlYWN0R2VuaWVTdGF0ZTtcbiAgICAgICAgcmVhY3RHZW5pZVN0YXRlLm1lc3NhZ2UgPSBpc0dlbmllVXNlckZhY2luZ0Vycm9yKGUpXG4gICAgICAgICAgPyBjcmVhdGVVc2VyRmFjaW5nTWVzc2FnZShlLCBtZXNzYWdlT3JpZ2luLCBzaG91bGRTcGVha0Vycm9ycylcbiAgICAgICAgICA6IGNyZWF0ZVN5c3RlbU1lc3NhZ2UoXG4gICAgICAgICAgICAgIFwiSSBjb3VsZCBub3QgcHJvY2VzcyB0aGF0LlwiLFxuICAgICAgICAgICAgICBcIlNvcnJ5LCBJIGRvbid0IHVuZGVyc3RhbmQuLi5cIixcbiAgICAgICAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICAgICAgICBzaG91bGRTcGVha0Vycm9ycyxcbiAgICAgICAgICAgICAgbWVzc2FnZU9yaWdpbixcbiAgICAgICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICByZXN1bHRzOiBbZV0sXG4gICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3BsYXlSZXN1bHQoXG4gIGV4ZWN1dGlvblJlc3VsdDogR2VuaWVDb2RlUmVzdWx0LFxuICB0cmFuc2NyaXB0OiBzdHJpbmcsXG4gIHBhcnNlZDogc3RyaW5nLFxuICBnZW5pZUludGVyZmFjZXM6IEdlbmllSW50ZXJmYWNlU3BlY1tdLFxuKSB7XG4gIGdlbmllRGlzcGF0Y2goKCkgPT4ge1xuICAgIGxldCBhbGxEaXNwbGF5aW5nT2JqZWN0cyA9IFtdO1xuICAgIGxldCBkaXNwbGF5aW5nT2JqZWN0ID0gbnVsbDtcbiAgICBsZXQgZGlzcGxheWluZ09iamVjdFR5cGUgPSBcIlwiO1xuXG4gICAgY29uc3Qgc3RhdGVtZW50UmVzdWx0ID0gZXhlY3V0aW9uUmVzdWx0LnJlc3VsdHNbMF07XG4gICAgY29uc3Qgc3RhdGVtZW50QXN0ID0gc3RhdGVtZW50UmVzdWx0Py5hc3Q7XG4gICAgY29uc3QgcmVzdWx0U3RlcHM6IFt7IGFzdDogYW55OyByZXN1bHQ6IGFueSB9XSA9XG4gICAgICBzdGF0ZW1lbnRSZXN1bHRbXCJzdGVwc1wiXTtcbiAgICBjb25zdCBxdWVyeUludGVudCA9IGV4dHJhY3RRdWVyeUludGVudEZyb21Bc3Qoc3RhdGVtZW50QXN0KTtcbiAgICBsZXQgbGFzdFJlc3VsdCA9IHRydWU7XG5cbiAgICBmb3IgKGxldCBpID0gcmVzdWx0U3RlcHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmIChpICE9IHJlc3VsdFN0ZXBzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgbGFzdFJlc3VsdCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RlcCA9IHJlc3VsdFN0ZXBzW2ldO1xuICAgICAgYWxsRGlzcGxheWluZ09iamVjdHMgPSBbXTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGBsYXN0IGV4ZWN1dGVkIHN0ZXAgJHtKU09OLnN0cmluZ2lmeShzdGVwKX1gKTtcbiAgICAgIGNvbnN0IHN0ZXBSZXN1bHQgPSBzdGVwLnJlc3VsdDtcbiAgICAgIGlmIChzdGVwUmVzdWx0LnR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgYWxsRGlzcGxheWluZ09iamVjdHMucHVzaChzdGVwUmVzdWx0KTtcbiAgICAgIH0gZWxzZSBpZiAoc3RlcFJlc3VsdC50eXBlID09PSBcImFycmF5XCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHN0ZXBSZXN1bHQudmFsdWUpIHtcbiAgICAgICAgICBhbGxEaXNwbGF5aW5nT2JqZWN0cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBwcmltYXJ5VmFsdWUgPVxuICAgICAgICBhbGxEaXNwbGF5aW5nT2JqZWN0cy5sZW5ndGggPiAwID8gYWxsRGlzcGxheWluZ09iamVjdHNbMF0udmFsdWUgOiBudWxsO1xuICAgICAgLy8gY2hlY2sgaWYgb2JqZWN0IGNhbiBiZSBkaXNwbGF5ZWRcbiAgICAgIGlmIChhbGxEaXNwbGF5aW5nT2JqZWN0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZGlzcGxheWluZ09iamVjdFR5cGUgPSBhbGxEaXNwbGF5aW5nT2JqZWN0c1swXS5vYmplY3RUeXBlO1xuICAgICAgICBkaXNwbGF5aW5nT2JqZWN0ID0gYWxsRGlzcGxheWluZ09iamVjdHNbMF07XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcmltYXJ5VmFsdWUgJiZcbiAgICAgICAgICBPYmplY3QuaGFzT3duKGFsbERpc3BsYXlpbmdPYmplY3RzWzBdLCBcInZhbHVlXCIpICYmXG4gICAgICAgICAgT2JqZWN0Lmhhc093bihwcmltYXJ5VmFsdWUsIFwibG9jYWxTdG9yZVwiKSAmJlxuICAgICAgICAgIGFsbERpc3BsYXlpbmdPYmplY3RzWzBdLnZhbHVlLmxvY2FsU3RvcmUuX19nZW5pZU9iamVjdFR5cGUgPT09XG4gICAgICAgICAgICBcIkhlbHBlckNsYXNzXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgZGlzcGxheWluZ09iamVjdFR5cGUgPSBcInVuZGVmaW5lZFwiO1xuICAgICAgICAgIGRpc3BsYXlpbmdPYmplY3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFsbERpc3BsYXlpbmdPYmplY3RzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZGlzcGxheWluZ09iamVjdFR5cGUgPSBhbGxEaXNwbGF5aW5nT2JqZWN0c1swXS5vYmplY3RUeXBlICsgXCJbXVwiO1xuICAgICAgICBkaXNwbGF5aW5nT2JqZWN0ID0gYWxsRGlzcGxheWluZ09iamVjdHM7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcmltYXJ5VmFsdWUgJiZcbiAgICAgICAgICBPYmplY3QuaGFzT3duKGFsbERpc3BsYXlpbmdPYmplY3RzWzBdLCBcInZhbHVlXCIpICYmXG4gICAgICAgICAgT2JqZWN0Lmhhc093bihwcmltYXJ5VmFsdWUsIFwibG9jYWxTdG9yZVwiKSAmJlxuICAgICAgICAgIGFsbERpc3BsYXlpbmdPYmplY3RzWzBdLnZhbHVlLmxvY2FsU3RvcmUuX19nZW5pZU9iamVjdFR5cGUgPT09XG4gICAgICAgICAgICBcIkhlbHBlckNsYXNzXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgZGlzcGxheWluZ09iamVjdFR5cGUgPSBcInVuZGVmaW5lZFwiO1xuICAgICAgICAgIGRpc3BsYXlpbmdPYmplY3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFsbERpc3BsYXlpbmdPYmplY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkaXNwbGF5aW5nT2JqZWN0VHlwZSA9IFwidW5kZWZpbmVkXCI7XG4gICAgICAgIGRpc3BsYXlpbmdPYmplY3QgPSBudWxsO1xuICAgICAgfVxuICAgICAgLy8gaWYgZGlzcGxheWluZ09iamVjdFR5cGUgaW4gdGhlIGtleXMgb2YgQWxsR2VuaWVPYmplY3RJbnRlcmZhY2VzXG4gICAgICBpZiAoQWxsR2VuaWVPYmplY3RJbnRlcmZhY2VzLnN1cHBvcnRlZFR5cGVzLmhhcyhkaXNwbGF5aW5nT2JqZWN0VHlwZSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBjYW5ub3RkaXNwbGF5ID0gZmFsc2U7XG4gICAgbGV0IG9uU2NyZWVuID0gdHJ1ZTtcbiAgICBsZXQgaW5zdGFudGlhdGVkRGlzcGxheWluZ09iamVjdCA9IG51bGw7XG4gICAgaWYgKGRpc3BsYXlpbmdPYmplY3QgIT0gbnVsbCkge1xuICAgICAgLy8gaWYgZGlzcGxheWluZ09iamVjdCBpcyBhbiBhcnJheVxuICAgICAgaWYgKGRpc3BsYXlpbmdPYmplY3QgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAvLyBhbHdheXMgZGlzcGxheVxuICAgICAgICBvblNjcmVlbiA9IGZhbHNlO1xuICAgICAgICBpbnN0YW50aWF0ZWREaXNwbGF5aW5nT2JqZWN0ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBkaXNwbGF5aW5nT2JqZWN0KSB7XG4gICAgICAgICAgY29uc3QgSW5zdGFuY2UgPSBJbnN0YW50aWF0ZUdlbmllT2JqZWN0KHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogZWxlbWVudC5vYmplY3RUeXBlLFxuICAgICAgICAgICAga2V5OiBlbGVtZW50LnZhbHVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChJbnN0YW5jZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjYW5ub3RkaXNwbGF5ID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnN0YW50aWF0ZWREaXNwbGF5aW5nT2JqZWN0LnB1c2goSW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBJbnN0YW5jZSA9IEluc3RhbnRpYXRlR2VuaWVPYmplY3Qoe1xuICAgICAgICAgIGNsYXNzTmFtZTogZGlzcGxheWluZ09iamVjdC5vYmplY3RUeXBlLFxuICAgICAgICAgIGtleTogZGlzcGxheWluZ09iamVjdC52YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChJbnN0YW5jZSA9PT0gdW5kZWZpbmVkKSBjYW5ub3RkaXNwbGF5ID0gdHJ1ZTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKGxhc3RSZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGFsd2F5cyBkaXNwbGF5XG4gICAgICAgICAgICBvblNjcmVlbiA9IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiBkaXNwbGF5aW5nT2JqZWN0cyBpcyBvbiBzY3JlZW4gYWxyZWFkeVxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0SW50ZXJmYWNlID0gZ2VuaWVJbnRlcmZhY2VzLmZpbmQoXG4gICAgICAgICAgICAgIChnZW5pZUludGVyZmFjZSkgPT5cbiAgICAgICAgICAgICAgICBnZW5pZUludGVyZmFjZS5jbGFzc05hbWUgPT09IEluc3RhbmNlLmNvbnN0cnVjdG9yLm5hbWUgJiZcbiAgICAgICAgICAgICAgICBzaGFsbG93RXF1YWwoXG4gICAgICAgICAgICAgICAgICBnZW5pZUludGVyZmFjZS5rZXksXG4gICAgICAgICAgICAgICAgICBJbnN0YW5jZS5fZ2V0Q29uc3RydWN0b3JQYXJhbXMoKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghdGFyZ2V0SW50ZXJmYWNlKSB7XG4gICAgICAgICAgICAgIG9uU2NyZWVuID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaW5zdGFudGlhdGVkRGlzcGxheWluZ09iamVjdCA9IEluc3RhbmNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIEdlbmllSW50ZXJwcmV0ZXIubmxQYXJzZXJcbiAgICAgIC5yZXNwb25kKFxuICAgICAgICB0cmFuc2NyaXB0LFxuICAgICAgICBwYXJzZWQsXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIGJ1aWxkUmVzdWx0RGlnZXN0KFxuICAgICAgICAgICAgLy8gbm93IHdlIG9ubHkgZGlzcGxheSB0aGUgbGFzdCByZXN1bHRcbiAgICAgICAgICAgIGV4ZWN1dGlvblJlc3VsdC5yZXN1bHRzW2V4ZWN1dGlvblJlc3VsdC5yZXN1bHRzLmxlbmd0aCAtIDFdLnJlc3VsdCxcbiAgICAgICAgICAgIHBhcnNlZCxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKVxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgcmVzcG9uZCByZXN1bHQ6ICR7cmVzdWx0fWApO1xuICAgICAgICBnZW5pZURpc3BhdGNoKCgpID0+IHtcbiAgICAgICAgICBjb25zdCByZWFjdEdlbmllU3RhdGUgPSBzaGFyZWRTdGF0ZSBhcyBSZWFjdEdlbmllU3RhdGU7XG4gICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVhY3RHZW5pZVN0YXRlLm1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICAgICAgb3JpZ2luOiBcInZvaWNlXCIsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3VsdC5mdWxsVGV4dCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IHJlc3VsdEVudHJ5OiBSZXN1bHRXaW5kb3dFbnRyeSB8IG51bGwgPSBudWxsO1xuICAgICAgICAgIGlmICghY2Fubm90ZGlzcGxheSAmJiBhbGxEaXNwbGF5aW5nT2JqZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBvcmRlcmVkQ29uc3RydWN0b3JQYXJhbXMgPSBhbGxEaXNwbGF5aW5nT2JqZWN0c1xuICAgICAgICAgICAgICAubWFwKChkaXNwbGF5aW5nT2JqZWN0KSA9PlxuICAgICAgICAgICAgICAgIGNyZWF0ZUltbXV0YWJsZUNvbnN0cnVjdG9yUGFyYW1zU25hcHNob3QoZGlzcGxheWluZ09iamVjdC52YWx1ZSksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAocGFyYW1zKTogcGFyYW1zIGlzIFJlY29yZDxzdHJpbmcsIGFueT4gPT5cbiAgICAgICAgICAgICAgICAgIHBhcmFtcyAhPT0gbnVsbCAmJiB0eXBlb2YgcGFyYW1zID09PSBcIm9iamVjdFwiLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAob3JkZXJlZENvbnN0cnVjdG9yUGFyYW1zLmxlbmd0aCA+IDAgJiYgZGlzcGxheWluZ09iamVjdFR5cGUpIHtcbiAgICAgICAgICAgICAgY29uc3QgcHJlZGljdGVkRXZlbnRJZCA9IHJlYWN0R2VuaWVTdGF0ZS5uYXZTdGFjayArIDE7XG4gICAgICAgICAgICAgIHJlc3VsdEVudHJ5ID0gcHV0UmVzdWx0V2luZG93RW50cnkocmVhY3RHZW5pZVN0YXRlLCB7XG4gICAgICAgICAgICAgICAgZXZlbnRJZDogcHJlZGljdGVkRXZlbnRJZCxcbiAgICAgICAgICAgICAgICByZXN1bHRPYmplY3RUeXBlOiBkaXNwbGF5aW5nT2JqZWN0VHlwZSxcbiAgICAgICAgICAgICAgICBvcmRlcmVkQ29uc3RydWN0b3JQYXJhbXMsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghb25TY3JlZW4gJiYgIWNhbm5vdGRpc3BsYXkpIHtcbiAgICAgICAgICAgIHJlYWN0R2VuaWVTdGF0ZS5uYXZTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgb2JqZWN0Vmlld0NsYXNzTmFtZTogQWxsR2VuaWVPYmplY3RJbnRlcmZhY2VzLmdldEludGVyZmFjZXMoXG4gICAgICAgICAgICAgICAgaW5zdGFudGlhdGVkRGlzcGxheWluZ09iamVjdCxcbiAgICAgICAgICAgICAgKS52aWV3Q2xhc3NOYW1lLFxuICAgICAgICAgICAgICBvYmplY3RDb25zdHJ1Y3RvclBhcmFtczpcbiAgICAgICAgICAgICAgICBhbGxEaXNwbGF5aW5nT2JqZWN0cy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgICAgID8gYWxsRGlzcGxheWluZ09iamVjdHNbMF0udmFsdWUuX2dldENvbnN0cnVjdG9yUGFyYW1zKClcbiAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOiBhbGxEaXNwbGF5aW5nT2JqZWN0cy5tYXAoKGRpc3BsYXlpbmdPYmplY3QpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5aW5nT2JqZWN0LnZhbHVlLl9nZXRDb25zdHJ1Y3RvclBhcmFtcygpLFxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHF1ZXJ5SW50ZW50LFxuICAgICAgICAgICAgICByZXN1bHRSZWY6IHJlc3VsdEVudHJ5Py5yZXN1bHRSZWYgPz8gbnVsbCxcbiAgICAgICAgICAgICAgcmVzdWx0T2JqZWN0VHlwZTogZGlzcGxheWluZ09iamVjdFR5cGUgfHwgbnVsbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWFjdEdlbmllU3RhdGUubmF2U3RhY2sgKz0gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdlcnJvciBnZW5lcmF0aW5nIHJlc3BvbnNlOicsIGVycm9yKTtcbiAgICAgICAgZ2VuaWVEaXNwYXRjaCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVhY3RHZW5pZVN0YXRlID0gc2hhcmVkU3RhdGUgYXMgUmVhY3RHZW5pZVN0YXRlO1xuICAgICAgICAgIHJlYWN0R2VuaWVTdGF0ZS5tZXNzYWdlID0gY3JlYXRlU3lzdGVtTWVzc2FnZShcbiAgICAgICAgICAgIFwiRG9uZS5cIixcbiAgICAgICAgICAgIFwiRG9uZS5cIixcbiAgICAgICAgICAgIFwiaW5mb1wiLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIC8vIGNvbnNvbGUubG9nKGBhZnRlciBleGVjdXRpbmcgc3RhdGUgJHtKU09OLnN0cmluZ2lmeShzaGFyZWRTdGF0ZSl9YCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc2V0IG5hdmlnYXRpb24gc3RhdGUgdG8gcHJldmVudCBpbmZpbml0ZSBuYXZpZ2F0aW9uIGxvb3BzXG4gKiBDYWxsIHRoaXMgYWZ0ZXIgaW50ZXJjZXB0aW5nIGFuZCBoYW5kbGluZyBuYXZpZ2F0aW9uIGluIGV4cG8tcm91dGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldEdlbmllTmF2aWdhdGlvbigpIHtcbiAgZ2VuaWVEaXNwYXRjaCgoKSA9PiB7XG4gICAgY29uc3QgcmVhY3RHZW5pZVN0YXRlID0gc2hhcmVkU3RhdGUgYXMgUmVhY3RHZW5pZVN0YXRlO1xuICAgIHJlYWN0R2VuaWVTdGF0ZS5uYXZTdGF0ZSA9IHtcbiAgICAgIG9iamVjdFZpZXdDbGFzc05hbWU6IG51bGwsXG4gICAgICBvYmplY3RDb25zdHJ1Y3RvclBhcmFtczogbnVsbCxcbiAgICAgIHF1ZXJ5SW50ZW50OiBudWxsLFxuICAgICAgcmVzdWx0UmVmOiBudWxsLFxuICAgICAgcmVzdWx0T2JqZWN0VHlwZTogbnVsbCxcbiAgICB9O1xuICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxrQkFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsZ0JBQUEsR0FBQUQsT0FBQTtBQUtBLElBQUFFLFdBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLGNBQUEsR0FBQUgsT0FBQTtBQU9BLElBQUFJLE9BQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLE9BQUEsR0FBQUwsT0FBQTtBQUF3RSxTQUFBTSxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFB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LENBQUMsQ0FBQztVQUNKO1FBQ0Y7UUFFQSxJQUFJLENBQUNiLFFBQVEsSUFBSSxDQUFDRCxhQUFhLEVBQUU7VUFDL0J6QixlQUFlLENBQUM0QyxRQUFRLEdBQUc7WUFDekJDLG1CQUFtQixFQUFFdkIseUNBQXdCLENBQUN3QixhQUFhLENBQ3pEbkIsNEJBQ0YsQ0FBQyxDQUFDb0IsYUFBYTtZQUNmQyx1QkFBdUIsRUFDckJ0QyxvQkFBb0IsQ0FBQ2pMLE1BQU0sS0FBSyxDQUFDLEdBQzdCaUwsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMxSyxLQUFLLENBQUNnQixxQkFBcUIsQ0FBQyxDQUFDLEdBQ3JEO2NBQ0VpTSxRQUFRLEVBQUV2QyxvQkFBb0IsQ0FBQzdELEdBQUcsQ0FBRThELGdCQUFnQixJQUNsREEsZ0JBQWdCLENBQUMzSyxLQUFLLENBQUNnQixxQkFBcUIsQ0FBQyxDQUMvQztZQUNGLENBQUM7WUFDUGdLLFdBQVc7WUFDWGhJLFNBQVMsRUFBRXNKLFdBQVcsRUFBRXRKLFNBQVMsSUFBSSxJQUFJO1lBQ3pDMkosZ0JBQWdCLEVBQUUvQixvQkFBb0IsSUFBSTtVQUM1QyxDQUFDO1VBQ0RaLGVBQWUsQ0FBQzBDLFFBQVEsSUFBSSxDQUFDO1FBQy9CO01BQ0YsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQ0RRLEtBQUssQ0FBRXBMLEtBQUssSUFBSztNQUNoQkMsY0FBTSxDQUFDRCxLQUFLLENBQUMsNEJBQTRCLEVBQUVBLEtBQUssQ0FBQztNQUNqRCxJQUFBaUksNEJBQWEsRUFBQyxNQUFNO1FBQ2xCLE1BQU1DLGVBQWUsR0FBR0MsMEJBQThCO1FBQ3RERCxlQUFlLENBQUNyQixPQUFPLEdBQUdMLG1CQUFtQixDQUMzQyxPQUFPLEVBQ1AsT0FBTyxFQUNQLE1BQU0sRUFDTixLQUNGLENBQUM7TUFDSCxDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7O0lBRUo7RUFDRixDQUFDLENBQUM7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVM2RSxvQkFBb0JBLENBQUEsRUFBRztFQUNyQyxJQUFBcEQsNEJBQWEsRUFBQyxNQUFNO0lBQ2xCLE1BQU1DLGVBQWUsR0FBR0MsMEJBQThCO0lBQ3RERCxlQUFlLENBQUM0QyxRQUFRLEdBQUc7TUFDekJDLG1CQUFtQixFQUFFLElBQUk7TUFDekJHLHVCQUF1QixFQUFFLElBQUk7TUFDN0JoQyxXQUFXLEVBQUUsSUFBSTtNQUNqQmhJLFNBQVMsRUFBRSxJQUFJO01BQ2YySixnQkFBZ0IsRUFBRTtJQUNwQixDQUFDO0VBQ0gsQ0FBQyxDQUFDO0FBQ0oiLCJpZ25vcmVMaXN0IjpbXX0=