@nlabs/arkhamjs 3.25.0 → 3.26.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.
@@ -1,700 +0,0 @@
1
- var __create = Object.create;
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getProtoOf = Object.getPrototypeOf;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __copyProps = (to, from, except, desc) => {
8
- if (from && typeof from === "object" || typeof from === "function") {
9
- for (let key of __getOwnPropNames(from))
10
- if (!__hasOwnProp.call(to, key) && key !== except)
11
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
12
- }
13
- return to;
14
- };
15
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
16
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
17
- mod
18
- ));
19
- var import_debounce = __toESM(require("lodash/debounce"));
20
- var import_cloneDeep = __toESM(require("lodash/fp/cloneDeep"));
21
- var import_set = __toESM(require("lodash/fp/set"));
22
- var import_ArkhamConstants = require("../constants/ArkhamConstants");
23
- var import_Flux = require("./Flux");
24
- jest.mock("lodash/debounce");
25
- const initialState = {
26
- falsy: false,
27
- item: "default",
28
- testAction: "default",
29
- testUpdate: "default",
30
- zeroValue: 0
31
- };
32
- const helloStore = (type, data, state = initialState) => {
33
- switch (type) {
34
- case "TEST_EVENT":
35
- return (0, import_set.default)("testAction", data.testVar, state);
36
- default:
37
- return state;
38
- }
39
- };
40
- describe("Flux", () => {
41
- const consoleError = console.error;
42
- const consoleWarn = console.warn;
43
- const cfg = {
44
- name: "arkhamjsTest",
45
- stores: [helloStore]
46
- };
47
- let Flux;
48
- beforeAll(() => {
49
- console.error = jest.fn();
50
- console.warn = jest.fn();
51
- });
52
- beforeEach(async () => {
53
- Flux = new import_Flux.FluxFramework();
54
- await Flux.init(cfg, true);
55
- });
56
- afterAll(() => {
57
- console.error = consoleError;
58
- console.warn = consoleWarn;
59
- });
60
- describe("#addMiddleware", () => {
61
- describe("should apply pre-dispatch middleware", () => {
62
- const middleTest = "intercept object";
63
- const objMiddleware = {
64
- name: "objectMiddleware",
65
- preDispatch: (action) => ({ ...action, testVar: middleTest })
66
- };
67
- afterEach(() => {
68
- Flux.clearMiddleware();
69
- });
70
- it("should alter data before sending to stores", async () => {
71
- Flux.addMiddleware([objMiddleware]);
72
- Flux.setState("helloStore.testAction", "default");
73
- const preAction = await Flux.dispatch({ testVar: "hello world", type: "TEST_EVENT" });
74
- expect(Flux.getState("helloStore.testAction")).toEqual(middleTest);
75
- expect(preAction.testVar).toEqual(middleTest);
76
- });
77
- it("should handle error for middleware without a name", () => {
78
- const fn = () => Flux.addMiddleware([{ preDispatch: objMiddleware.preDispatch }]);
79
- expect(fn).toThrowError();
80
- });
81
- it("should handle error for incompatible middleware", () => {
82
- const fn = () => Flux.addMiddleware(["incorrect"]);
83
- expect(fn).toThrowError();
84
- });
85
- });
86
- describe("should apply pre-dispatch middleware as promise", () => {
87
- const middleTest = "intercept promise";
88
- beforeEach(() => {
89
- const promiseMiddleware = {
90
- name: "promiseMiddleware",
91
- preDispatch: (action) => Promise.resolve({ ...action, testVar: middleTest })
92
- };
93
- Flux.addMiddleware([promiseMiddleware]);
94
- });
95
- afterEach(() => {
96
- Flux.clearMiddleware();
97
- });
98
- it("should alter data before sending to stores", async () => {
99
- Flux.setState("helloStore.testAction", "default");
100
- const preAction = await Flux.dispatch({ testVar: "hello world", type: "TEST_EVENT" });
101
- expect(Flux.getState("helloStore.testAction")).toEqual(middleTest);
102
- expect(preAction.testVar).toEqual(middleTest);
103
- });
104
- });
105
- describe("should apply post dispatch middleware", () => {
106
- const middleTest = "intercept post";
107
- beforeEach(() => {
108
- const postMiddleware = {
109
- name: "postMiddleware",
110
- postDispatch: (action) => Promise.resolve({ ...action, testVar: middleTest })
111
- };
112
- Flux.addMiddleware([postMiddleware]);
113
- });
114
- afterEach(() => {
115
- Flux.clearMiddleware();
116
- });
117
- it("should alter store data", async () => {
118
- Flux.setState("helloStore.testAction", "default");
119
- const postAction = await Flux.dispatch({ testVar: "hello world", type: "TEST_EVENT" });
120
- expect(Flux.getState("helloStore.testAction")).toEqual("hello world");
121
- expect(postAction.testVar).toEqual(middleTest);
122
- });
123
- it("should handle no action error", async () => {
124
- await expect(Flux.dispatch(null)).rejects.toThrowError();
125
- });
126
- it("should handle pre dispatch error", async () => {
127
- const preMiddleware = {
128
- name: "errorMiddleware",
129
- preDispatch: () => Promise.reject(new Error("test"))
130
- };
131
- Flux.addMiddleware([preMiddleware]);
132
- await expect(Flux.dispatch({ type: "test" })).rejects.toThrowError();
133
- });
134
- it("should handle post dispatch error", async () => {
135
- const postMiddleware = {
136
- name: "errorMiddleware",
137
- postDispatch: () => Promise.reject(new Error("test"))
138
- };
139
- Flux.addMiddleware([postMiddleware]);
140
- await expect(Flux.dispatch({ type: "test" })).rejects.toThrowError();
141
- });
142
- });
143
- });
144
- describe("#addPlugin", () => {
145
- it("should add a plugin", () => {
146
- const addPluginKey = "addPlugin";
147
- const plugin = { method: () => {
148
- }, name: "demoPlugin" };
149
- const results = Flux[addPluginKey]("preDispatch", plugin);
150
- expect(results).toEqual([plugin]);
151
- });
152
- it("should skip plugin if already exists", () => {
153
- const addPluginKey = "addPlugin";
154
- const plugin = { method: () => {
155
- }, name: "demoPlugin" };
156
- Flux.middleware.preDispatchList = [plugin];
157
- const results = Flux[addPluginKey]("preDispatch", plugin);
158
- expect(results).toEqual([plugin]);
159
- });
160
- it("should handle undefined function", () => {
161
- const addPluginKey = "addPlugin";
162
- const fn = () => Flux[addPluginKey]("preDispatch", { method: "object" });
163
- expect(fn).toThrowError();
164
- });
165
- });
166
- describe("#clearAppData", () => {
167
- beforeEach(() => {
168
- Flux.setState("helloStore.item", "clear");
169
- });
170
- it("should reset the store data", async () => {
171
- await Flux.clearAppData();
172
- expect(Flux.getState(["helloStore", "item"])).toEqual("default");
173
- });
174
- it("should set data in storage", async () => {
175
- const retrnedValue = { hello: "world" };
176
- const setStorageData = jest.fn().mockResolvedValue(retrnedValue);
177
- Flux.options.storage = { setStorageData };
178
- const results = await Flux.clearAppData();
179
- expect(setStorageData.mock.calls.length).toEqual(1);
180
- expect(results).toEqual(retrnedValue);
181
- });
182
- });
183
- describe("#deregister", () => {
184
- it("should remove a state and store", () => {
185
- Flux.state = { hello: "world" };
186
- Flux.storeActions = { hello: "world" };
187
- Flux.deregister("hello");
188
- expect(Flux.state).toEqual({});
189
- expect(Flux.storeActions).toEqual({});
190
- });
191
- it("should use empty string as default", () => {
192
- const originalState = (0, import_cloneDeep.default)(Flux.state);
193
- Flux.deregister();
194
- expect(originalState).toEqual(Flux.state);
195
- });
196
- });
197
- describe("#dispatch", () => {
198
- let eventSpy;
199
- beforeEach(() => {
200
- eventSpy = jest.fn();
201
- Flux.on("TEST_EVENT", eventSpy);
202
- });
203
- afterEach(() => {
204
- Flux.off("TEST_EVENT", eventSpy);
205
- });
206
- it("should return an action", async () => {
207
- Flux.dispatch({ testVar: "test", type: "TEST_EVENT" });
208
- const action = await Flux.dispatch({ testVar: "test", type: "TEST_EVENT" });
209
- expect(action).toEqual({ testVar: "test", type: "TEST_EVENT" });
210
- });
211
- it("should alter the store data", () => {
212
- Flux.dispatch({ testVar: "test", type: "TEST_EVENT" });
213
- const item = Flux.getState("helloStore.testAction");
214
- expect(item).toEqual("test");
215
- });
216
- it("should dispatch an event", () => {
217
- Flux.dispatch({ testVar: "test", type: "TEST_EVENT" });
218
- expect(eventSpy.mock.calls.length).toEqual(1);
219
- });
220
- it("should not dispatch if no type", () => {
221
- Flux.dispatch({ testVar: "test" });
222
- expect(eventSpy.mock.calls.length).toEqual(0);
223
- });
224
- it("should not dispatch if silent", () => {
225
- Flux.dispatch({ testVar: "test", type: "TEST_EVENT" }, true);
226
- expect(eventSpy.mock.calls.length).toEqual(0);
227
- });
228
- it("should update storage", () => {
229
- Flux.updateStorage = jest.fn().mockResolvedValue({});
230
- Flux.options.storage = {};
231
- Flux.dispatch({ testVar: "test", type: "TEST_EVENT" });
232
- expect(Flux.updateStorage.mock.calls.length).toEqual(1);
233
- });
234
- it("should return updated state if action returns null", async () => {
235
- const nullStore = (type, data, state = initialState) => {
236
- switch (type) {
237
- case "TEST_NULL":
238
- return null;
239
- default:
240
- return state;
241
- }
242
- };
243
- await Flux.addStores([nullStore]);
244
- await Flux.dispatch({ testVar: "test", type: "TEST_NULL" });
245
- expect(Flux.state.nullStore).toEqual(initialState);
246
- });
247
- it("should return empty object if store returns null by default", async () => {
248
- const nullStore = (type, data, state) => {
249
- switch (type) {
250
- case "TEST_NULL":
251
- return null;
252
- default:
253
- return state;
254
- }
255
- };
256
- await Flux.addStores([nullStore]);
257
- Flux.state.nullStore = null;
258
- await Flux.dispatch({ testVar: "test", type: "TEST_NULL" });
259
- expect(Flux.state.nullStore).toEqual({});
260
- });
261
- });
262
- describe("#getOptions", () => {
263
- it("should get a options object", () => {
264
- const options = Flux.getOptions();
265
- const optionsKey = "options";
266
- expect(options).toEqual(Flux[optionsKey]);
267
- });
268
- });
269
- describe("#getState", () => {
270
- beforeEach(() => {
271
- const storeAction = Flux.getStore("helloStore");
272
- Flux.setState("helloStore", storeAction.initialState);
273
- });
274
- it("should get a global store", () => {
275
- const value = Flux.getState();
276
- expect(value.helloStore.item).toEqual("default");
277
- });
278
- it("should get a specific store returning an object", () => {
279
- const value = Flux.getState("helloStore");
280
- expect(value.item).toEqual("default");
281
- });
282
- it("should get a specific item within a store using array", () => {
283
- const value = Flux.getState(["helloStore", "item"]);
284
- expect(value).toEqual("default");
285
- });
286
- it("should get a specific item within a store using dot notation", () => {
287
- const value = Flux.getState("helloStore.item");
288
- expect(value).toEqual("default");
289
- });
290
- it("should return default value from a null item", () => {
291
- const value = Flux.getState("helloStore.notDefault", "");
292
- expect(value).toEqual("");
293
- });
294
- it("should return entire store object with empty key", () => {
295
- const value = Flux.getState("");
296
- expect(value).toEqual({ helloStore: initialState });
297
- });
298
- it("should return entire store object with null key", () => {
299
- const value = Flux.getState(null);
300
- expect(value).toEqual({ helloStore: initialState });
301
- });
302
- it("should return entire store object with undefined key", () => {
303
- const value = Flux.getState();
304
- expect(value).toEqual({ helloStore: initialState });
305
- });
306
- it("should return empty object if state is null", () => {
307
- Flux.state = null;
308
- const value = Flux.getState();
309
- expect(value).toEqual({});
310
- });
311
- it("should return a false value", () => {
312
- const value = Flux.getState("helloStore.falsy");
313
- expect(value).toEqual(false);
314
- });
315
- it("should return a zero value", () => {
316
- const value = Flux.getState("helloStore.zeroValue");
317
- expect(value).toEqual(0);
318
- });
319
- });
320
- describe("#getStore", () => {
321
- it("should get a store function", () => {
322
- const storeAction = Flux.getStore("helloStore");
323
- expect(storeAction.name).toEqual("helloStore");
324
- });
325
- it("should use empty string as default value", () => {
326
- const storeAction = Flux.getStore();
327
- expect(storeAction).toBeUndefined();
328
- });
329
- });
330
- describe("#init", () => {
331
- describe("set app name", () => {
332
- const opts = {
333
- name: "demo"
334
- };
335
- it("should update app name if initializing for the first time", async () => {
336
- const privateInit = "isInit";
337
- Flux[privateInit] = false;
338
- await Flux.init(opts);
339
- const optionsKey = "options";
340
- expect(Flux[optionsKey].name).toEqual("demo");
341
- });
342
- it("should not update app name if initializing again", async () => {
343
- const privateInit = "isInit";
344
- Flux[privateInit] = true;
345
- await Flux.init(opts);
346
- const optionsKey = "options";
347
- expect(Flux[optionsKey].name).toEqual("arkhamjsTest");
348
- });
349
- it("should add windows object for debugging", async () => {
350
- await Flux.init({ ...opts, debug: true });
351
- const debugKey = "arkhamjs";
352
- expect(window[debugKey]).toEqual(Flux);
353
- });
354
- it("should use default object if undefined", async () => {
355
- await Flux.reset();
356
- await Flux.init();
357
- const optionsKey = "options";
358
- const expectedOptions = {
359
- name: "arkhamjs",
360
- routerType: "browser",
361
- scrollToTop: true,
362
- state: null,
363
- storage: null,
364
- storageWait: 300,
365
- stores: [],
366
- title: "ArkhamJS"
367
- };
368
- expect(Flux[optionsKey]).toEqual(expectedOptions);
369
- });
370
- });
371
- describe("set app name for initialized app", () => {
372
- const opts = {
373
- name: "demo"
374
- };
375
- it("should set app name", async () => {
376
- await Flux.init(opts, true);
377
- const privateProperty = "options";
378
- expect(Flux[privateProperty].name).toEqual("demo");
379
- });
380
- });
381
- describe("set initial empty state", () => {
382
- const opts = {
383
- state: {},
384
- stores: [helloStore]
385
- };
386
- it("should set state", async () => {
387
- await Flux.init(opts, true);
388
- const privateProperty = "state";
389
- expect(Object.keys(Flux[privateProperty]).length).toEqual(1);
390
- });
391
- it("should set state branch for store", async () => {
392
- await Flux.init(opts, true);
393
- const privateProperty = "state";
394
- expect(Flux[privateProperty].helloStore.item).toEqual("default");
395
- });
396
- });
397
- describe("set null state", () => {
398
- const opts = {
399
- state: null,
400
- stores: [helloStore]
401
- };
402
- it("should set state", async () => {
403
- await Flux.init(opts, true);
404
- const privateProperty = "state";
405
- expect(Object.keys(Flux[privateProperty]).length).toEqual(1);
406
- });
407
- it("should set state branch for store", async () => {
408
- await Flux.init(opts, true);
409
- const privateProperty = "state";
410
- expect(Flux[privateProperty].helloStore.item).toEqual("default");
411
- });
412
- });
413
- describe("set defined state", () => {
414
- const opts = {
415
- state: { second: "value", test: { hello: "world" } },
416
- stores: [helloStore]
417
- };
418
- it("should set state", async () => {
419
- await Flux.init(opts, true);
420
- const privateProperty = "state";
421
- expect(Object.keys(Flux[privateProperty]).length).toEqual(3);
422
- });
423
- it("should set state branch for store", async () => {
424
- await Flux.init(opts, true);
425
- const privateProperty = "state";
426
- expect(Flux[privateProperty].test.hello).toEqual("world");
427
- });
428
- });
429
- describe("middleware", () => {
430
- const objMiddleware = {
431
- name: "objectMiddleware",
432
- preDispatch: (action) => ({ ...action })
433
- };
434
- const opts = {
435
- middleware: [objMiddleware],
436
- name: "demo",
437
- stores: [helloStore]
438
- };
439
- it("should add middleware", async () => {
440
- await Flux.init(opts, true);
441
- const privateProperty = "middleware";
442
- expect(Flux[privateProperty].preDispatchList[0].name).toEqual("objectMiddleware");
443
- });
444
- });
445
- describe("error handling", () => {
446
- it("should handle useStorage error", async () => {
447
- Flux.useStorage = Promise.reject(new Error("test"));
448
- await expect(Flux.init(cfg, true)).rejects.toThrowError();
449
- });
450
- it("should handle addStores error", async () => {
451
- Flux.addStores = Promise.reject(new Error("test"));
452
- await expect(Flux.init(cfg, true)).rejects.toThrowError();
453
- });
454
- });
455
- });
456
- describe("event listeners", () => {
457
- let eventSpy;
458
- beforeEach(() => {
459
- eventSpy = jest.fn();
460
- Flux.on("test", eventSpy);
461
- });
462
- describe("#on", () => {
463
- it("should add a listener", async () => {
464
- await Flux.dispatch({ type: "test" });
465
- expect(eventSpy.mock.calls.length).toEqual(1);
466
- });
467
- });
468
- describe("#off", () => {
469
- it("should remove a listener", async () => {
470
- Flux.off("test", eventSpy);
471
- await Flux.dispatch({ type: "test" });
472
- expect(eventSpy.mock.calls.length).toEqual(0);
473
- });
474
- });
475
- });
476
- describe("#addStores", () => {
477
- const demo = (type, data, state = { helloStore: "joker" }) => {
478
- if (type === "DEMO_TEST") {
479
- state.helloStore = data.helloStore;
480
- }
481
- return state;
482
- };
483
- it("should create and save a Store class", () => {
484
- Flux.addStores([demo]);
485
- const privateProperty = "storeActions";
486
- const storeAction = Flux[privateProperty].demo;
487
- expect(storeAction.name).toEqual("demo");
488
- });
489
- it("should set initial state", () => {
490
- Flux.addStores([demo]);
491
- const privateProperty = "storeActions";
492
- const storeAction = Flux[privateProperty].demo;
493
- expect(storeAction.initialState).toEqual({ helloStore: "joker" });
494
- });
495
- it("should handle unsupported stores", () => {
496
- const optionsKey = "options";
497
- const setStorageData = new Error("test");
498
- Flux[optionsKey].storage = { setStorageData };
499
- Flux.addStores([demo]);
500
- const privateProperty = "storeActions";
501
- const storeAction = Flux[privateProperty].demo;
502
- expect(storeAction.initialState).toEqual({ helloStore: "joker" });
503
- });
504
- });
505
- describe("#offInit", () => {
506
- it("should remove listener after initialization", () => {
507
- const listener = jest.fn();
508
- Flux.off = jest.fn();
509
- Flux.offInit(listener);
510
- expect(Flux.off.mock.calls.length).toEqual(1);
511
- expect(Flux.off.mock.calls[0][0]).toEqual(import_ArkhamConstants.ArkhamConstants.INIT);
512
- });
513
- });
514
- describe("#onInit", () => {
515
- it("should add listener after initialization", () => {
516
- const listener = jest.fn();
517
- Flux.isInit = false;
518
- Flux.on = jest.fn();
519
- Flux.onInit(listener);
520
- expect(Flux.on.mock.calls.length).toEqual(1);
521
- expect(Flux.on.mock.calls[0][0]).toEqual(import_ArkhamConstants.ArkhamConstants.INIT);
522
- });
523
- it("should dispatch instantly if already initialized", () => {
524
- const listener = jest.fn();
525
- Flux.isInit = true;
526
- Flux.onInit(listener);
527
- expect(listener.mock.calls.length).toEqual(1);
528
- });
529
- });
530
- describe("#register", () => {
531
- it("should register a store function", () => {
532
- const demoStore = (type, data, state = initialState) => {
533
- switch (type) {
534
- case "TEST_EVENT":
535
- return (0, import_set.default)("testAction", data.testVar, state);
536
- default:
537
- return state;
538
- }
539
- };
540
- const registerKey = "register";
541
- const storeAction = Flux[registerKey](demoStore);
542
- const expectedAction = {
543
- action: demoStore,
544
- initialState,
545
- name: "demoStore"
546
- };
547
- expect(storeAction).toEqual(expectedAction);
548
- });
549
- it("should register a store function without an initial value", () => {
550
- const demoStore = (type, data, state) => {
551
- switch (type) {
552
- case "TEST_EVENT":
553
- return (0, import_set.default)("testAction", data.testVar, state);
554
- default:
555
- return state;
556
- }
557
- };
558
- const registerKey = "register";
559
- const storeAction = Flux[registerKey](demoStore);
560
- const expectedAction = {
561
- action: demoStore,
562
- initialState: void 0,
563
- name: "demoStore"
564
- };
565
- expect(storeAction).toEqual(expectedAction);
566
- });
567
- it("should not save a store function without a name", () => {
568
- const registerKey = "register";
569
- const storeAction = Flux[registerKey]((type, data, state = initialState) => {
570
- switch (type) {
571
- case "TEST_EVENT":
572
- return (0, import_set.default)("testAction", data.testVar, state);
573
- default:
574
- return state;
575
- }
576
- });
577
- expect(storeAction).toBeUndefined();
578
- });
579
- it("should handle undefined function", () => {
580
- const registerKey = "register";
581
- const fn = () => Flux[registerKey]();
582
- expect(fn).toThrowError();
583
- });
584
- it("should handle argument that is not a function", () => {
585
- const registerKey = "register";
586
- const fn = () => Flux[registerKey]({});
587
- expect(fn).toThrowError();
588
- });
589
- });
590
- describe("#removeMiddleware", () => {
591
- beforeEach(() => {
592
- Flux.clearMiddleware();
593
- const objMiddleware = {
594
- name: "objectMiddleware",
595
- preDispatch: (action) => ({ ...action })
596
- };
597
- Flux.addMiddleware([objMiddleware]);
598
- });
599
- it("should alter data before sending to stores", () => {
600
- Flux.removeMiddleware(["objectMiddleware"]);
601
- const privateProperty = "middleware";
602
- expect(Flux[privateProperty].preDispatchList.length).toEqual(0);
603
- });
604
- });
605
- describe("#removePlugin", () => {
606
- it("should remove an existing plugin", () => {
607
- Flux.middleware.preDispatchList = [{ name: "demoPlugin" }, { name: "noNotRemovePlugin" }];
608
- expect(Flux.removePlugin("preDispatch", "demoPlugin")).toEqual([{ name: "noNotRemovePlugin" }]);
609
- });
610
- it("should get an undefined list", () => {
611
- Flux.middleware.preDispatchList = null;
612
- expect(Flux.removePlugin("preDispatch", "demoPlugin")).toEqual([]);
613
- });
614
- });
615
- describe("#removeStores", () => {
616
- beforeEach(() => {
617
- Flux.removeStores(["helloStore"]);
618
- });
619
- afterEach(() => {
620
- Flux.addStores([helloStore]);
621
- });
622
- it("should remove class", () => {
623
- const privateProperty = "storeActions";
624
- expect(!!Flux[privateProperty].helloStore).toEqual(false);
625
- });
626
- it("should remove store data", () => {
627
- const privateProperty = "state";
628
- expect(!!Flux[privateProperty].helloStore).toEqual(false);
629
- });
630
- });
631
- describe("#reset", () => {
632
- it("should handle argument that is not a function", async () => {
633
- const optionsKey = "options";
634
- const setStorageData = new Error("test");
635
- Flux[optionsKey].storage = { setStorageData };
636
- await expect(Flux.reset()).rejects.toThrowError();
637
- });
638
- });
639
- describe("#setState", () => {
640
- it("should update the property within the store", async () => {
641
- await Flux.setState("helloStore.testUpdate", "test");
642
- const newItem = await Flux.getState("helloStore.testUpdate");
643
- expect(newItem).toEqual("test");
644
- });
645
- it("should empty string as default path", async () => {
646
- await Flux.setState(void 0, "test");
647
- const newItem = await Flux.getState("helloStore");
648
- expect(newItem).toEqual(initialState);
649
- });
650
- it("should update storage", async () => {
651
- const optionsKey = "options";
652
- const updateStorageKey = "updateStorage";
653
- const updateStorage = jest.fn();
654
- Flux[optionsKey] = { storage: {} };
655
- Flux[updateStorageKey] = updateStorage;
656
- await Flux.setState("helloStore.testUpdate", "test");
657
- expect(updateStorage.mock.calls.length).toEqual(1);
658
- });
659
- });
660
- describe("#useStorage", () => {
661
- it("should update storage", async () => {
662
- const getStorageData = jest.fn();
663
- const optionsKey = "options";
664
- Flux[optionsKey].state = null;
665
- Flux[optionsKey].storage = { getStorageData };
666
- const useStorageKey = "useStorage";
667
- await Flux[useStorageKey]("helloStore");
668
- expect(getStorageData.mock.calls.length).toEqual(1);
669
- });
670
- it("without storage", async () => {
671
- const optionsKey = "options";
672
- Flux[optionsKey].state = { hello: "world" };
673
- Flux[optionsKey].storage = null;
674
- const useStorageKey = "useStorage";
675
- await Flux[useStorageKey]("helloStore");
676
- const stateKey = "state";
677
- expect(Flux[stateKey].hello).toEqual("world");
678
- });
679
- it("should handle storage errors", async () => {
680
- const optionsKey = "options";
681
- Flux[optionsKey].state = null;
682
- Flux[optionsKey].storage = new Error("test");
683
- const useStorageKey = "useStorage";
684
- await expect(Flux[useStorageKey]("helloStore")).rejects.toThrowError();
685
- });
686
- it("should debounce storage", async () => {
687
- const value = "test";
688
- const optionsKey = "options";
689
- Flux[optionsKey].state = { hello: "world" };
690
- const setStorageData = jest.fn().mockReturnValue(value);
691
- Flux[optionsKey].storage = { setStorageData };
692
- const debounceMock = import_debounce.default;
693
- debounceMock.mockImplementation((fn) => fn());
694
- const useStorageKey = "useStorage";
695
- await Flux[useStorageKey]("helloStore");
696
- expect(setStorageData.mock.calls.length).toEqual(1);
697
- });
698
- });
699
- });
700
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL0ZsdXgvRmx1eC50ZXN0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJ2xvZGFzaC9kZWJvdW5jZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC9mcC9jbG9uZURlZXAnO1xuaW1wb3J0IHNldCBmcm9tICdsb2Rhc2gvZnAvc2V0JztcblxuaW1wb3J0IHtBcmtoYW1Db25zdGFudHN9IGZyb20gJy4uL2NvbnN0YW50cy9BcmtoYW1Db25zdGFudHMnO1xuaW1wb3J0IHtGbHV4RnJhbWV3b3JrfSBmcm9tICcuL0ZsdXgnO1xuaW1wb3J0IHtGbHV4QWN0aW9uLCBGbHV4T3B0aW9ucywgRmx1eFN0b3JlfSBmcm9tICcuL0ZsdXgudHlwZXMnO1xuXG5qZXN0Lm1vY2soJ2xvZGFzaC9kZWJvdW5jZScpO1xuXG5jb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gIGZhbHN5OiBmYWxzZSxcbiAgaXRlbTogJ2RlZmF1bHQnLFxuICB0ZXN0QWN0aW9uOiAnZGVmYXVsdCcsXG4gIHRlc3RVcGRhdGU6ICdkZWZhdWx0JyxcbiAgemVyb1ZhbHVlOiAwXG59O1xuXG5jb25zdCBoZWxsb1N0b3JlID0gKHR5cGU6IHN0cmluZywgZGF0YSwgc3RhdGUgPSBpbml0aWFsU3RhdGUpOiBhbnkgPT4ge1xuICBzd2l0Y2godHlwZSkge1xuICAgIGNhc2UgJ1RFU1RfRVZFTlQnOlxuICAgICAgcmV0dXJuIHNldCgndGVzdEFjdGlvbicsIGRhdGEudGVzdFZhciwgc3RhdGUpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn07XG5cbmRlc2NyaWJlKCdGbHV4JywgKCkgPT4ge1xuICBjb25zdCBjb25zb2xlRXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICBjb25zdCBjb25zb2xlV2FybiA9IGNvbnNvbGUud2FybjtcbiAgY29uc3QgY2ZnOiBGbHV4T3B0aW9ucyA9IHtcbiAgICBuYW1lOiAnYXJraGFtanNUZXN0JyxcbiAgICBzdG9yZXM6IFtoZWxsb1N0b3JlXVxuICB9O1xuICBsZXQgRmx1eDtcblxuICBiZWZvcmVBbGwoKCkgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IgPSBqZXN0LmZuKCk7XG4gICAgY29uc29sZS53YXJuID0gamVzdC5mbigpO1xuICB9KTtcblxuICBiZWZvcmVFYWNoKGFzeW5jICgpID0+IHtcbiAgICBGbHV4ID0gbmV3IEZsdXhGcmFtZXdvcmsoKTtcblxuICAgIC8vIENvbmZpZ3VyZVxuICAgIGF3YWl0IEZsdXguaW5pdChjZmcsIHRydWUpO1xuICB9KTtcblxuICBhZnRlckFsbCgoKSA9PiB7XG4gICAgY29uc29sZS5lcnJvciA9IGNvbnNvbGVFcnJvcjtcbiAgICBjb25zb2xlLndhcm4gPSBjb25zb2xlV2FybjtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNhZGRNaWRkbGV3YXJlJywgKCkgPT4ge1xuICAgIGRlc2NyaWJlKCdzaG91bGQgYXBwbHkgcHJlLWRpc3BhdGNoIG1pZGRsZXdhcmUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtaWRkbGVUZXN0OiBzdHJpbmcgPSAnaW50ZXJjZXB0IG9iamVjdCc7XG5cbiAgICAgIC8vIEFkZCBvYmplY3QgbWlkZGxld2FyZVxuICAgICAgY29uc3Qgb2JqTWlkZGxld2FyZSA9IHtcbiAgICAgICAgbmFtZTogJ29iamVjdE1pZGRsZXdhcmUnLFxuICAgICAgICBwcmVEaXNwYXRjaDogKGFjdGlvbikgPT4gKHsuLi5hY3Rpb24sIHRlc3RWYXI6IG1pZGRsZVRlc3R9KVxuICAgICAgfTtcblxuICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgRmx1eC5jbGVhck1pZGRsZXdhcmUoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGFsdGVyIGRhdGEgYmVmb3JlIHNlbmRpbmcgdG8gc3RvcmVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBNZXRob2RcbiAgICAgICAgRmx1eC5hZGRNaWRkbGV3YXJlKFtvYmpNaWRkbGV3YXJlXSk7XG5cbiAgICAgICAgLy8gU2V0IHRlc3QgZGF0YVxuICAgICAgICBGbHV4LnNldFN0YXRlKCdoZWxsb1N0b3JlLnRlc3RBY3Rpb24nLCAnZGVmYXVsdCcpO1xuXG4gICAgICAgIC8vIERpc3BhdGNoIGFuIGFjdGlvblxuICAgICAgICBjb25zdCBwcmVBY3Rpb246IEZsdXhBY3Rpb24gPSBhd2FpdCBGbHV4LmRpc3BhdGNoKHt0ZXN0VmFyOiAnaGVsbG8gd29ybGQnLCB0eXBlOiAnVEVTVF9FVkVOVCd9KTtcblxuICAgICAgICBleHBlY3QoRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS50ZXN0QWN0aW9uJykpLnRvRXF1YWwobWlkZGxlVGVzdCk7XG4gICAgICAgIGV4cGVjdChwcmVBY3Rpb24udGVzdFZhcikudG9FcXVhbChtaWRkbGVUZXN0KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGhhbmRsZSBlcnJvciBmb3IgbWlkZGxld2FyZSB3aXRob3V0IGEgbmFtZScsICgpID0+IHtcbiAgICAgICAgY29uc3QgZm4gPSAoKSA9PiBGbHV4LmFkZE1pZGRsZXdhcmUoW3twcmVEaXNwYXRjaDogb2JqTWlkZGxld2FyZS5wcmVEaXNwYXRjaH1dKTtcbiAgICAgICAgZXhwZWN0KGZuKS50b1Rocm93RXJyb3IoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGhhbmRsZSBlcnJvciBmb3IgaW5jb21wYXRpYmxlIG1pZGRsZXdhcmUnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZuID0gKCkgPT4gRmx1eC5hZGRNaWRkbGV3YXJlKFsnaW5jb3JyZWN0J10pO1xuICAgICAgICBleHBlY3QoZm4pLnRvVGhyb3dFcnJvcigpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2hvdWxkIGFwcGx5IHByZS1kaXNwYXRjaCBtaWRkbGV3YXJlIGFzIHByb21pc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtaWRkbGVUZXN0OiBzdHJpbmcgPSAnaW50ZXJjZXB0IHByb21pc2UnO1xuXG4gICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgLy8gQWRkIG9iamVjdCBtaWRkbGV3YXJlXG4gICAgICAgIGNvbnN0IHByb21pc2VNaWRkbGV3YXJlID0ge1xuICAgICAgICAgIG5hbWU6ICdwcm9taXNlTWlkZGxld2FyZScsXG4gICAgICAgICAgcHJlRGlzcGF0Y2g6IChhY3Rpb24pID0+IFByb21pc2UucmVzb2x2ZSh7Li4uYWN0aW9uLCB0ZXN0VmFyOiBtaWRkbGVUZXN0fSlcbiAgICAgICAgfTtcblxuICAgICAgICBGbHV4LmFkZE1pZGRsZXdhcmUoW3Byb21pc2VNaWRkbGV3YXJlXSk7XG4gICAgICB9KTtcblxuICAgICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgRmx1eC5jbGVhck1pZGRsZXdhcmUoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGFsdGVyIGRhdGEgYmVmb3JlIHNlbmRpbmcgdG8gc3RvcmVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBTZXQgdGVzdCBkYXRhXG4gICAgICAgIEZsdXguc2V0U3RhdGUoJ2hlbGxvU3RvcmUudGVzdEFjdGlvbicsICdkZWZhdWx0Jyk7XG5cbiAgICAgICAgLy8gRGlzcGF0Y2ggYW4gYWN0aW9uXG4gICAgICAgIGNvbnN0IHByZUFjdGlvbjogRmx1eEFjdGlvbiA9IGF3YWl0IEZsdXguZGlzcGF0Y2goe3Rlc3RWYXI6ICdoZWxsbyB3b3JsZCcsIHR5cGU6ICdURVNUX0VWRU5UJ30pO1xuICAgICAgICBleHBlY3QoRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS50ZXN0QWN0aW9uJykpLnRvRXF1YWwobWlkZGxlVGVzdCk7XG4gICAgICAgIGV4cGVjdChwcmVBY3Rpb24udGVzdFZhcikudG9FcXVhbChtaWRkbGVUZXN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3Nob3VsZCBhcHBseSBwb3N0IGRpc3BhdGNoIG1pZGRsZXdhcmUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtaWRkbGVUZXN0OiBzdHJpbmcgPSAnaW50ZXJjZXB0IHBvc3QnO1xuXG4gICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgLy8gQWRkIG9iamVjdCBtaWRkbGV3YXJlXG4gICAgICAgIGNvbnN0IHBvc3RNaWRkbGV3YXJlID0ge1xuICAgICAgICAgIG5hbWU6ICdwb3N0TWlkZGxld2FyZScsXG4gICAgICAgICAgcG9zdERpc3BhdGNoOiAoYWN0aW9uKSA9PiBQcm9taXNlLnJlc29sdmUoey4uLmFjdGlvbiwgdGVzdFZhcjogbWlkZGxlVGVzdH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgRmx1eC5hZGRNaWRkbGV3YXJlKFtwb3N0TWlkZGxld2FyZV0pO1xuICAgICAgfSk7XG5cbiAgICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIEZsdXguY2xlYXJNaWRkbGV3YXJlKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBhbHRlciBzdG9yZSBkYXRhJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBTZXQgdGVzdCBkYXRhXG4gICAgICAgIEZsdXguc2V0U3RhdGUoJ2hlbGxvU3RvcmUudGVzdEFjdGlvbicsICdkZWZhdWx0Jyk7XG5cbiAgICAgICAgLy8gRGlzcGF0Y2ggYW4gYWN0aW9uXG4gICAgICAgIGNvbnN0IHBvc3RBY3Rpb246IEZsdXhBY3Rpb24gPSBhd2FpdCBGbHV4LmRpc3BhdGNoKHt0ZXN0VmFyOiAnaGVsbG8gd29ybGQnLCB0eXBlOiAnVEVTVF9FVkVOVCd9KTtcblxuICAgICAgICBleHBlY3QoRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS50ZXN0QWN0aW9uJykpLnRvRXF1YWwoJ2hlbGxvIHdvcmxkJyk7XG4gICAgICAgIGV4cGVjdChwb3N0QWN0aW9uLnRlc3RWYXIpLnRvRXF1YWwobWlkZGxlVGVzdCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgbm8gYWN0aW9uIGVycm9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBleHBlY3QoRmx1eC5kaXNwYXRjaChudWxsKSkucmVqZWN0cy50b1Rocm93RXJyb3IoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGhhbmRsZSBwcmUgZGlzcGF0Y2ggZXJyb3InLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZU1pZGRsZXdhcmUgPSB7XG4gICAgICAgICAgbmFtZTogJ2Vycm9yTWlkZGxld2FyZScsXG4gICAgICAgICAgcHJlRGlzcGF0Y2g6ICgpID0+IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigndGVzdCcpKVxuICAgICAgICB9O1xuICAgICAgICBGbHV4LmFkZE1pZGRsZXdhcmUoW3ByZU1pZGRsZXdhcmVdKTtcbiAgICAgICAgYXdhaXQgZXhwZWN0KEZsdXguZGlzcGF0Y2goe3R5cGU6ICd0ZXN0J30pKS5yZWplY3RzLnRvVGhyb3dFcnJvcigpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgaGFuZGxlIHBvc3QgZGlzcGF0Y2ggZXJyb3InLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvc3RNaWRkbGV3YXJlID0ge1xuICAgICAgICAgIG5hbWU6ICdlcnJvck1pZGRsZXdhcmUnLFxuICAgICAgICAgIHBvc3REaXNwYXRjaDogKCkgPT4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCd0ZXN0JykpXG4gICAgICAgIH07XG4gICAgICAgIEZsdXguYWRkTWlkZGxld2FyZShbcG9zdE1pZGRsZXdhcmVdKTtcbiAgICAgICAgYXdhaXQgZXhwZWN0KEZsdXguZGlzcGF0Y2goe3R5cGU6ICd0ZXN0J30pKS5yZWplY3RzLnRvVGhyb3dFcnJvcigpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjYWRkUGx1Z2luJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYWRkIGEgcGx1Z2luJywgKCkgPT4ge1xuICAgICAgY29uc3QgYWRkUGx1Z2luS2V5OiBzdHJpbmcgPSAnYWRkUGx1Z2luJztcbiAgICAgIGNvbnN0IHBsdWdpbiA9IHttZXRob2Q6ICgpID0+IHt9LCBuYW1lOiAnZGVtb1BsdWdpbid9O1xuICAgICAgY29uc3QgcmVzdWx0cyA9IEZsdXhbYWRkUGx1Z2luS2V5XSgncHJlRGlzcGF0Y2gnLCBwbHVnaW4pO1xuICAgICAgZXhwZWN0KHJlc3VsdHMpLnRvRXF1YWwoW3BsdWdpbl0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBza2lwIHBsdWdpbiBpZiBhbHJlYWR5IGV4aXN0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IGFkZFBsdWdpbktleTogc3RyaW5nID0gJ2FkZFBsdWdpbic7XG4gICAgICBjb25zdCBwbHVnaW4gPSB7bWV0aG9kOiAoKSA9PiB7fSwgbmFtZTogJ2RlbW9QbHVnaW4nfTtcbiAgICAgIEZsdXgubWlkZGxld2FyZS5wcmVEaXNwYXRjaExpc3QgPSBbcGx1Z2luXTtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBGbHV4W2FkZFBsdWdpbktleV0oJ3ByZURpc3BhdGNoJywgcGx1Z2luKTtcbiAgICAgIGV4cGVjdChyZXN1bHRzKS50b0VxdWFsKFtwbHVnaW5dKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHVuZGVmaW5lZCBmdW5jdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IGFkZFBsdWdpbktleTogc3RyaW5nID0gJ2FkZFBsdWdpbic7XG4gICAgICBjb25zdCBmbiA9ICgpID0+IEZsdXhbYWRkUGx1Z2luS2V5XSgncHJlRGlzcGF0Y2gnLCB7bWV0aG9kOiAnb2JqZWN0J30pO1xuICAgICAgZXhwZWN0KGZuKS50b1Rocm93RXJyb3IoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNjbGVhckFwcERhdGEnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAvLyBTZXQgdGVzdCBkYXRhXG4gICAgICBGbHV4LnNldFN0YXRlKCdoZWxsb1N0b3JlLml0ZW0nLCAnY2xlYXInKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVzZXQgdGhlIHN0b3JlIGRhdGEnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBNZXRob2RcbiAgICAgIGF3YWl0IEZsdXguY2xlYXJBcHBEYXRhKCk7XG5cbiAgICAgIGV4cGVjdChGbHV4LmdldFN0YXRlKFsnaGVsbG9TdG9yZScsICdpdGVtJ10pKS50b0VxdWFsKCdkZWZhdWx0Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBkYXRhIGluIHN0b3JhZ2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXRybmVkVmFsdWUgPSB7aGVsbG86ICd3b3JsZCd9O1xuICAgICAgY29uc3Qgc2V0U3RvcmFnZURhdGEgPSBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUocmV0cm5lZFZhbHVlKTtcbiAgICAgIEZsdXgub3B0aW9ucy5zdG9yYWdlID0ge3NldFN0b3JhZ2VEYXRhfTtcblxuICAgICAgLy8gTWV0aG9kXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgRmx1eC5jbGVhckFwcERhdGEoKTtcblxuICAgICAgZXhwZWN0KHNldFN0b3JhZ2VEYXRhLm1vY2suY2FsbHMubGVuZ3RoKS50b0VxdWFsKDEpO1xuICAgICAgZXhwZWN0KHJlc3VsdHMpLnRvRXF1YWwocmV0cm5lZFZhbHVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNkZXJlZ2lzdGVyJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVtb3ZlIGEgc3RhdGUgYW5kIHN0b3JlJywgKCkgPT4ge1xuICAgICAgRmx1eC5zdGF0ZSA9IHtoZWxsbzogJ3dvcmxkJ307XG4gICAgICBGbHV4LnN0b3JlQWN0aW9ucyA9IHtoZWxsbzogJ3dvcmxkJ307XG4gICAgICBGbHV4LmRlcmVnaXN0ZXIoJ2hlbGxvJyk7XG4gICAgICBleHBlY3QoRmx1eC5zdGF0ZSkudG9FcXVhbCh7fSk7XG4gICAgICBleHBlY3QoRmx1eC5zdG9yZUFjdGlvbnMpLnRvRXF1YWwoe30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2UgZW1wdHkgc3RyaW5nIGFzIGRlZmF1bHQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvcmlnaW5hbFN0YXRlID0gY2xvbmVEZWVwKEZsdXguc3RhdGUpO1xuICAgICAgRmx1eC5kZXJlZ2lzdGVyKCk7XG4gICAgICBleHBlY3Qob3JpZ2luYWxTdGF0ZSkudG9FcXVhbChGbHV4LnN0YXRlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNkaXNwYXRjaCcsICgpID0+IHtcbiAgICBsZXQgZXZlbnRTcHk7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIC8vIFNweVxuICAgICAgZXZlbnRTcHkgPSBqZXN0LmZuKCk7XG4gICAgICBGbHV4Lm9uKCdURVNUX0VWRU5UJywgZXZlbnRTcHkpO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgIEZsdXgub2ZmKCdURVNUX0VWRU5UJywgZXZlbnRTcHkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gTWV0aG9kXG4gICAgICBGbHV4LmRpc3BhdGNoKHt0ZXN0VmFyOiAndGVzdCcsIHR5cGU6ICdURVNUX0VWRU5UJ30pO1xuXG4gICAgICBjb25zdCBhY3Rpb246IGFueSA9IGF3YWl0IEZsdXguZGlzcGF0Y2goe3Rlc3RWYXI6ICd0ZXN0JywgdHlwZTogJ1RFU1RfRVZFTlQnfSk7XG4gICAgICBleHBlY3QoYWN0aW9uKS50b0VxdWFsKHt0ZXN0VmFyOiAndGVzdCcsIHR5cGU6ICdURVNUX0VWRU5UJ30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhbHRlciB0aGUgc3RvcmUgZGF0YScsICgpID0+IHtcbiAgICAgIC8vIE1ldGhvZFxuICAgICAgRmx1eC5kaXNwYXRjaCh7dGVzdFZhcjogJ3Rlc3QnLCB0eXBlOiAnVEVTVF9FVkVOVCd9KTtcblxuICAgICAgY29uc3QgaXRlbTogc3RyaW5nID0gRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS50ZXN0QWN0aW9uJyk7XG4gICAgICBleHBlY3QoaXRlbSkudG9FcXVhbCgndGVzdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkaXNwYXRjaCBhbiBldmVudCcsICgpID0+IHtcbiAgICAgIC8vIE1ldGhvZFxuICAgICAgRmx1eC5kaXNwYXRjaCh7dGVzdFZhcjogJ3Rlc3QnLCB0eXBlOiAnVEVTVF9FVkVOVCd9KTtcblxuICAgICAgZXhwZWN0KGV2ZW50U3B5Lm1vY2suY2FsbHMubGVuZ3RoKS50b0VxdWFsKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgZGlzcGF0Y2ggaWYgbm8gdHlwZScsICgpID0+IHtcbiAgICAgIC8vIE1ldGhvZFxuICAgICAgRmx1eC5kaXNwYXRjaCh7dGVzdFZhcjogJ3Rlc3QnfSk7XG5cbiAgICAgIGV4cGVjdChldmVudFNweS5tb2NrLmNhbGxzLmxlbmd0aCkudG9FcXVhbCgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IGRpc3BhdGNoIGlmIHNpbGVudCcsICgpID0+IHtcbiAgICAgIC8vIE1ldGhvZFxuICAgICAgRmx1eC5kaXNwYXRjaCh7dGVzdFZhcjogJ3Rlc3QnLCB0eXBlOiAnVEVTVF9FVkVOVCd9LCB0cnVlKTtcblxuICAgICAgZXhwZWN0KGV2ZW50U3B5Lm1vY2suY2FsbHMubGVuZ3RoKS50b0VxdWFsKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB1cGRhdGUgc3RvcmFnZScsICgpID0+IHtcbiAgICAgIEZsdXgudXBkYXRlU3RvcmFnZSA9IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7fSk7XG4gICAgICBGbHV4Lm9wdGlvbnMuc3RvcmFnZSA9IHt9O1xuXG4gICAgICAvLyBNZXRob2RcbiAgICAgIEZsdXguZGlzcGF0Y2goe3Rlc3RWYXI6ICd0ZXN0JywgdHlwZTogJ1RFU1RfRVZFTlQnfSk7XG5cbiAgICAgIGV4cGVjdChGbHV4LnVwZGF0ZVN0b3JhZ2UubW9jay5jYWxscy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB1cGRhdGVkIHN0YXRlIGlmIGFjdGlvbiByZXR1cm5zIG51bGwnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBBZGQgbnVsbCBzdG9yZVxuICAgICAgY29uc3QgbnVsbFN0b3JlID0gKHR5cGU6IHN0cmluZywgZGF0YSwgc3RhdGUgPSBpbml0aWFsU3RhdGUpOiBhbnkgPT4ge1xuICAgICAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICAgIGNhc2UgJ1RFU1RfTlVMTCc6XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgYXdhaXQgRmx1eC5hZGRTdG9yZXMoW251bGxTdG9yZV0pO1xuXG4gICAgICAvLyBNZXRob2RcbiAgICAgIGF3YWl0IEZsdXguZGlzcGF0Y2goe3Rlc3RWYXI6ICd0ZXN0JywgdHlwZTogJ1RFU1RfTlVMTCd9KTtcblxuICAgICAgZXhwZWN0KEZsdXguc3RhdGUubnVsbFN0b3JlKS50b0VxdWFsKGluaXRpYWxTdGF0ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBlbXB0eSBvYmplY3QgaWYgc3RvcmUgcmV0dXJucyBudWxsIGJ5IGRlZmF1bHQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBBZGQgbnVsbCBzdG9yZVxuICAgICAgY29uc3QgbnVsbFN0b3JlID0gKHR5cGU6IHN0cmluZywgZGF0YSwgc3RhdGUpOiBhbnkgPT4ge1xuICAgICAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICAgIGNhc2UgJ1RFU1RfTlVMTCc6XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgYXdhaXQgRmx1eC5hZGRTdG9yZXMoW251bGxTdG9yZV0pO1xuICAgICAgRmx1eC5zdGF0ZS5udWxsU3RvcmUgPSBudWxsO1xuXG4gICAgICAvLyBNZXRob2RcbiAgICAgIGF3YWl0IEZsdXguZGlzcGF0Y2goe3Rlc3RWYXI6ICd0ZXN0JywgdHlwZTogJ1RFU1RfTlVMTCd9KTtcblxuICAgICAgZXhwZWN0KEZsdXguc3RhdGUubnVsbFN0b3JlKS50b0VxdWFsKHt9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNnZXRPcHRpb25zJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZ2V0IGEgb3B0aW9ucyBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zID0gRmx1eC5nZXRPcHRpb25zKCk7XG4gICAgICBjb25zdCBvcHRpb25zS2V5OiBzdHJpbmcgPSAnb3B0aW9ucyc7XG4gICAgICBleHBlY3Qob3B0aW9ucykudG9FcXVhbChGbHV4W29wdGlvbnNLZXldKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNnZXRTdGF0ZScsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlQWN0aW9uID0gRmx1eC5nZXRTdG9yZSgnaGVsbG9TdG9yZScpO1xuICAgICAgRmx1eC5zZXRTdGF0ZSgnaGVsbG9TdG9yZScsIHN0b3JlQWN0aW9uLmluaXRpYWxTdGF0ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdldCBhIGdsb2JhbCBzdG9yZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gRmx1eC5nZXRTdGF0ZSgpO1xuICAgICAgZXhwZWN0KHZhbHVlLmhlbGxvU3RvcmUuaXRlbSkudG9FcXVhbCgnZGVmYXVsdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZXQgYSBzcGVjaWZpYyBzdG9yZSByZXR1cm5pbmcgYW4gb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBGbHV4LmdldFN0YXRlKCdoZWxsb1N0b3JlJyk7XG4gICAgICBleHBlY3QodmFsdWUuaXRlbSkudG9FcXVhbCgnZGVmYXVsdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZXQgYSBzcGVjaWZpYyBpdGVtIHdpdGhpbiBhIHN0b3JlIHVzaW5nIGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWU6IHN0cmluZyA9IEZsdXguZ2V0U3RhdGUoWydoZWxsb1N0b3JlJywgJ2l0ZW0nXSk7XG4gICAgICBleHBlY3QodmFsdWUpLnRvRXF1YWwoJ2RlZmF1bHQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2V0IGEgc3BlY2lmaWMgaXRlbSB3aXRoaW4gYSBzdG9yZSB1c2luZyBkb3Qgbm90YXRpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZTogc3RyaW5nID0gRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS5pdGVtJyk7XG4gICAgICBleHBlY3QodmFsdWUpLnRvRXF1YWwoJ2RlZmF1bHQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGRlZmF1bHQgdmFsdWUgZnJvbSBhIG51bGwgaXRlbScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlOiBzdHJpbmcgPSBGbHV4LmdldFN0YXRlKCdoZWxsb1N0b3JlLm5vdERlZmF1bHQnLCAnJyk7XG4gICAgICBleHBlY3QodmFsdWUpLnRvRXF1YWwoJycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZW50aXJlIHN0b3JlIG9iamVjdCB3aXRoIGVtcHR5IGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlOiBzdHJpbmcgPSBGbHV4LmdldFN0YXRlKCcnKTtcbiAgICAgIGV4cGVjdCh2YWx1ZSkudG9FcXVhbCh7aGVsbG9TdG9yZTogaW5pdGlhbFN0YXRlfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBlbnRpcmUgc3RvcmUgb2JqZWN0IHdpdGggbnVsbCBrZXknLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZTogc3RyaW5nID0gRmx1eC5nZXRTdGF0ZShudWxsKTtcbiAgICAgIGV4cGVjdCh2YWx1ZSkudG9FcXVhbCh7aGVsbG9TdG9yZTogaW5pdGlhbFN0YXRlfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBlbnRpcmUgc3RvcmUgb2JqZWN0IHdpdGggdW5kZWZpbmVkIGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlOiBzdHJpbmcgPSBGbHV4LmdldFN0YXRlKCk7XG4gICAgICBleHBlY3QodmFsdWUpLnRvRXF1YWwoe2hlbGxvU3RvcmU6IGluaXRpYWxTdGF0ZX0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZW1wdHkgb2JqZWN0IGlmIHN0YXRlIGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBGbHV4LnN0YXRlID0gbnVsbDtcbiAgICAgIGNvbnN0IHZhbHVlOiBzdHJpbmcgPSBGbHV4LmdldFN0YXRlKCk7XG4gICAgICBleHBlY3QodmFsdWUpLnRvRXF1YWwoe30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBmYWxzZSB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS5mYWxzeScpO1xuICAgICAgZXhwZWN0KHZhbHVlKS50b0VxdWFsKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgemVybyB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS56ZXJvVmFsdWUnKTtcbiAgICAgIGV4cGVjdCh2YWx1ZSkudG9FcXVhbCgwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNnZXRTdG9yZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGdldCBhIHN0b3JlIGZ1bmN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RvcmVBY3Rpb24gPSBGbHV4LmdldFN0b3JlKCdoZWxsb1N0b3JlJyk7XG4gICAgICBleHBlY3Qoc3RvcmVBY3Rpb24ubmFtZSkudG9FcXVhbCgnaGVsbG9TdG9yZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2UgZW1wdHkgc3RyaW5nIGFzIGRlZmF1bHQgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzdG9yZUFjdGlvbiA9IEZsdXguZ2V0U3RvcmUoKTtcbiAgICAgIGV4cGVjdChzdG9yZUFjdGlvbikudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnI2luaXQnLCAoKSA9PiB7XG4gICAgZGVzY3JpYmUoJ3NldCBhcHAgbmFtZScsICgpID0+IHtcbiAgICAgIC8vIFZhcnNcbiAgICAgIGNvbnN0IG9wdHM6IEZsdXhPcHRpb25zID0ge1xuICAgICAgICBuYW1lOiAnZGVtbydcbiAgICAgIH07XG5cbiAgICAgIGl0KCdzaG91bGQgdXBkYXRlIGFwcCBuYW1lIGlmIGluaXRpYWxpemluZyBmb3IgdGhlIGZpcnN0IHRpbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHByaXZhdGVJbml0OiBzdHJpbmcgPSAnaXNJbml0JztcbiAgICAgICAgRmx1eFtwcml2YXRlSW5pdF0gPSBmYWxzZTtcblxuICAgICAgICAvLyBNZXRob2RcbiAgICAgICAgYXdhaXQgRmx1eC5pbml0KG9wdHMpO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnNLZXk6IHN0cmluZyA9ICdvcHRpb25zJztcbiAgICAgICAgZXhwZWN0KEZsdXhbb3B0aW9uc0tleV0ubmFtZSkudG9FcXVhbCgnZGVtbycpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbm90IHVwZGF0ZSBhcHAgbmFtZSBpZiBpbml0aWFsaXppbmcgYWdhaW4nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHByaXZhdGVJbml0OiBzdHJpbmcgPSAnaXNJbml0JztcbiAgICAgICAgRmx1eFtwcml2YXRlSW5pdF0gPSB0cnVlO1xuXG4gICAgICAgIC8vIE1ldGhvZFxuICAgICAgICBhd2FpdCBGbHV4LmluaXQob3B0cyk7XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uc0tleTogc3RyaW5nID0gJ29wdGlvbnMnO1xuICAgICAgICBleHBlY3QoRmx1eFtvcHRpb25zS2V5XS5uYW1lKS50b0VxdWFsKCdhcmtoYW1qc1Rlc3QnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGFkZCB3aW5kb3dzIG9iamVjdCBmb3IgZGVidWdnaW5nJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBNZXRob2RcbiAgICAgICAgYXdhaXQgRmx1eC5pbml0KHsuLi5vcHRzLCBkZWJ1ZzogdHJ1ZX0pO1xuXG4gICAgICAgIGNvbnN0IGRlYnVnS2V5OiBzdHJpbmcgPSAnYXJraGFtanMnO1xuICAgICAgICBleHBlY3Qod2luZG93W2RlYnVnS2V5XSkudG9FcXVhbChGbHV4KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHVzZSBkZWZhdWx0IG9iamVjdCBpZiB1bmRlZmluZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIE1ldGhvZFxuICAgICAgICBhd2FpdCBGbHV4LnJlc2V0KCk7XG4gICAgICAgIGF3YWl0IEZsdXguaW5pdCgpO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnNLZXk6IHN0cmluZyA9ICdvcHRpb25zJztcbiAgICAgICAgY29uc3QgZXhwZWN0ZWRPcHRpb25zID0ge1xuICAgICAgICAgIG5hbWU6ICdhcmtoYW1qcycsXG4gICAgICAgICAgcm91dGVyVHlwZTogJ2Jyb3dzZXInLFxuICAgICAgICAgIHNjcm9sbFRvVG9wOiB0cnVlLFxuICAgICAgICAgIHN0YXRlOiBudWxsLFxuICAgICAgICAgIHN0b3JhZ2U6IG51bGwsXG4gICAgICAgICAgc3RvcmFnZVdhaXQ6IDMwMCxcbiAgICAgICAgICBzdG9yZXM6IFtdLFxuICAgICAgICAgIHRpdGxlOiAnQXJraGFtSlMnXG4gICAgICAgIH07XG4gICAgICAgIGV4cGVjdChGbHV4W29wdGlvbnNLZXldKS50b0VxdWFsKGV4cGVjdGVkT3B0aW9ucyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzZXQgYXBwIG5hbWUgZm9yIGluaXRpYWxpemVkIGFwcCcsICgpID0+IHtcbiAgICAgIC8vIFZhcnNcbiAgICAgIGNvbnN0IG9wdHM6IEZsdXhPcHRpb25zID0ge1xuICAgICAgICBuYW1lOiAnZGVtbydcbiAgICAgIH07XG5cbiAgICAgIGl0KCdzaG91bGQgc2V0IGFwcCBuYW1lJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBGbHV4LmluaXQob3B0cywgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHByaXZhdGVQcm9wZXJ0eTogc3RyaW5nID0gJ29wdGlvbnMnO1xuICAgICAgICBleHBlY3QoRmx1eFtwcml2YXRlUHJvcGVydHldLm5hbWUpLnRvRXF1YWwoJ2RlbW8nKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NldCBpbml0aWFsIGVtcHR5IHN0YXRlJywgKCkgPT4ge1xuICAgICAgLy8gVmFyc1xuICAgICAgY29uc3Qgb3B0czogRmx1eE9wdGlvbnMgPSB7XG4gICAgICAgIHN0YXRlOiB7fSxcbiAgICAgICAgc3RvcmVzOiBbaGVsbG9TdG9yZV1cbiAgICAgIH07XG5cbiAgICAgIGl0KCdzaG91bGQgc2V0IHN0YXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBGbHV4LmluaXQob3B0cywgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHByaXZhdGVQcm9wZXJ0eTogc3RyaW5nID0gJ3N0YXRlJztcbiAgICAgICAgZXhwZWN0KE9iamVjdC5rZXlzKEZsdXhbcHJpdmF0ZVByb3BlcnR5XSkubGVuZ3RoKS50b0VxdWFsKDEpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgc2V0IHN0YXRlIGJyYW5jaCBmb3Igc3RvcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IEZsdXguaW5pdChvcHRzLCB0cnVlKTtcbiAgICAgICAgY29uc3QgcHJpdmF0ZVByb3BlcnR5OiBzdHJpbmcgPSAnc3RhdGUnO1xuICAgICAgICBleHBlY3QoRmx1eFtwcml2YXRlUHJvcGVydHldLmhlbGxvU3RvcmUuaXRlbSkudG9FcXVhbCgnZGVmYXVsdCcpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2V0IG51bGwgc3RhdGUnLCAoKSA9PiB7XG4gICAgICAvLyBWYXJzXG4gICAgICBjb25zdCBvcHRzOiBGbHV4T3B0aW9ucyA9IHtcbiAgICAgICAgc3RhdGU6IG51bGwsXG4gICAgICAgIHN0b3JlczogW2hlbGxvU3RvcmVdXG4gICAgICB9O1xuXG4gICAgICBpdCgnc2hvdWxkIHNldCBzdGF0ZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgRmx1eC5pbml0KG9wdHMsIHRydWUpO1xuICAgICAgICBjb25zdCBwcml2YXRlUHJvcGVydHk6IHN0cmluZyA9ICdzdGF0ZSc7XG4gICAgICAgIGV4cGVjdChPYmplY3Qua2V5cyhGbHV4W3ByaXZhdGVQcm9wZXJ0eV0pLmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHNldCBzdGF0ZSBicmFuY2ggZm9yIHN0b3JlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBGbHV4LmluaXQob3B0cywgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHByaXZhdGVQcm9wZXJ0eTogc3RyaW5nID0gJ3N0YXRlJztcbiAgICAgICAgZXhwZWN0KEZsdXhbcHJpdmF0ZVByb3BlcnR5XS5oZWxsb1N0b3JlLml0ZW0pLnRvRXF1YWwoJ2RlZmF1bHQnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NldCBkZWZpbmVkIHN0YXRlJywgKCkgPT4ge1xuICAgICAgLy8gVmFyc1xuICAgICAgY29uc3Qgb3B0czogRmx1eE9wdGlvbnMgPSB7XG4gICAgICAgIHN0YXRlOiB7c2Vjb25kOiAndmFsdWUnLCB0ZXN0OiB7aGVsbG86ICd3b3JsZCd9fSxcbiAgICAgICAgc3RvcmVzOiBbaGVsbG9TdG9yZV1cbiAgICAgIH07XG5cbiAgICAgIGl0KCdzaG91bGQgc2V0IHN0YXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBGbHV4LmluaXQob3B0cywgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHByaXZhdGVQcm9wZXJ0eTogc3RyaW5nID0gJ3N0YXRlJztcbiAgICAgICAgZXhwZWN0KE9iamVjdC5rZXlzKEZsdXhbcHJpdmF0ZVByb3BlcnR5XSkubGVuZ3RoKS50b0VxdWFsKDMpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgc2V0IHN0YXRlIGJyYW5jaCBmb3Igc3RvcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IEZsdXguaW5pdChvcHRzLCB0cnVlKTtcbiAgICAgICAgY29uc3QgcHJpdmF0ZVByb3BlcnR5OiBzdHJpbmcgPSAnc3RhdGUnO1xuICAgICAgICBleHBlY3QoRmx1eFtwcml2YXRlUHJvcGVydHldLnRlc3QuaGVsbG8pLnRvRXF1YWwoJ3dvcmxkJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdtaWRkbGV3YXJlJywgKCkgPT4ge1xuICAgICAgLy8gTWlkZGxld2FyZSBvYmplY3RcbiAgICAgIGNvbnN0IG9iak1pZGRsZXdhcmUgPSB7XG4gICAgICAgIG5hbWU6ICdvYmplY3RNaWRkbGV3YXJlJyxcbiAgICAgICAgcHJlRGlzcGF0Y2g6IChhY3Rpb24pID0+ICh7Li4uYWN0aW9ufSlcbiAgICAgIH07XG5cbiAgICAgIC8vIFZhcnNcbiAgICAgIGNvbnN0IG9wdHM6IEZsdXhPcHRpb25zID0ge1xuICAgICAgICBtaWRkbGV3YXJlOiBbb2JqTWlkZGxld2FyZV0sXG4gICAgICAgIG5hbWU6ICdkZW1vJyxcbiAgICAgICAgc3RvcmVzOiBbaGVsbG9TdG9yZV1cbiAgICAgIH07XG5cbiAgICAgIGl0KCdzaG91bGQgYWRkIG1pZGRsZXdhcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IEZsdXguaW5pdChvcHRzLCB0cnVlKTtcbiAgICAgICAgY29uc3QgcHJpdmF0ZVByb3BlcnR5OiBzdHJpbmcgPSAnbWlkZGxld2FyZSc7XG4gICAgICAgIGV4cGVjdChGbHV4W3ByaXZhdGVQcm9wZXJ0eV0ucHJlRGlzcGF0Y2hMaXN0WzBdLm5hbWUpLnRvRXF1YWwoJ29iamVjdE1pZGRsZXdhcmUnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2Vycm9yIGhhbmRsaW5nJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgdXNlU3RvcmFnZSBlcnJvcicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgRmx1eC51c2VTdG9yYWdlID0gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCd0ZXN0JykpO1xuICAgICAgICBhd2FpdCBleHBlY3QoRmx1eC5pbml0KGNmZywgdHJ1ZSkpLnJlamVjdHMudG9UaHJvd0Vycm9yKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYW5kbGUgYWRkU3RvcmVzIGVycm9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBGbHV4LmFkZFN0b3JlcyA9IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigndGVzdCcpKTtcbiAgICAgICAgYXdhaXQgZXhwZWN0KEZsdXguaW5pdChjZmcsIHRydWUpKS5yZWplY3RzLnRvVGhyb3dFcnJvcigpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdldmVudCBsaXN0ZW5lcnMnLCAoKSA9PiB7XG4gICAgbGV0IGV2ZW50U3B5O1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBldmVudFNweSA9IGplc3QuZm4oKTtcbiAgICAgIEZsdXgub24oJ3Rlc3QnLCBldmVudFNweSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnI29uJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBhZGQgYSBsaXN0ZW5lcicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgRmx1eC5kaXNwYXRjaCh7dHlwZTogJ3Rlc3QnfSk7XG4gICAgICAgIGV4cGVjdChldmVudFNweS5tb2NrLmNhbGxzLmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJyNvZmYnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIHJlbW92ZSBhIGxpc3RlbmVyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBGbHV4Lm9mZigndGVzdCcsIGV2ZW50U3B5KTtcbiAgICAgICAgYXdhaXQgRmx1eC5kaXNwYXRjaCh7dHlwZTogJ3Rlc3QnfSk7XG5cbiAgICAgICAgZXhwZWN0KGV2ZW50U3B5Lm1vY2suY2FsbHMubGVuZ3RoKS50b0VxdWFsKDApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjYWRkU3RvcmVzJywgKCkgPT4ge1xuICAgIGNvbnN0IGRlbW8gPSAodHlwZSwgZGF0YSwgc3RhdGUgPSB7aGVsbG9TdG9yZTogJ2pva2VyJ30pID0+IHtcbiAgICAgIGlmKHR5cGUgPT09ICdERU1PX1RFU1QnKSB7XG4gICAgICAgIHN0YXRlLmhlbGxvU3RvcmUgPSBkYXRhLmhlbGxvU3RvcmU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9O1xuXG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgYW5kIHNhdmUgYSBTdG9yZSBjbGFzcycsICgpID0+IHtcbiAgICAgIEZsdXguYWRkU3RvcmVzKFtkZW1vXSk7XG4gICAgICBjb25zdCBwcml2YXRlUHJvcGVydHk6IHN0cmluZyA9ICdzdG9yZUFjdGlvbnMnO1xuICAgICAgY29uc3Qgc3RvcmVBY3Rpb246IEZsdXhTdG9yZSA9IEZsdXhbcHJpdmF0ZVByb3BlcnR5XS5kZW1vO1xuICAgICAgZXhwZWN0KHN0b3JlQWN0aW9uLm5hbWUpLnRvRXF1YWwoJ2RlbW8nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IGluaXRpYWwgc3RhdGUnLCAoKSA9PiB7XG4gICAgICBGbHV4LmFkZFN0b3JlcyhbZGVtb10pO1xuICAgICAgY29uc3QgcHJpdmF0ZVByb3BlcnR5OiBzdHJpbmcgPSAnc3RvcmVBY3Rpb25zJztcbiAgICAgIGNvbnN0IHN0b3JlQWN0aW9uOiBGbHV4U3RvcmUgPSBGbHV4W3ByaXZhdGVQcm9wZXJ0eV0uZGVtbztcbiAgICAgIGV4cGVjdChzdG9yZUFjdGlvbi5pbml0aWFsU3RhdGUpLnRvRXF1YWwoe2hlbGxvU3RvcmU6ICdqb2tlcid9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHVuc3VwcG9ydGVkIHN0b3JlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbnNLZXk6IHN0cmluZyA9ICdvcHRpb25zJztcbiAgICAgIGNvbnN0IHNldFN0b3JhZ2VEYXRhID0gbmV3IEVycm9yKCd0ZXN0Jyk7XG4gICAgICBGbHV4W29wdGlvbnNLZXldLnN0b3JhZ2UgPSB7c2V0U3RvcmFnZURhdGF9O1xuXG4gICAgICBGbHV4LmFkZFN0b3JlcyhbZGVtb10pO1xuICAgICAgY29uc3QgcHJpdmF0ZVByb3BlcnR5OiBzdHJpbmcgPSAnc3RvcmVBY3Rpb25zJztcbiAgICAgIGNvbnN0IHN0b3JlQWN0aW9uOiBGbHV4U3RvcmUgPSBGbHV4W3ByaXZhdGVQcm9wZXJ0eV0uZGVtbztcbiAgICAgIGV4cGVjdChzdG9yZUFjdGlvbi5pbml0aWFsU3RhdGUpLnRvRXF1YWwoe2hlbGxvU3RvcmU6ICdqb2tlcid9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNvZmZJbml0JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVtb3ZlIGxpc3RlbmVyIGFmdGVyIGluaXRpYWxpemF0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgbGlzdGVuZXIgPSBqZXN0LmZuKCk7XG4gICAgICBGbHV4Lm9mZiA9IGplc3QuZm4oKTtcbiAgICAgIEZsdXgub2ZmSW5pdChsaXN0ZW5lcik7XG4gICAgICBleHBlY3QoRmx1eC5vZmYubW9jay5jYWxscy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgICBleHBlY3QoRmx1eC5vZmYubW9jay5jYWxsc1swXVswXSkudG9FcXVhbChBcmtoYW1Db25zdGFudHMuSU5JVCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjb25Jbml0JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYWRkIGxpc3RlbmVyIGFmdGVyIGluaXRpYWxpemF0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgbGlzdGVuZXIgPSBqZXN0LmZuKCk7XG4gICAgICBGbHV4LmlzSW5pdCA9IGZhbHNlO1xuICAgICAgRmx1eC5vbiA9IGplc3QuZm4oKTtcbiAgICAgIEZsdXgub25Jbml0KGxpc3RlbmVyKTtcbiAgICAgIGV4cGVjdChGbHV4Lm9uLm1vY2suY2FsbHMubGVuZ3RoKS50b0VxdWFsKDEpO1xuICAgICAgZXhwZWN0KEZsdXgub24ubW9jay5jYWxsc1swXVswXSkudG9FcXVhbChBcmtoYW1Db25zdGFudHMuSU5JVCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRpc3BhdGNoIGluc3RhbnRseSBpZiBhbHJlYWR5IGluaXRpYWxpemVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgbGlzdGVuZXIgPSBqZXN0LmZuKCk7XG4gICAgICBGbHV4LmlzSW5pdCA9IHRydWU7XG4gICAgICBGbHV4Lm9uSW5pdChsaXN0ZW5lcik7XG4gICAgICBleHBlY3QobGlzdGVuZXIubW9jay5jYWxscy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjcmVnaXN0ZXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZWdpc3RlciBhIHN0b3JlIGZ1bmN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGVtb1N0b3JlID0gKHR5cGU6IHN0cmluZywgZGF0YSwgc3RhdGUgPSBpbml0aWFsU3RhdGUpOiBhbnkgPT4ge1xuICAgICAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICAgIGNhc2UgJ1RFU1RfRVZFTlQnOlxuICAgICAgICAgICAgcmV0dXJuIHNldCgndGVzdEFjdGlvbicsIGRhdGEudGVzdFZhciwgc3RhdGUpO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlZ2lzdGVyS2V5OiBzdHJpbmcgPSAncmVnaXN0ZXInO1xuICAgICAgY29uc3Qgc3RvcmVBY3Rpb24gPSBGbHV4W3JlZ2lzdGVyS2V5XShkZW1vU3RvcmUpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRBY3Rpb24gPSB7XG4gICAgICAgIGFjdGlvbjogZGVtb1N0b3JlLFxuICAgICAgICBpbml0aWFsU3RhdGUsXG4gICAgICAgIG5hbWU6ICdkZW1vU3RvcmUnXG4gICAgICB9O1xuICAgICAgZXhwZWN0KHN0b3JlQWN0aW9uKS50b0VxdWFsKGV4cGVjdGVkQWN0aW9uKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVnaXN0ZXIgYSBzdG9yZSBmdW5jdGlvbiB3aXRob3V0IGFuIGluaXRpYWwgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZW1vU3RvcmUgPSAodHlwZTogc3RyaW5nLCBkYXRhLCBzdGF0ZSk6IGFueSA9PiB7XG4gICAgICAgIHN3aXRjaCh0eXBlKSB7XG4gICAgICAgICAgY2FzZSAnVEVTVF9FVkVOVCc6XG4gICAgICAgICAgICByZXR1cm4gc2V0KCd0ZXN0QWN0aW9uJywgZGF0YS50ZXN0VmFyLCBzdGF0ZSk7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVnaXN0ZXJLZXk6IHN0cmluZyA9ICdyZWdpc3Rlcic7XG4gICAgICBjb25zdCBzdG9yZUFjdGlvbiA9IEZsdXhbcmVnaXN0ZXJLZXldKGRlbW9TdG9yZSk7XG4gICAgICBjb25zdCBleHBlY3RlZEFjdGlvbiA9IHtcbiAgICAgICAgYWN0aW9uOiBkZW1vU3RvcmUsXG4gICAgICAgIGluaXRpYWxTdGF0ZTogdW5kZWZpbmVkLFxuICAgICAgICBuYW1lOiAnZGVtb1N0b3JlJ1xuICAgICAgfTtcbiAgICAgIGV4cGVjdChzdG9yZUFjdGlvbikudG9FcXVhbChleHBlY3RlZEFjdGlvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBzYXZlIGEgc3RvcmUgZnVuY3Rpb24gd2l0aG91dCBhIG5hbWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZWdpc3RlcktleTogc3RyaW5nID0gJ3JlZ2lzdGVyJztcbiAgICAgIGNvbnN0IHN0b3JlQWN0aW9uID0gRmx1eFtyZWdpc3RlcktleV0oKHR5cGU6IHN0cmluZywgZGF0YSwgc3RhdGUgPSBpbml0aWFsU3RhdGUpOiBhbnkgPT4ge1xuICAgICAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICAgIGNhc2UgJ1RFU1RfRVZFTlQnOlxuICAgICAgICAgICAgcmV0dXJuIHNldCgndGVzdEFjdGlvbicsIGRhdGEudGVzdFZhciwgc3RhdGUpO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHN0b3JlQWN0aW9uKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSB1bmRlZmluZWQgZnVuY3Rpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCByZWdpc3RlcktleTogc3RyaW5nID0gJ3JlZ2lzdGVyJztcblxuICAgICAgY29uc3QgZm4gPSAoKSA9PiBGbHV4W3JlZ2lzdGVyS2V5XSgpO1xuICAgICAgZXhwZWN0KGZuKS50b1Rocm93RXJyb3IoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGFyZ3VtZW50IHRoYXQgaXMgbm90IGEgZnVuY3Rpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCByZWdpc3RlcktleTogc3RyaW5nID0gJ3JlZ2lzdGVyJztcblxuICAgICAgY29uc3QgZm4gPSAoKSA9PiBGbHV4W3JlZ2lzdGVyS2V5XSh7fSk7XG4gICAgICBleHBlY3QoZm4pLnRvVGhyb3dFcnJvcigpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnI3JlbW92ZU1pZGRsZXdhcmUnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBGbHV4LmNsZWFyTWlkZGxld2FyZSgpO1xuXG4gICAgICAvLyBBZGQgb2JqZWN0IG1pZGRsZXdhcmVcbiAgICAgIGNvbnN0IG9iak1pZGRsZXdhcmUgPSB7XG4gICAgICAgIG5hbWU6ICdvYmplY3RNaWRkbGV3YXJlJyxcbiAgICAgICAgcHJlRGlzcGF0Y2g6IChhY3Rpb24pID0+ICh7Li4uYWN0aW9ufSlcbiAgICAgIH07XG5cbiAgICAgIEZsdXguYWRkTWlkZGxld2FyZShbb2JqTWlkZGxld2FyZV0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhbHRlciBkYXRhIGJlZm9yZSBzZW5kaW5nIHRvIHN0b3JlcycsICgpID0+IHtcbiAgICAgIEZsdXgucmVtb3ZlTWlkZGxld2FyZShbJ29iamVjdE1pZGRsZXdhcmUnXSk7XG4gICAgICBjb25zdCBwcml2YXRlUHJvcGVydHk6IHN0cmluZyA9ICdtaWRkbGV3YXJlJztcbiAgICAgIGV4cGVjdChGbHV4W3ByaXZhdGVQcm9wZXJ0eV0ucHJlRGlzcGF0Y2hMaXN0Lmxlbmd0aCkudG9FcXVhbCgwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNyZW1vdmVQbHVnaW4nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgYW4gZXhpc3RpbmcgcGx1Z2luJywgKCkgPT4ge1xuICAgICAgRmx1eC5taWRkbGV3YXJlLnByZURpc3BhdGNoTGlzdCA9IFt7bmFtZTogJ2RlbW9QbHVnaW4nfSwge25hbWU6ICdub05vdFJlbW92ZVBsdWdpbid9XTtcbiAgICAgIGV4cGVjdChGbHV4LnJlbW92ZVBsdWdpbigncHJlRGlzcGF0Y2gnLCAnZGVtb1BsdWdpbicpKS50b0VxdWFsKFt7bmFtZTogJ25vTm90UmVtb3ZlUGx1Z2luJ31dKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2V0IGFuIHVuZGVmaW5lZCBsaXN0JywgKCkgPT4ge1xuICAgICAgRmx1eC5taWRkbGV3YXJlLnByZURpc3BhdGNoTGlzdCA9IG51bGw7XG4gICAgICBleHBlY3QoRmx1eC5yZW1vdmVQbHVnaW4oJ3ByZURpc3BhdGNoJywgJ2RlbW9QbHVnaW4nKSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjcmVtb3ZlU3RvcmVzJywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgLy8gTWV0aG9kXG4gICAgICBGbHV4LnJlbW92ZVN0b3JlcyhbJ2hlbGxvU3RvcmUnXSk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgRmx1eC5hZGRTdG9yZXMoW2hlbGxvU3RvcmVdKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVtb3ZlIGNsYXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJpdmF0ZVByb3BlcnR5OiBzdHJpbmcgPSAnc3RvcmVBY3Rpb25zJztcbiAgICAgIGV4cGVjdCghIUZsdXhbcHJpdmF0ZVByb3BlcnR5XS5oZWxsb1N0b3JlKS50b0VxdWFsKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVtb3ZlIHN0b3JlIGRhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcml2YXRlUHJvcGVydHk6IHN0cmluZyA9ICdzdGF0ZSc7XG4gICAgICBleHBlY3QoISFGbHV4W3ByaXZhdGVQcm9wZXJ0eV0uaGVsbG9TdG9yZSkudG9FcXVhbChmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjcmVzZXQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgYXJndW1lbnQgdGhhdCBpcyBub3QgYSBmdW5jdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbnNLZXk6IHN0cmluZyA9ICdvcHRpb25zJztcbiAgICAgIGNvbnN0IHNldFN0b3JhZ2VEYXRhID0gbmV3IEVycm9yKCd0ZXN0Jyk7XG4gICAgICBGbHV4W29wdGlvbnNLZXldLnN0b3JhZ2UgPSB7c2V0U3RvcmFnZURhdGF9O1xuICAgICAgYXdhaXQgZXhwZWN0KEZsdXgucmVzZXQoKSkucmVqZWN0cy50b1Rocm93RXJyb3IoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNzZXRTdGF0ZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHVwZGF0ZSB0aGUgcHJvcGVydHkgd2l0aGluIHRoZSBzdG9yZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IEZsdXguc2V0U3RhdGUoJ2hlbGxvU3RvcmUudGVzdFVwZGF0ZScsICd0ZXN0Jyk7XG4gICAgICBjb25zdCBuZXdJdGVtID0gYXdhaXQgRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZS50ZXN0VXBkYXRlJyk7XG4gICAgICBleHBlY3QobmV3SXRlbSkudG9FcXVhbCgndGVzdCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBlbXB0eSBzdHJpbmcgYXMgZGVmYXVsdCBwYXRoJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgRmx1eC5zZXRTdGF0ZSh1bmRlZmluZWQsICd0ZXN0Jyk7XG4gICAgICBjb25zdCBuZXdJdGVtID0gYXdhaXQgRmx1eC5nZXRTdGF0ZSgnaGVsbG9TdG9yZScpO1xuICAgICAgZXhwZWN0KG5ld0l0ZW0pLnRvRXF1YWwoaW5pdGlhbFN0YXRlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXBkYXRlIHN0b3JhZ2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zS2V5OiBzdHJpbmcgPSAnb3B0aW9ucyc7XG4gICAgICBjb25zdCB1cGRhdGVTdG9yYWdlS2V5OiBzdHJpbmcgPSAndXBkYXRlU3RvcmFnZSc7XG4gICAgICBjb25zdCB1cGRhdGVTdG9yYWdlID0gamVzdC5mbigpO1xuICAgICAgRmx1eFtvcHRpb25zS2V5XSA9IHtzdG9yYWdlOiB7fX07XG4gICAgICBGbHV4W3VwZGF0ZVN0b3JhZ2VLZXldID0gdXBkYXRlU3RvcmFnZTtcbiAgICAgIGF3YWl0IEZsdXguc2V0U3RhdGUoJ2hlbGxvU3RvcmUudGVzdFVwZGF0ZScsICd0ZXN0Jyk7XG4gICAgICBleHBlY3QodXBkYXRlU3RvcmFnZS5tb2NrLmNhbGxzLmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyN1c2VTdG9yYWdlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdXBkYXRlIHN0b3JhZ2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBnZXRTdG9yYWdlRGF0YSA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IG9wdGlvbnNLZXk6IHN0cmluZyA9ICdvcHRpb25zJztcbiAgICAgIEZsdXhbb3B0aW9uc0tleV0uc3RhdGUgPSBudWxsO1xuICAgICAgRmx1eFtvcHRpb25zS2V5XS5zdG9yYWdlID0ge2dldFN0b3JhZ2VEYXRhfTtcblxuICAgICAgY29uc3QgdXNlU3RvcmFnZUtleTogc3RyaW5nID0gJ3VzZVN0b3JhZ2UnO1xuICAgICAgYXdhaXQgRmx1eFt1c2VTdG9yYWdlS2V5XSgnaGVsbG9TdG9yZScpO1xuXG4gICAgICBleHBlY3QoZ2V0U3RvcmFnZURhdGEubW9jay5jYWxscy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnd2l0aG91dCBzdG9yYWdlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uc0tleTogc3RyaW5nID0gJ29wdGlvbnMnO1xuICAgICAgRmx1eFtvcHRpb25zS2V5XS5zdGF0ZSA9IHtoZWxsbzogJ3dvcmxkJ307XG4gICAgICBGbHV4W29wdGlvbnNLZXldLnN0b3JhZ2UgPSBudWxsO1xuXG4gICAgICBjb25zdCB1c2VTdG9yYWdlS2V5OiBzdHJpbmcgPSAndXNlU3RvcmFnZSc7XG4gICAgICBhd2FpdCBGbHV4W3VzZVN0b3JhZ2VLZXldKCdoZWxsb1N0b3JlJyk7XG5cbiAgICAgIGNvbnN0IHN0YXRlS2V5OiBzdHJpbmcgPSAnc3RhdGUnO1xuICAgICAgZXhwZWN0KEZsdXhbc3RhdGVLZXldLmhlbGxvKS50b0VxdWFsKCd3b3JsZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgc3RvcmFnZSBlcnJvcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zS2V5OiBzdHJpbmcgPSAnb3B0aW9ucyc7XG4gICAgICBGbHV4W29wdGlvbnNLZXldLnN0YXRlID0gbnVsbDtcbiAgICAgIEZsdXhbb3B0aW9uc0tleV0uc3RvcmFnZSA9IG5ldyBFcnJvcigndGVzdCcpO1xuXG4gICAgICBjb25zdCB1c2VTdG9yYWdlS2V5OiBzdHJpbmcgPSAndXNlU3RvcmFnZSc7XG4gICAgICBhd2FpdCBleHBlY3QoRmx1eFt1c2VTdG9yYWdlS2V5XSgnaGVsbG9TdG9yZScpKS5yZWplY3RzLnRvVGhyb3dFcnJvcigpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZWJvdW5jZSBzdG9yYWdlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWU6IHN0cmluZyA9ICd0ZXN0JztcbiAgICAgIGNvbnN0IG9wdGlvbnNLZXk6IHN0cmluZyA9ICdvcHRpb25zJztcbiAgICAgIEZsdXhbb3B0aW9uc0tleV0uc3RhdGUgPSB7aGVsbG86ICd3b3JsZCd9O1xuXG4gICAgICBjb25zdCBzZXRTdG9yYWdlRGF0YSA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUodmFsdWUpO1xuICAgICAgRmx1eFtvcHRpb25zS2V5XS5zdG9yYWdlID0ge3NldFN0b3JhZ2VEYXRhfTtcblxuICAgICAgY29uc3QgZGVib3VuY2VNb2NrOiBhbnkgPSBkZWJvdW5jZTtcbiAgICAgIGRlYm91bmNlTW9jay5tb2NrSW1wbGVtZW50YXRpb24oKGZuKSA9PiBmbigpKTtcblxuICAgICAgY29uc3QgdXNlU3RvcmFnZUtleTogc3RyaW5nID0gJ3VzZVN0b3JhZ2UnO1xuICAgICAgYXdhaXQgRmx1eFt1c2VTdG9yYWdlS2V5XSgnaGVsbG9TdG9yZScpO1xuXG4gICAgICBleHBlY3Qoc2V0U3RvcmFnZURhdGEubW9jay5jYWxscy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJQSxzQkFBcUI7QUFDckIsdUJBQXNCO0FBQ3RCLGlCQUFnQjtBQUVoQiw2QkFBOEI7QUFDOUIsa0JBQTRCO0FBRzVCLEtBQUssS0FBSyxpQkFBaUI7QUFFM0IsTUFBTSxlQUFlO0FBQUEsRUFDbkIsT0FBTztBQUFBLEVBQ1AsTUFBTTtBQUFBLEVBQ04sWUFBWTtBQUFBLEVBQ1osWUFBWTtBQUFBLEVBQ1osV0FBVztBQUNiO0FBRUEsTUFBTSxhQUFhLENBQUMsTUFBYyxNQUFNLFFBQVEsaUJBQXNCO0FBQ3BFLFVBQU87QUFBQSxTQUNBO0FBQ0gsaUJBQU8sV0FBQUEsU0FBSSxjQUFjLEtBQUssU0FBUyxLQUFLO0FBQUE7QUFFNUMsYUFBTztBQUFBO0FBRWI7QUFFQSxTQUFTLFFBQVEsTUFBTTtBQUNyQixRQUFNLGVBQWUsUUFBUTtBQUM3QixRQUFNLGNBQWMsUUFBUTtBQUM1QixRQUFNLE1BQW1CO0FBQUEsSUFDdkIsTUFBTTtBQUFBLElBQ04sUUFBUSxDQUFDLFVBQVU7QUFBQSxFQUNyQjtBQUNBLE1BQUk7QUFFSixZQUFVLE1BQU07QUFDZCxZQUFRLFFBQVEsS0FBSyxHQUFHO0FBQ3hC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