mtrl-addons 0.5.6 → 0.7.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.
@@ -0,0 +1,720 @@
1
+ // src/core/layout/schema.ts
2
+ class FragmentPool {
3
+ pool = [];
4
+ maxSize = 8;
5
+ get() {
6
+ return this.pool.pop() || document.createDocumentFragment();
7
+ }
8
+ release(fragment) {
9
+ if (this.pool.length < this.maxSize && fragment.childNodes.length === 0) {
10
+ this.pool.push(fragment);
11
+ }
12
+ }
13
+ clear() {
14
+ this.pool.length = 0;
15
+ }
16
+ }
17
+ var fragmentPool = new FragmentPool;
18
+ var classCache = new Map;
19
+ var PREFIX = "mtrl";
20
+ var PREFIX_WITH_DASH = `${PREFIX}-`;
21
+ function getCachedClassName(type, property, value) {
22
+ const key = `${type}-${property}-${value}`;
23
+ if (!classCache.has(key)) {
24
+ if (type === "item") {
25
+ classCache.set(key, property === "" ? `layout__item--${value}` : `layout__item--${property}-${value}`);
26
+ } else {
27
+ if (property === "align") {
28
+ classCache.set(key, `layout--${type}-${value}`);
29
+ } else {
30
+ classCache.set(key, `layout--${type}-${property}-${value}`);
31
+ }
32
+ }
33
+ }
34
+ return classCache.get(key);
35
+ }
36
+ function isComponent(value) {
37
+ return value && typeof value === "object" && "element" in value;
38
+ }
39
+ function createFragment() {
40
+ return fragmentPool.get();
41
+ }
42
+ function releaseFragment(fragment) {
43
+ fragmentPool.release(fragment);
44
+ }
45
+ function processClassNames(options, skipPrefix = false) {
46
+ if (!options)
47
+ return options;
48
+ const hasRawClass = options.rawClass;
49
+ const hasRegularClass = options.class || options.className;
50
+ if (!hasRawClass && !hasRegularClass)
51
+ return options;
52
+ if (hasRawClass && !hasRegularClass && skipPrefix) {
53
+ const processed2 = { ...options };
54
+ delete processed2.rawClass;
55
+ if (typeof hasRawClass === "string") {
56
+ processed2.class = hasRawClass;
57
+ } else {
58
+ processed2.class = hasRawClass.join(" ");
59
+ }
60
+ return processed2;
61
+ }
62
+ const processed = { ...options };
63
+ let finalClasses = "";
64
+ if (!skipPrefix && hasRegularClass) {
65
+ let prefixedString = "";
66
+ if (processed.class) {
67
+ prefixedString += Array.isArray(processed.class) ? processed.class.join(" ") : processed.class;
68
+ }
69
+ if (processed.className) {
70
+ prefixedString += (prefixedString ? " " : "") + processed.className;
71
+ }
72
+ if (prefixedString) {
73
+ finalClasses = prefixedString.split(/\s+/).filter(Boolean).map((cls) => cls.startsWith(PREFIX_WITH_DASH) ? cls : PREFIX_WITH_DASH + cls).join(" ");
74
+ }
75
+ }
76
+ if (hasRawClass) {
77
+ const rawString = Array.isArray(hasRawClass) ? hasRawClass.filter(Boolean).join(" ") : hasRawClass;
78
+ finalClasses += (finalClasses ? " " : "") + rawString;
79
+ }
80
+ if (finalClasses) {
81
+ processed.class = finalClasses;
82
+ }
83
+ delete processed.className;
84
+ delete processed.rawClass;
85
+ return processed;
86
+ }
87
+ function extractParameters(schema, startIndex, defaultCreator) {
88
+ const items = schema.slice(startIndex, startIndex + 3);
89
+ let creator, name, options;
90
+ let consumed = 1;
91
+ const [first, second, third] = items;
92
+ if (typeof first === "function") {
93
+ creator = first;
94
+ if (typeof second === "string") {
95
+ name = second;
96
+ consumed = 2;
97
+ if (isObject(third)) {
98
+ options = third;
99
+ consumed = 3;
100
+ }
101
+ } else if (isObject(second)) {
102
+ options = second;
103
+ consumed = 2;
104
+ }
105
+ } else if (typeof first === "string") {
106
+ creator = defaultCreator;
107
+ name = first;
108
+ if (isObject(second)) {
109
+ options = second;
110
+ consumed = 2;
111
+ }
112
+ } else if (isObject(first)) {
113
+ creator = defaultCreator;
114
+ options = first;
115
+ }
116
+ return {
117
+ creator: creator || defaultCreator,
118
+ name,
119
+ options: options || {},
120
+ consumed
121
+ };
122
+ }
123
+ function isObject(value) {
124
+ return value !== null && typeof value === "object" && !Array.isArray(value);
125
+ }
126
+ function createElement(options = {}) {
127
+ const tag = options.tag || "div";
128
+ const element = document.createElement(tag);
129
+ if (options.class) {
130
+ element.className = options.class;
131
+ }
132
+ if (options.style) {
133
+ if (typeof options.style === "string") {
134
+ element.setAttribute("style", options.style);
135
+ } else if (typeof options.style === "object") {
136
+ Object.assign(element.style, options.style);
137
+ }
138
+ }
139
+ if (options.textContent) {
140
+ element.textContent = options.textContent;
141
+ }
142
+ if (options.text) {
143
+ element.textContent = options.text;
144
+ }
145
+ return element;
146
+ }
147
+ function addClass(element, className) {
148
+ if (element && className) {
149
+ element.classList.add(className);
150
+ }
151
+ }
152
+ function hasClass(element, className) {
153
+ return element && element.classList.contains(className);
154
+ }
155
+ function createComponentInstance(Component, options = {}) {
156
+ try {
157
+ const {
158
+ layout: layoutConfig,
159
+ layoutItem: layoutItemConfig,
160
+ style: styleConfig,
161
+ attributes: attributesConfig,
162
+ events: eventsConfig,
163
+ event,
164
+ ...cleanOptions
165
+ } = options;
166
+ const finalEventsConfig = eventsConfig || event;
167
+ if (styleConfig && typeof styleConfig === "string") {
168
+ cleanOptions.style = styleConfig;
169
+ }
170
+ const isClass = typeof Component === "function" && Object.getOwnPropertyDescriptor(Component, "prototype")?.writable === false;
171
+ const component = isClass ? new Component(cleanOptions) : Component(cleanOptions);
172
+ if (component) {
173
+ const element = component.element || (component instanceof HTMLElement ? component : null);
174
+ if (element) {
175
+ if (layoutConfig)
176
+ applyLayoutClasses(element, layoutConfig);
177
+ if (layoutItemConfig)
178
+ applyLayoutItemClasses(element, layoutItemConfig);
179
+ if (styleConfig && typeof styleConfig === "object") {
180
+ Object.assign(element.style, styleConfig);
181
+ }
182
+ if (attributesConfig && typeof attributesConfig === "object") {
183
+ for (const [key, value] of Object.entries(attributesConfig)) {
184
+ if (value !== undefined && value !== null) {
185
+ element.setAttribute(key, value.toString());
186
+ }
187
+ }
188
+ }
189
+ if (finalEventsConfig && typeof finalEventsConfig === "object") {
190
+ if (Array.isArray(finalEventsConfig)) {
191
+ for (const eventDef of finalEventsConfig) {
192
+ if (Array.isArray(eventDef) && eventDef.length >= 2) {
193
+ const [eventName, handler] = eventDef;
194
+ if (typeof eventName === "string" && typeof handler === "function") {
195
+ element.addEventListener(eventName, handler);
196
+ }
197
+ }
198
+ }
199
+ } else {
200
+ for (const [eventName, handler] of Object.entries(finalEventsConfig)) {
201
+ if (typeof handler === "function") {
202
+ element.addEventListener(eventName, handler);
203
+ }
204
+ }
205
+ }
206
+ }
207
+ }
208
+ }
209
+ return component;
210
+ } catch (error) {
211
+ console.error("Error creating component instance:", error);
212
+ return document.createElement("div");
213
+ }
214
+ }
215
+ function applyLayoutClasses(element, layoutConfig) {
216
+ if (!element || !layoutConfig)
217
+ return;
218
+ if (layoutConfig.type) {
219
+ addClass(element, `${PREFIX_WITH_DASH}layout--${layoutConfig.type}`);
220
+ }
221
+ const layoutType = layoutConfig.type || getLayoutType(element);
222
+ if (layoutType) {
223
+ if (layoutConfig.gap !== undefined) {
224
+ addClass(element, PREFIX_WITH_DASH + getCachedClassName(layoutType, "gap", layoutConfig.gap));
225
+ }
226
+ if (layoutConfig.align) {
227
+ addClass(element, PREFIX_WITH_DASH + getCachedClassName(layoutType, "align", layoutConfig.align));
228
+ }
229
+ if (layoutConfig.justify) {
230
+ addClass(element, PREFIX_WITH_DASH + getCachedClassName(layoutType, "justify", layoutConfig.justify));
231
+ }
232
+ }
233
+ if (layoutConfig.type === "grid" || getLayoutType(element) === "grid") {
234
+ if (typeof layoutConfig.columns === "number") {
235
+ addClass(element, PREFIX_WITH_DASH + getCachedClassName("grid", "cols", layoutConfig.columns));
236
+ } else if (layoutConfig.columns === "auto-fill") {
237
+ addClass(element, PREFIX_WITH_DASH + getCachedClassName("grid", "fill", "auto"));
238
+ } else if (layoutConfig.columns === "auto-fit") {
239
+ addClass(element, PREFIX_WITH_DASH + getCachedClassName("grid", "cols", "auto-fit"));
240
+ }
241
+ if (layoutConfig.dense)
242
+ addClass(element, `${PREFIX_WITH_DASH}layout--grid-dense`);
243
+ if (layoutConfig.autoHeight)
244
+ addClass(element, `${PREFIX_WITH_DASH}layout--grid-auto-height`);
245
+ }
246
+ if (layoutConfig.type === "row" || getLayoutType(element) === "row") {
247
+ if (layoutConfig.wrap === false || layoutConfig.wrap === "nowrap") {
248
+ addClass(element, `${PREFIX_WITH_DASH}layout--row-nowrap`);
249
+ } else if (layoutConfig.wrap === "reverse") {
250
+ addClass(element, `${PREFIX_WITH_DASH}layout--row-wrap-reverse`);
251
+ }
252
+ if (layoutConfig.mobileStack)
253
+ addClass(element, `${PREFIX_WITH_DASH}layout--row-mobile-stack`);
254
+ if (layoutConfig.mobileScroll)
255
+ addClass(element, `${PREFIX_WITH_DASH}layout--row-mobile-scroll`);
256
+ }
257
+ if (layoutConfig.class) {
258
+ layoutConfig.class.split(" ").filter(Boolean).forEach((cls) => element.classList.add(cls));
259
+ }
260
+ }
261
+ function applyLayoutItemClasses(element, itemConfig) {
262
+ if (!element || !itemConfig)
263
+ return;
264
+ addClass(element, `${PREFIX_WITH_DASH}layout__item`);
265
+ if (itemConfig.width && itemConfig.width >= 1 && itemConfig.width <= 12) {
266
+ addClass(element, PREFIX_WITH_DASH + getCachedClassName("item", "", itemConfig.width));
267
+ }
268
+ if (itemConfig.sm)
269
+ addClass(element, PREFIX_WITH_DASH + getCachedClassName("item", "sm", itemConfig.sm));
270
+ if (itemConfig.md)
271
+ addClass(element, PREFIX_WITH_DASH + getCachedClassName("item", "md", itemConfig.md));
272
+ if (itemConfig.lg)
273
+ addClass(element, PREFIX_WITH_DASH + getCachedClassName("item", "lg", itemConfig.lg));
274
+ if (itemConfig.xl)
275
+ addClass(element, PREFIX_WITH_DASH + getCachedClassName("item", "xl", itemConfig.xl));
276
+ if (itemConfig.span)
277
+ addClass(element, PREFIX_WITH_DASH + getCachedClassName("item", "span", itemConfig.span));
278
+ if (itemConfig.rowSpan)
279
+ addClass(element, PREFIX_WITH_DASH + getCachedClassName("item", "row-span", itemConfig.rowSpan));
280
+ if (itemConfig.order)
281
+ addClass(element, PREFIX_WITH_DASH + getCachedClassName("item", "order", itemConfig.order));
282
+ if (itemConfig.align)
283
+ addClass(element, PREFIX_WITH_DASH + getCachedClassName("item", "self", itemConfig.align));
284
+ if (itemConfig.auto)
285
+ addClass(element, `${PREFIX_WITH_DASH}layout__item--auto`);
286
+ }
287
+ function getLayoutType(element) {
288
+ return hasClass(element, `${PREFIX_WITH_DASH}layout--stack`) ? "stack" : hasClass(element, `${PREFIX_WITH_DASH}layout--row`) ? "row" : hasClass(element, `${PREFIX_WITH_DASH}layout--grid`) ? "grid" : "";
289
+ }
290
+ function processArraySchema(schema, parentElement = null, level = 0, options = {}) {
291
+ level++;
292
+ const layout = {};
293
+ const components = [];
294
+ const fragment = createFragment();
295
+ let component = null;
296
+ if (!Array.isArray(schema)) {
297
+ return createLayoutResult(layout);
298
+ }
299
+ const defaultCreator = options.creator || createElement;
300
+ for (let i = 0;i < schema.length; i++) {
301
+ const item = schema[i];
302
+ if (!item)
303
+ continue;
304
+ if (Array.isArray(item)) {
305
+ const container = component || parentElement;
306
+ const result = processArraySchema(item, container, level, options);
307
+ if (Array.isArray(result.layout.components)) {
308
+ components.push(...result.layout.components);
309
+ delete result.layout.components;
310
+ }
311
+ Object.assign(layout, result.layout);
312
+ continue;
313
+ }
314
+ const {
315
+ creator,
316
+ name,
317
+ options: itemOptions,
318
+ consumed
319
+ } = extractParameters(schema, i, defaultCreator);
320
+ if (!creator) {
321
+ console.warn("Skipping unsupported item type:", item);
322
+ continue;
323
+ }
324
+ if (creator === createElement && !("tag" in itemOptions)) {
325
+ itemOptions.tag = "div";
326
+ }
327
+ i += consumed - 1;
328
+ const shouldApplyPrefix = "prefix" in itemOptions ? itemOptions.prefix : options.prefix !== false;
329
+ const processedOptions = shouldApplyPrefix || itemOptions.rawClass ? processClassNames(itemOptions, !shouldApplyPrefix) : itemOptions;
330
+ if (name && !("name" in processedOptions) && !(creator === createElement || creator.isElement)) {
331
+ processedOptions.name = name;
332
+ }
333
+ component = createComponentInstance(creator, processedOptions);
334
+ const element = isComponent(component) ? component.element : component;
335
+ if (level === 1)
336
+ layout.element = element;
337
+ if (name) {
338
+ layout[name] = component;
339
+ components.push([name, component]);
340
+ }
341
+ if (component) {
342
+ if ("insert" in component && typeof component.insert === "function") {
343
+ component.insert(fragment);
344
+ } else {
345
+ fragment.appendChild(element);
346
+ }
347
+ if (parentElement) {
348
+ component._container = parentElement;
349
+ if ("onInserted" in component && typeof component.onInserted === "function") {
350
+ component.onInserted(parentElement);
351
+ }
352
+ }
353
+ }
354
+ }
355
+ if (parentElement && fragment.hasChildNodes()) {
356
+ const wrapper = isComponent(parentElement) ? parentElement.element : parentElement;
357
+ wrapper.appendChild(fragment);
358
+ }
359
+ releaseFragment(fragment);
360
+ layout.components = components;
361
+ return createLayoutResult(layout);
362
+ }
363
+ function processObjectSchema(schema, parentElement = null, options = {}) {
364
+ const layout = {};
365
+ const defaultCreator = options.creator || createElement;
366
+ if (schema.element && !parentElement) {
367
+ const elementDef = schema.element;
368
+ const createElementFn = elementDef.creator || defaultCreator;
369
+ const elementOptions = elementDef.options || {};
370
+ const processedOptions = options.prefix !== false ? processClassNames(elementOptions) : { ...elementOptions };
371
+ const rootComponent = createComponentInstance(createElementFn, processedOptions);
372
+ layout.element = rootComponent;
373
+ if (elementDef.name)
374
+ layout[elementDef.name] = rootComponent;
375
+ if (elementDef.children) {
376
+ const rootElement = isComponent(rootComponent) ? rootComponent.element : rootComponent;
377
+ const childResult = processObjectSchema(elementDef.children, rootElement, options);
378
+ Object.assign(layout, childResult.layout);
379
+ }
380
+ return createLayoutResult(layout);
381
+ }
382
+ const fragment = parentElement ? createFragment() : null;
383
+ for (const key in schema) {
384
+ const def = schema[key];
385
+ if (!def)
386
+ continue;
387
+ const elementCreator = def.creator || defaultCreator;
388
+ const elementOptions = def.options || {};
389
+ const shouldApplyPrefix = "prefix" in elementOptions ? elementOptions.prefix : options.prefix !== false;
390
+ const processedOptions = shouldApplyPrefix ? processClassNames(elementOptions) : { ...elementOptions };
391
+ if (!def.name && key !== "element") {
392
+ def.name = key;
393
+ }
394
+ const created = createComponentInstance(elementCreator, processedOptions);
395
+ layout[key] = created;
396
+ if (def.name && def.name !== key)
397
+ layout[def.name] = created;
398
+ const element = isComponent(created) ? created.element : created;
399
+ if (fragment)
400
+ fragment.appendChild(element);
401
+ if (def.children) {
402
+ const childResult = processObjectSchema(def.children, element, options);
403
+ Object.assign(layout, childResult.layout);
404
+ }
405
+ }
406
+ if (parentElement && fragment) {
407
+ const parentDom = isComponent(parentElement) ? parentElement.element : parentElement;
408
+ parentDom.appendChild(fragment);
409
+ releaseFragment(fragment);
410
+ }
411
+ return createLayoutResult(layout);
412
+ }
413
+ function flattenLayout(layout) {
414
+ const flattened = {};
415
+ if (!layout || typeof layout !== "object")
416
+ return flattened;
417
+ for (const key in layout) {
418
+ const value = layout[key];
419
+ if (value && typeof value !== "function" && (value instanceof HTMLElement || typeof SVGElement !== "undefined" && value instanceof SVGElement || isComponent(value))) {
420
+ flattened[key] = value;
421
+ }
422
+ }
423
+ return flattened;
424
+ }
425
+ function createLayoutResult(layout) {
426
+ const flattenedComponents = flattenLayout(layout);
427
+ return {
428
+ layout,
429
+ element: layout.element,
430
+ component: flattenedComponents,
431
+ get(name) {
432
+ return layout[name] ?? null;
433
+ },
434
+ getAll() {
435
+ return flattenedComponents;
436
+ },
437
+ destroy() {
438
+ const destroyed = new Set;
439
+ const destroyComponent = (component) => {
440
+ if (!component || destroyed.has(component))
441
+ return;
442
+ if (component instanceof HTMLElement || typeof component !== "object")
443
+ return;
444
+ if (typeof component.destroy === "function") {
445
+ destroyed.add(component);
446
+ try {
447
+ component.destroy();
448
+ } catch (e) {}
449
+ }
450
+ };
451
+ if (Array.isArray(layout.components)) {
452
+ for (const [name, component] of layout.components) {
453
+ destroyComponent(component);
454
+ }
455
+ }
456
+ for (const key in layout) {
457
+ if (key === "element" || key === "components")
458
+ continue;
459
+ destroyComponent(layout[key]);
460
+ }
461
+ if (Array.isArray(layout.components)) {
462
+ layout.components.length = 0;
463
+ }
464
+ if (layout.element) {
465
+ const element = isComponent(layout.element) ? layout.element.element : layout.element;
466
+ if (element && element.parentNode) {
467
+ element.parentNode.removeChild(element);
468
+ }
469
+ }
470
+ for (const key in layout) {
471
+ delete layout[key];
472
+ }
473
+ }
474
+ };
475
+ }
476
+ function createLayout(schema, parentElement = null, options = {}) {
477
+ if (typeof schema === "function") {
478
+ schema = schema();
479
+ }
480
+ if (typeof schema === "string") {
481
+ const template = document.createElement("template");
482
+ template.innerHTML = schema.trim();
483
+ const fragment = template.content;
484
+ if (parentElement && fragment.hasChildNodes()) {
485
+ parentElement.appendChild(fragment);
486
+ }
487
+ const layout = { element: fragment.firstElementChild };
488
+ return createLayoutResult(layout);
489
+ }
490
+ if (Array.isArray(schema) && schema.length >= 3 && typeof schema[0] === "function" && typeof schema[1] === "string" && isObject(schema[2])) {
491
+ return processArraySchema(schema, parentElement, 0, options);
492
+ }
493
+ return Array.isArray(schema) ? processArraySchema(schema, parentElement, 0, options) : processObjectSchema(schema, parentElement, options);
494
+ }
495
+ function clearClassCache() {
496
+ classCache.clear();
497
+ }
498
+ function clearFragmentPool() {
499
+ fragmentPool.clear();
500
+ }
501
+ // src/core/layout/config.ts
502
+ var PREFIX2 = "mtrl";
503
+ var PREFIX_WITH_DASH2 = `${PREFIX2}-`;
504
+ function addClass2(element, className) {
505
+ if (element && className && element.classList) {
506
+ element.classList.add(className);
507
+ }
508
+ }
509
+ function hasClass2(element, className) {
510
+ return element && element.classList && element.classList.contains(className);
511
+ }
512
+ function cleanupLayoutClasses(element) {
513
+ if (!element || !element.classList)
514
+ return;
515
+ const classList = Array.from(element.classList);
516
+ const layoutClasses = classList.filter((cls) => cls.startsWith(`${PREFIX_WITH_DASH2}layout--`) || cls.includes(`-${PREFIX_WITH_DASH2}layout--`));
517
+ layoutClasses.forEach((cls) => {
518
+ element.classList.remove(cls);
519
+ });
520
+ }
521
+ function getLayoutType2(element) {
522
+ return hasClass2(element, `${PREFIX_WITH_DASH2}layout--stack`) ? "stack" : hasClass2(element, `${PREFIX_WITH_DASH2}layout--row`) ? "row" : hasClass2(element, `${PREFIX_WITH_DASH2}layout--grid`) ? "grid" : "";
523
+ }
524
+ function getLayoutPrefix() {
525
+ return PREFIX_WITH_DASH2;
526
+ }
527
+ function setLayoutClasses(element, layoutType, classes = []) {
528
+ if (!element || !layoutType)
529
+ return;
530
+ cleanupLayoutClasses(element);
531
+ addClass2(element, `${PREFIX_WITH_DASH2}layout--${layoutType}`);
532
+ classes.forEach((cls) => {
533
+ if (cls.startsWith("layout--") || cls.startsWith("layout__")) {
534
+ addClass2(element, `${PREFIX_WITH_DASH2}${cls}`);
535
+ } else {
536
+ addClass2(element, cls);
537
+ }
538
+ });
539
+ }
540
+ // src/core/layout/jsx.ts
541
+ var Fragment = Symbol("Fragment");
542
+ function h(tag, props, ...children) {
543
+ if (tag === Fragment) {
544
+ const fragment = document.createDocumentFragment();
545
+ children.forEach((child) => {
546
+ if (child != null) {
547
+ const element = typeof child === "string" ? document.createTextNode(child) : child;
548
+ fragment.appendChild(element);
549
+ }
550
+ });
551
+ return fragment;
552
+ }
553
+ if (typeof tag === "string") {
554
+ const element = document.createElement(tag);
555
+ if (props) {
556
+ for (const [key, value] of Object.entries(props)) {
557
+ if (key === "className" || key === "class") {
558
+ element.className = value;
559
+ } else if (key.startsWith("on") && typeof value === "function") {
560
+ const eventName = key.slice(2).toLowerCase();
561
+ element.addEventListener(eventName, value);
562
+ } else if (key === "style" && typeof value === "object") {
563
+ Object.assign(element.style, value);
564
+ } else if (key === "dangerouslySetInnerHTML") {
565
+ element.innerHTML = value.__html || "";
566
+ } else if (value != null) {
567
+ element.setAttribute(key, value.toString());
568
+ }
569
+ }
570
+ }
571
+ children.forEach((child) => {
572
+ if (child != null) {
573
+ if (typeof child === "string") {
574
+ element.appendChild(document.createTextNode(child));
575
+ } else if (child instanceof Node) {
576
+ element.appendChild(child);
577
+ } else {
578
+ element.appendChild(document.createTextNode(String(child)));
579
+ }
580
+ }
581
+ });
582
+ return element;
583
+ }
584
+ if (typeof tag === "function") {
585
+ const allProps = props || {};
586
+ if (children.length > 0) {
587
+ allProps.children = children;
588
+ }
589
+ return tag(allProps);
590
+ }
591
+ return h("div", props, ...children);
592
+ }
593
+ function createJsxLayout(jsxElement, parentElement) {
594
+ const schema = jsxElement;
595
+ return createLayout(schema, parentElement);
596
+ }
597
+ function component(fn) {
598
+ return function(props) {
599
+ return fn(props || {});
600
+ };
601
+ }
602
+ function renderElements(elements, parentElement) {
603
+ return elements.map((element) => createJsxLayout(element, parentElement));
604
+ }
605
+ var jsx = {
606
+ div: (props, ...children) => h("div", props, ...children),
607
+ span: (props, ...children) => h("span", props, ...children),
608
+ p: (props, ...children) => h("p", props, ...children),
609
+ button: (props, ...children) => h("button", props, ...children),
610
+ input: (props) => h("input", props),
611
+ img: (props) => h("img", props),
612
+ a: (props, ...children) => h("a", props, ...children),
613
+ ul: (props, ...children) => h("ul", props, ...children),
614
+ li: (props, ...children) => h("li", props, ...children),
615
+ section: (props, ...children) => h("section", props, ...children),
616
+ header: (props, ...children) => h("header", props, ...children),
617
+ footer: (props, ...children) => h("footer", props, ...children),
618
+ main: (props, ...children) => h("main", props, ...children),
619
+ article: (props, ...children) => h("article", props, ...children)
620
+ };
621
+
622
+ // src/core/layout/index.ts
623
+ function layout(type = "stack", options = {}) {
624
+ return createLayout([
625
+ "div",
626
+ {
627
+ layout: { type },
628
+ ...options
629
+ }
630
+ ]);
631
+ }
632
+ function grid(columns = "auto-fit", options = {}) {
633
+ return createLayout([
634
+ "div",
635
+ {
636
+ layout: {
637
+ type: "grid",
638
+ columns,
639
+ gap: options.gap || "1rem",
640
+ ...options.layout
641
+ },
642
+ ...options
643
+ }
644
+ ]);
645
+ }
646
+ function row(options = {}) {
647
+ return createLayout([
648
+ "div",
649
+ {
650
+ layout: {
651
+ type: "row",
652
+ gap: options.gap || "1rem",
653
+ mobileStack: options.mobileStack !== false,
654
+ ...options.layout
655
+ },
656
+ ...options
657
+ }
658
+ ]);
659
+ }
660
+ function stack(options = {}) {
661
+ return createLayout([
662
+ "div",
663
+ {
664
+ layout: {
665
+ type: "stack",
666
+ gap: options.gap || "1rem",
667
+ ...options.layout
668
+ },
669
+ ...options
670
+ }
671
+ ]);
672
+ }
673
+ function template(fn, props = {}) {
674
+ const schema = fn(props);
675
+ return createLayout(schema);
676
+ }
677
+ var performance = {
678
+ clearCache: clearClassCache,
679
+ clearFragmentPool,
680
+ clearAll() {
681
+ clearClassCache();
682
+ clearFragmentPool();
683
+ },
684
+ getStats() {
685
+ return {
686
+ message: "Performance stats available in browser console"
687
+ };
688
+ }
689
+ };
690
+ export {
691
+ template,
692
+ stack,
693
+ setLayoutClasses,
694
+ row,
695
+ renderElements,
696
+ processClassNames,
697
+ performance,
698
+ layout,
699
+ jsx,
700
+ isComponent,
701
+ h,
702
+ grid,
703
+ getLayoutType2 as getLayoutType,
704
+ getLayoutPrefix,
705
+ flattenLayout,
706
+ createLayout as default,
707
+ createLayoutResult,
708
+ createLayout,
709
+ createJsxLayout,
710
+ component,
711
+ clearFragmentPool,
712
+ clearClassCache,
713
+ cleanupLayoutClasses,
714
+ applyLayoutItemClasses,
715
+ applyLayoutClasses,
716
+ Fragment
717
+ };
718
+
719
+ //# debugId=8F4403D255F8A70864756E2164756E21
720
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvcmUvbGF5b3V0L3NjaGVtYS50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9sYXlvdXQvY29uZmlnLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL2xheW91dC9qc3gudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvbGF5b3V0L2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8qKlxuICogQG1vZHVsZSBjb3JlL2xheW91dC9zY2hlbWFcbiAqIEBkZXNjcmlwdGlvbiBVbmlmaWVkIGxheW91dCBzY2hlbWEgcHJvY2Vzc29yIHdpdGggaW50ZWdyYXRlZCBvcHRpbWl6YXRpb25zXG4gKiBDb25zb2xpZGF0ZXMgYXJyYXksIG9iamVjdCwgSlNYLCBhbmQgdGVtcGxhdGUgcHJvY2Vzc2luZyB3aXRoIGJ1aWx0LWluIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50c1xuICovXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTIChFc3NlbnRpYWwgb25seSlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBMYXlvdXRDb25maWcge1xuICAvKiogQmFzZSBsYXlvdXQgdHlwZSAqL1xuICB0eXBlPzogXCJzdGFja1wiIHwgXCJyb3dcIiB8IFwiZ3JpZFwiIHwgc3RyaW5nO1xuICAvKiogU3BhY2luZyBiZXR3ZWVuIGVsZW1lbnRzICovXG4gIGdhcD86IG51bWJlciB8IHN0cmluZztcbiAgLyoqIEFkZGl0aW9uYWwgQ1NTIGNsYXNzZXMgKi9cbiAgY2xhc3M/OiBzdHJpbmc7XG4gIC8qKiBBbGlnbm1lbnQgb2YgaXRlbXMgYWxvbmcgdGhlIGNyb3NzIGF4aXMgKi9cbiAgYWxpZ24/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiB8IFwic3RyZXRjaFwiO1xuICAvKiogQWxpZ25tZW50IG9mIGl0ZW1zIGFsb25nIHRoZSBtYWluIGF4aXMgKi9cbiAganVzdGlmeT86IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiIHwgXCJiZXR3ZWVuXCIgfCBcImFyb3VuZFwiIHwgXCJldmVubHlcIjtcbiAgLyoqIFdoZXRoZXIgYW5kIGhvdyBpdGVtcyBzaG91bGQgd3JhcCAqL1xuICB3cmFwPzogYm9vbGVhbiB8IFwicmV2ZXJzZVwiIHwgXCJub3dyYXBcIjtcbiAgLyoqIFdoZXRoZXIgcm93IGl0ZW1zIHNob3VsZCBzdGFjayB2ZXJ0aWNhbGx5IG9uIG1vYmlsZSAqL1xuICBtb2JpbGVTdGFjaz86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHJvdyBpdGVtcyBzaG91bGQgc2Nyb2xsIGhvcml6b250YWxseSBvbiBtb2JpbGUgKi9cbiAgbW9iaWxlU2Nyb2xsPzogYm9vbGVhbjtcbiAgLyoqIE51bWJlciBvZiBjb2x1bW5zIG9yIGF1dG9tYXRpYyBzaXppbmcgbWV0aG9kICovXG4gIGNvbHVtbnM/OiBudW1iZXIgfCBcImF1dG8tZml0XCIgfCBcImF1dG8tZmlsbFwiO1xuICAvKiogV2hldGhlciB0byB1c2UgZGVuc2UgcGFja2luZyBhbGdvcml0aG0gZm9yIGdyaWQgKi9cbiAgZGVuc2U/OiBib29sZWFuO1xuICAvKiogV2hldGhlciBncmlkIGl0ZW1zIHNob3VsZCBhZGp1c3QgaGVpZ2h0IGF1dG9tYXRpY2FsbHkgKi9cbiAgYXV0b0hlaWdodD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0SXRlbUNvbmZpZyB7XG4gIC8qKiBDb2x1bW4gd2lkdGggaW4gYSAxMi1jb2x1bW4gZ3JpZCAqL1xuICB3aWR0aD86IG51bWJlcjtcbiAgLyoqIFdpZHRoIG9uIHNtYWxsIHNjcmVlbnMgKi9cbiAgc20/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBtZWRpdW0gc2NyZWVucyAqL1xuICBtZD86IG51bWJlcjtcbiAgLyoqIFdpZHRoIG9uIGxhcmdlIHNjcmVlbnMgKi9cbiAgbGc/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBleHRyYS1sYXJnZSBzY3JlZW5zICovXG4gIHhsPzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIGdyaWQgY29sdW1ucyB0byBzcGFuICovXG4gIHNwYW4/OiBudW1iZXI7XG4gIC8qKiBOdW1iZXIgb2YgZ3JpZCByb3dzIHRvIHNwYW4gKi9cbiAgcm93U3Bhbj86IG51bWJlcjtcbiAgLyoqIERpc3BsYXkgb3JkZXIgKi9cbiAgb3JkZXI/OiBudW1iZXIgfCBcImZpcnN0XCIgfCBcImxhc3RcIjtcbiAgLyoqIFNlbGYtYWxpZ25tZW50IHdpdGhpbiBjb250YWluZXIgKi9cbiAgYWxpZ24/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiB8IFwic3RyZXRjaFwiO1xuICAvKiogV2hldGhlciBpdGVtIHNob3VsZCBhdXRvbWF0aWNhbGx5IHNpemUgKi9cbiAgYXV0bz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0T3B0aW9ucyB7XG4gIC8qKiBEZWZhdWx0IGNyZWF0b3IgZnVuY3Rpb24gdG8gdXNlIGlmIG5vdCBzcGVjaWZpZWQgaW4gc2NoZW1hICovXG4gIGNyZWF0b3I/OiBGdW5jdGlvbjtcbiAgLyoqIFdoZXRoZXIgdG8gYXBwbHkgQ1NTIGNsYXNzIHByZWZpeCBAZGVmYXVsdCB0cnVlICovXG4gIHByZWZpeD86IGJvb2xlYW47XG4gIC8qKiBBZGRpdGlvbmFsIG9wdGlvbnMgKi9cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dFJlc3VsdCB7XG4gIC8qKiBUaGUgcmF3IGxheW91dCBvYmplY3Qgd2l0aCBhbGwgY29tcG9uZW50cyAqL1xuICBsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIHJvb3QgZWxlbWVudCBmb3IgY29udmVuaWVuY2UgKi9cbiAgZWxlbWVudDogSFRNTEVsZW1lbnQgfCBhbnk7XG4gIC8qKiBGbGF0dGVuZWQgY29tcG9uZW50IG1hcCAqL1xuICBjb21wb25lbnQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIC8qKiBHZXRzIGEgY29tcG9uZW50IGJ5IG5hbWUgKi9cbiAgZ2V0KG5hbWU6IHN0cmluZyk6IGFueTtcbiAgLyoqIEdldHMgYWxsIGNvbXBvbmVudHMgaW4gYSBmbGF0dGVuZWQgbWFwICovXG4gIGdldEFsbCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvKiogRGVzdHJveXMgdGhlIGxheW91dCwgY2xlYW5pbmcgdXAgYWxsIGNvbXBvbmVudHMgKi9cbiAgZGVzdHJveSgpOiB2b2lkO1xufVxuXG50eXBlIENvbXBvbmVudExpa2UgPSB7IGVsZW1lbnQ6IEhUTUxFbGVtZW50OyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbnR5cGUgU2NoZW1hSXRlbSA9IEZ1bmN0aW9uIHwgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55PiB8IFNjaGVtYUl0ZW1bXTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQlVJTFQtSU4gT1BUSU1JWkFUSU9OU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEZyYWdtZW50IFBvb2wgZm9yIGVmZmljaWVudCBEb2N1bWVudEZyYWdtZW50IHJldXNlXG4gKiBSZWR1Y2VzIEdDIHByZXNzdXJlIGluIGhpZ2gtZnJlcXVlbmN5IGxheW91dCBjcmVhdGlvbiBzY2VuYXJpb3NcbiAqL1xuY2xhc3MgRnJhZ21lbnRQb29sIHtcbiAgcHJpdmF0ZSBwb29sOiBEb2N1bWVudEZyYWdtZW50W10gPSBbXTtcbiAgcHJpdmF0ZSBtYXhTaXplID0gODsgLy8gT3B0aW1pemVkIHNpemUgZm9yIG1lbW9yeSBlZmZpY2llbmN5XG5cbiAgZ2V0KCk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiB0aGlzLnBvb2wucG9wKCkgfHwgZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICB9XG5cbiAgcmVsZWFzZShmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvb2wubGVuZ3RoIDwgdGhpcy5tYXhTaXplICYmIGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnBvb2wucHVzaChmcmFnbWVudCk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5wb29sLmxlbmd0aCA9IDA7XG4gIH1cbn1cblxuY29uc3QgZnJhZ21lbnRQb29sID0gbmV3IEZyYWdtZW50UG9vbCgpO1xuXG4vKipcbiAqIENsYXNzIG5hbWUgY2FjaGUgZm9yIGxheW91dCBjb25maWd1cmF0aW9uc1xuICogUmVkdWNlcyBzdHJpbmcgb3BlcmF0aW9ucyBieSBjYWNoaW5nIGdlbmVyYXRlZCBjbGFzcyBuYW1lc1xuICovXG5jb25zdCBjbGFzc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuLy8gQ29uZmlndXJhdGlvbiBjb25zdGFudHNcbmNvbnN0IFBSRUZJWCA9IFwibXRybFwiOyAvLyBUT0RPOiBNYWtlIHRoaXMgY29uZmlndXJhYmxlXG5jb25zdCBQUkVGSVhfV0lUSF9EQVNIID0gYCR7UFJFRklYfS1gO1xuXG4vKipcbiAqIEdldHMgYSBjYWNoZWQgY2xhc3MgbmFtZSBmb3IgbGF5b3V0IGNvbmZpZ3VyYXRpb25cbiAqIE9wdGltaXplZCBmb3IgZGlmZmVyZW50IGNsYXNzIG5hbWluZyBwYXR0ZXJuc1xuICovXG5mdW5jdGlvbiBnZXRDYWNoZWRDbGFzc05hbWUoXG4gIHR5cGU6IHN0cmluZyxcbiAgcHJvcGVydHk6IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyB8IG51bWJlcixcbik6IHN0cmluZyB7XG4gIGNvbnN0IGtleSA9IGAke3R5cGV9LSR7cHJvcGVydHl9LSR7dmFsdWV9YDtcbiAgaWYgKCFjbGFzc0NhY2hlLmhhcyhrZXkpKSB7XG4gICAgaWYgKHR5cGUgPT09IFwiaXRlbVwiKSB7XG4gICAgICBjbGFzc0NhY2hlLnNldChcbiAgICAgICAga2V5LFxuICAgICAgICBwcm9wZXJ0eSA9PT0gXCJcIlxuICAgICAgICAgID8gYGxheW91dF9faXRlbS0tJHt2YWx1ZX1gXG4gICAgICAgICAgOiBgbGF5b3V0X19pdGVtLS0ke3Byb3BlcnR5fS0ke3ZhbHVlfWAsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgbGF5b3V0IGNsYXNzZXMsIGFsaWduIHVzZXMgbGF5b3V0LS17dHlwZX0te3ZhbHVlfVxuICAgICAgLy8gYnV0IGp1c3RpZnkgYW5kIG90aGVycyB1c2UgbGF5b3V0LS17dHlwZX0te3Byb3BlcnR5fS17dmFsdWV9XG4gICAgICBpZiAocHJvcGVydHkgPT09IFwiYWxpZ25cIikge1xuICAgICAgICBjbGFzc0NhY2hlLnNldChrZXksIGBsYXlvdXQtLSR7dHlwZX0tJHt2YWx1ZX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsYXNzQ2FjaGUuc2V0KGtleSwgYGxheW91dC0tJHt0eXBlfS0ke3Byb3BlcnR5fS0ke3ZhbHVlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2xhc3NDYWNoZS5nZXQoa2V5KSE7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE9QVElNSVpFRCBVVElMSVRJRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBhIGNvbXBvbmVudCBvYmplY3QgKGhhcyBhbiBlbGVtZW50IHByb3BlcnR5KVxuICovXG5mdW5jdGlvbiBpc0NvbXBvbmVudCh2YWx1ZTogYW55KTogdmFsdWUgaXMgQ29tcG9uZW50TGlrZSB7XG4gIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgXCJlbGVtZW50XCIgaW4gdmFsdWU7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRvY3VtZW50IGZyYWdtZW50IHVzaW5nIHBvb2xpbmcgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICovXG5mdW5jdGlvbiBjcmVhdGVGcmFnbWVudCgpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgcmV0dXJuIGZyYWdtZW50UG9vbC5nZXQoKTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlcyBhIGZyYWdtZW50IGJhY2sgdG8gdGhlIHBvb2wgZm9yIHJldXNlXG4gKi9cbmZ1bmN0aW9uIHJlbGVhc2VGcmFnbWVudChmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCk6IHZvaWQge1xuICBmcmFnbWVudFBvb2wucmVsZWFzZShmcmFnbWVudCk7XG59XG5cbi8qKlxuICogT3B0aW1pemVkIGNsYXNzIHByb2Nlc3Npbmcgd2l0aCBtaW5pbWFsIHN0cmluZyBvcGVyYXRpb25zXG4gKiBIYW5kbGVzIGFycmF5cywgc3RyaW5ncywgY2xhc3NOYW1lIGFsaWFzZXMsIGFuZCByYXdDbGFzcyBlZmZpY2llbnRseVxuICovXG5mdW5jdGlvbiBwcm9jZXNzQ2xhc3NOYW1lcyhcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PixcbiAgc2tpcFByZWZpeCA9IGZhbHNlLFxuKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGlmICghb3B0aW9ucykgcmV0dXJuIG9wdGlvbnM7XG5cbiAgY29uc3QgaGFzUmF3Q2xhc3MgPSBvcHRpb25zLnJhd0NsYXNzO1xuICBjb25zdCBoYXNSZWd1bGFyQ2xhc3MgPSBvcHRpb25zLmNsYXNzIHx8IG9wdGlvbnMuY2xhc3NOYW1lO1xuXG4gIC8vIEZhc3QgcGF0aDogbm8gY2xhc3MgcHJvcGVydGllcyBhdCBhbGxcbiAgaWYgKCFoYXNSYXdDbGFzcyAmJiAhaGFzUmVndWxhckNsYXNzKSByZXR1cm4gb3B0aW9ucztcblxuICAvLyBGYXN0IHBhdGg6IG9ubHkgcmF3Q2xhc3MgYW5kIHNraXBwaW5nIHByZWZpeCAobW9zdCBjb21tb24gcmF3Q2xhc3Mgc2NlbmFyaW8pXG4gIGlmIChoYXNSYXdDbGFzcyAmJiAhaGFzUmVndWxhckNsYXNzICYmIHNraXBQcmVmaXgpIHtcbiAgICBjb25zdCBwcm9jZXNzZWQgPSB7IC4uLm9wdGlvbnMgfTtcbiAgICBkZWxldGUgcHJvY2Vzc2VkLnJhd0NsYXNzO1xuXG4gICAgLy8gRGlyZWN0IGFzc2lnbm1lbnQgZm9yIHNpbXBsZSBzdHJpbmdcbiAgICBpZiAodHlwZW9mIGhhc1Jhd0NsYXNzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBwcm9jZXNzZWQuY2xhc3MgPSBoYXNSYXdDbGFzcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGFuZGxlIGFycmF5IGNhc2VcbiAgICAgIHByb2Nlc3NlZC5jbGFzcyA9IGhhc1Jhd0NsYXNzLmpvaW4oXCIgXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvY2Vzc2VkO1xuICB9XG5cbiAgLy8gRnVsbCBwcm9jZXNzaW5nIHBhdGggKG9ubHkgd2hlbiBuZWVkZWQpXG4gIGNvbnN0IHByb2Nlc3NlZCA9IHsgLi4ub3B0aW9ucyB9O1xuICBsZXQgZmluYWxDbGFzc2VzID0gXCJcIjtcblxuICAvLyBIYW5kbGUgcHJlZml4ZWQgY2xhc3NlcyBvbmx5IGlmIG5vdCBza2lwcGluZyBwcmVmaXhcbiAgaWYgKCFza2lwUHJlZml4ICYmIGhhc1JlZ3VsYXJDbGFzcykge1xuICAgIGxldCBwcmVmaXhlZFN0cmluZyA9IFwiXCI7XG5cbiAgICBpZiAocHJvY2Vzc2VkLmNsYXNzKSB7XG4gICAgICBwcmVmaXhlZFN0cmluZyArPSBBcnJheS5pc0FycmF5KHByb2Nlc3NlZC5jbGFzcylcbiAgICAgICAgPyBwcm9jZXNzZWQuY2xhc3Muam9pbihcIiBcIilcbiAgICAgICAgOiBwcm9jZXNzZWQuY2xhc3M7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzZWQuY2xhc3NOYW1lKSB7XG4gICAgICBwcmVmaXhlZFN0cmluZyArPSAocHJlZml4ZWRTdHJpbmcgPyBcIiBcIiA6IFwiXCIpICsgcHJvY2Vzc2VkLmNsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBpZiAocHJlZml4ZWRTdHJpbmcpIHtcbiAgICAgIGZpbmFsQ2xhc3NlcyA9IHByZWZpeGVkU3RyaW5nXG4gICAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLm1hcCgoY2xzKSA9PlxuICAgICAgICAgIGNscy5zdGFydHNXaXRoKFBSRUZJWF9XSVRIX0RBU0gpID8gY2xzIDogUFJFRklYX1dJVEhfREFTSCArIGNscyxcbiAgICAgICAgKVxuICAgICAgICAuam9pbihcIiBcIik7XG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIHJhd0NsYXNzIChhbHdheXMgcHJvY2Vzc2VkIHdoZW4gcHJlc2VudClcbiAgaWYgKGhhc1Jhd0NsYXNzKSB7XG4gICAgY29uc3QgcmF3U3RyaW5nID0gQXJyYXkuaXNBcnJheShoYXNSYXdDbGFzcylcbiAgICAgID8gaGFzUmF3Q2xhc3MuZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCIgXCIpXG4gICAgICA6IGhhc1Jhd0NsYXNzO1xuXG4gICAgZmluYWxDbGFzc2VzICs9IChmaW5hbENsYXNzZXMgPyBcIiBcIiA6IFwiXCIpICsgcmF3U3RyaW5nO1xuICB9XG5cbiAgaWYgKGZpbmFsQ2xhc3Nlcykge1xuICAgIHByb2Nlc3NlZC5jbGFzcyA9IGZpbmFsQ2xhc3NlcztcbiAgfVxuXG4gIC8vIENsZWFuIHVwIGluIG9uZSBvcGVyYXRpb25cbiAgZGVsZXRlIHByb2Nlc3NlZC5jbGFzc05hbWU7XG4gIGRlbGV0ZSBwcm9jZXNzZWQucmF3Q2xhc3M7XG5cbiAgcmV0dXJuIHByb2Nlc3NlZDtcbn1cblxuLyoqXG4gKiBPcHRpbWl6ZWQgcGFyYW1ldGVyIGV4dHJhY3Rpb24gZm9yIGFycmF5IHNjaGVtYXNcbiAqIFJlZHVjZXMgbXVsdGlwbGUgYXJyYXkgbG9va3VwcyB3aXRoIGJhdGNoIHByb2Nlc3NpbmdcbiAqL1xuaW50ZXJmYWNlIEV4dHJhY3RlZFBhcmFtZXRlcnMge1xuICBjcmVhdG9yOiBGdW5jdGlvbjtcbiAgbmFtZT86IHN0cmluZztcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgY29uc3VtZWQ6IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFBhcmFtZXRlcnMoXG4gIHNjaGVtYTogU2NoZW1hSXRlbVtdLFxuICBzdGFydEluZGV4OiBudW1iZXIsXG4gIGRlZmF1bHRDcmVhdG9yOiBGdW5jdGlvbixcbik6IEV4dHJhY3RlZFBhcmFtZXRlcnMge1xuICBjb25zdCBpdGVtcyA9IHNjaGVtYS5zbGljZShzdGFydEluZGV4LCBzdGFydEluZGV4ICsgMyk7XG4gIGxldCBjcmVhdG9yLCBuYW1lLCBvcHRpb25zO1xuICBsZXQgY29uc3VtZWQgPSAxO1xuXG4gIGNvbnN0IFtmaXJzdCwgc2Vjb25kLCB0aGlyZF0gPSBpdGVtcztcblxuICBpZiAodHlwZW9mIGZpcnN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjcmVhdG9yID0gZmlyc3Q7XG4gICAgaWYgKHR5cGVvZiBzZWNvbmQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG5hbWUgPSBzZWNvbmQ7XG4gICAgICBjb25zdW1lZCA9IDI7XG4gICAgICBpZiAoaXNPYmplY3QodGhpcmQpKSB7XG4gICAgICAgIG9wdGlvbnMgPSB0aGlyZDtcbiAgICAgICAgY29uc3VtZWQgPSAzO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNPYmplY3Qoc2Vjb25kKSkge1xuICAgICAgb3B0aW9ucyA9IHNlY29uZDtcbiAgICAgIGNvbnN1bWVkID0gMjtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGZpcnN0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgY3JlYXRvciA9IGRlZmF1bHRDcmVhdG9yO1xuICAgIG5hbWUgPSBmaXJzdDtcbiAgICBpZiAoaXNPYmplY3Qoc2Vjb25kKSkge1xuICAgICAgb3B0aW9ucyA9IHNlY29uZDtcbiAgICAgIGNvbnN1bWVkID0gMjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoZmlyc3QpKSB7XG4gICAgY3JlYXRvciA9IGRlZmF1bHRDcmVhdG9yO1xuICAgIG9wdGlvbnMgPSBmaXJzdDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY3JlYXRvcjogY3JlYXRvciB8fCBkZWZhdWx0Q3JlYXRvcixcbiAgICBuYW1lLFxuICAgIG9wdGlvbnM6IChvcHRpb25zIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNvbnN1bWVkLFxuICB9O1xufVxuXG4vKipcbiAqIFNpbXBsZSBvYmplY3QgdHlwZSBjaGVja1xuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBET00gVVRJTElUSUVTIChTaW1wbGlmaWVkKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFNpbXBsZSBET00gZWxlbWVudCBjcmVhdGlvblxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSk6IEhUTUxFbGVtZW50IHtcbiAgY29uc3QgdGFnID0gb3B0aW9ucy50YWcgfHwgXCJkaXZcIjtcbiAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcblxuICBpZiAob3B0aW9ucy5jbGFzcykge1xuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gb3B0aW9ucy5jbGFzcztcbiAgfVxuXG4gIGlmIChvcHRpb25zLnN0eWxlKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnN0eWxlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIG9wdGlvbnMuc3R5bGUpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuc3R5bGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgb3B0aW9ucy5zdHlsZSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdGlvbnMudGV4dENvbnRlbnQpIHtcbiAgICBlbGVtZW50LnRleHRDb250ZW50ID0gb3B0aW9ucy50ZXh0Q29udGVudDtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnRleHQpIHtcbiAgICBlbGVtZW50LnRleHRDb250ZW50ID0gb3B0aW9ucy50ZXh0O1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbi8qKlxuICogQWRkcyBhIENTUyBjbGFzcyB0byBhbiBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGFkZENsYXNzKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjbGFzc05hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZWxlbWVudCAmJiBjbGFzc05hbWUpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBlbGVtZW50IGhhcyBhIENTUyBjbGFzc1xuICovXG5mdW5jdGlvbiBoYXNDbGFzcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY2xhc3NOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVU5JRklFRCBDT01QT05FTlQgQ1JFQVRJT04gKHdpdGggZGVzdHJ1Y3R1cmluZyBvcHRpbWl6YXRpb24pXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbXBvbmVudCBpbnN0YW5jZSB3aXRoIG9wdGltaXplZCBvcHRpb24gcHJvY2Vzc2luZ1xuICogVXNlcyBkZXN0cnVjdHVyaW5nIGZvciBjbGVhbmVyIHNlcGFyYXRpb24gb2YgY29uY2VybnNcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoXG4gIENvbXBvbmVudDogYW55LFxuICBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sXG4pOiBhbnkge1xuICB0cnkge1xuICAgIC8vIERlc3RydWN0dXJlIHNwZWNpYWwgY29uZmlncyBpbiBvbmUgb3BlcmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgbGF5b3V0OiBsYXlvdXRDb25maWcsXG4gICAgICBsYXlvdXRJdGVtOiBsYXlvdXRJdGVtQ29uZmlnLFxuICAgICAgc3R5bGU6IHN0eWxlQ29uZmlnLFxuICAgICAgYXR0cmlidXRlczogYXR0cmlidXRlc0NvbmZpZyxcbiAgICAgIGV2ZW50czogZXZlbnRzQ29uZmlnLFxuICAgICAgZXZlbnQsIC8vIExlZ2FjeSBzdXBwb3J0XG4gICAgICAuLi5jbGVhbk9wdGlvbnNcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIC8vIFVzZSBldmVudHMgb3ZlciBldmVudCAoZXZlbnRzIGlzIHByZWZlcnJlZClcbiAgICBjb25zdCBmaW5hbEV2ZW50c0NvbmZpZyA9IGV2ZW50c0NvbmZpZyB8fCBldmVudDtcblxuICAgIC8vIElmIHN0eWxlIGlzIGEgc3RyaW5nLCBhbHdheXMgcGFzcyBpdCB0aHJvdWdoIHRvIHRoZSBjb21wb25lbnRcbiAgICBpZiAoc3R5bGVDb25maWcgJiYgdHlwZW9mIHN0eWxlQ29uZmlnID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjbGVhbk9wdGlvbnMuc3R5bGUgPSBzdHlsZUNvbmZpZztcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY29tcG9uZW50XG4gICAgY29uc3QgaXNDbGFzcyA9XG4gICAgICB0eXBlb2YgQ29tcG9uZW50ID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoQ29tcG9uZW50LCBcInByb3RvdHlwZVwiKT8ud3JpdGFibGUgPT09XG4gICAgICAgIGZhbHNlO1xuXG4gICAgY29uc3QgY29tcG9uZW50ID0gaXNDbGFzc1xuICAgICAgPyBuZXcgQ29tcG9uZW50KGNsZWFuT3B0aW9ucylcbiAgICAgIDogQ29tcG9uZW50KGNsZWFuT3B0aW9ucyk7XG5cbiAgICAvLyBBcHBseSBjb25maWd1cmF0aW9ucyBpZiBjb21wb25lbnQgaGFzIGVsZW1lbnRcbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID1cbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQgfHxcbiAgICAgICAgKGNvbXBvbmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gY29tcG9uZW50IDogbnVsbCk7XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAvLyBBcHBseSBsYXlvdXQgY2xhc3Nlc1xuICAgICAgICBpZiAobGF5b3V0Q29uZmlnKSBhcHBseUxheW91dENsYXNzZXMoZWxlbWVudCwgbGF5b3V0Q29uZmlnKTtcblxuICAgICAgICAvLyBBcHBseSBsYXlvdXQgaXRlbSBjbGFzc2VzXG4gICAgICAgIGlmIChsYXlvdXRJdGVtQ29uZmlnKSBhcHBseUxheW91dEl0ZW1DbGFzc2VzKGVsZW1lbnQsIGxheW91dEl0ZW1Db25maWcpO1xuXG4gICAgICAgIC8vIEFwcGx5IHN0eWxlXG4gICAgICAgIGlmIChzdHlsZUNvbmZpZyAmJiB0eXBlb2Ygc3R5bGVDb25maWcgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlQ29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IGF0dHJpYnV0ZXNcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXNDb25maWcgJiYgdHlwZW9mIGF0dHJpYnV0ZXNDb25maWcgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzQ29uZmlnKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBldmVudHNcbiAgICAgICAgaWYgKGZpbmFsRXZlbnRzQ29uZmlnICYmIHR5cGVvZiBmaW5hbEV2ZW50c0NvbmZpZyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbmFsRXZlbnRzQ29uZmlnKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBldmVudERlZiBvZiBmaW5hbEV2ZW50c0NvbmZpZykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShldmVudERlZikgJiYgZXZlbnREZWYubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbZXZlbnROYW1lLCBoYW5kbGVyXSA9IGV2ZW50RGVmO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudE5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtldmVudE5hbWUsIGhhbmRsZXJdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgICAgICBmaW5hbEV2ZW50c0NvbmZpZyxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGNyZWF0aW5nIGNvbXBvbmVudCBpbnN0YW5jZTpcIiwgZXJyb3IpO1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIElOVEVHUkFURUQgTEFZT1VUIENPTkZJR1VSQVRJT04gKHdpdGggY2FjaGluZylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBBcHBsaWVzIGxheW91dCBjbGFzc2VzIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb25cbiAqIFVzZXMgaW50ZWdyYXRlZCBjYWNoaW5nIGZvciBvcHRpbWFsIHBlcmZvcm1hbmNlXG4gKi9cbmZ1bmN0aW9uIGFwcGx5TGF5b3V0Q2xhc3NlcyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIGxheW91dENvbmZpZzogTGF5b3V0Q29uZmlnLFxuKTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhbGF5b3V0Q29uZmlnKSByZXR1cm47XG5cbiAgLy8gQXBwbHkgYmFzZSBsYXlvdXQgdHlwZVxuICBpZiAobGF5b3V0Q29uZmlnLnR5cGUpIHtcbiAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tJHtsYXlvdXRDb25maWcudHlwZX1gKTtcbiAgfVxuXG4gIC8vIEFwcGx5IHByb3BlcnRpZXMgd2l0aCBjYWNoaW5nXG4gIGNvbnN0IGxheW91dFR5cGUgPSBsYXlvdXRDb25maWcudHlwZSB8fCBnZXRMYXlvdXRUeXBlKGVsZW1lbnQpO1xuICBpZiAobGF5b3V0VHlwZSkge1xuICAgIGlmIChsYXlvdXRDb25maWcuZ2FwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgICBnZXRDYWNoZWRDbGFzc05hbWUobGF5b3V0VHlwZSwgXCJnYXBcIiwgbGF5b3V0Q29uZmlnLmdhcCksXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLmFsaWduKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKGxheW91dFR5cGUsIFwiYWxpZ25cIiwgbGF5b3V0Q29uZmlnLmFsaWduKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChsYXlvdXRDb25maWcuanVzdGlmeSkge1xuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIFBSRUZJWF9XSVRIX0RBU0ggK1xuICAgICAgICAgIGdldENhY2hlZENsYXNzTmFtZShsYXlvdXRUeXBlLCBcImp1c3RpZnlcIiwgbGF5b3V0Q29uZmlnLmp1c3RpZnkpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBHcmlkLXNwZWNpZmljIHByb3BlcnRpZXNcbiAgaWYgKGxheW91dENvbmZpZy50eXBlID09PSBcImdyaWRcIiB8fCBnZXRMYXlvdXRUeXBlKGVsZW1lbnQpID09PSBcImdyaWRcIikge1xuICAgIGlmICh0eXBlb2YgbGF5b3V0Q29uZmlnLmNvbHVtbnMgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgICBnZXRDYWNoZWRDbGFzc05hbWUoXCJncmlkXCIsIFwiY29sc1wiLCBsYXlvdXRDb25maWcuY29sdW1ucyksXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAobGF5b3V0Q29uZmlnLmNvbHVtbnMgPT09IFwiYXV0by1maWxsXCIpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiZ3JpZFwiLCBcImZpbGxcIiwgXCJhdXRvXCIpLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGxheW91dENvbmZpZy5jb2x1bW5zID09PSBcImF1dG8tZml0XCIpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiZ3JpZFwiLCBcImNvbHNcIiwgXCJhdXRvLWZpdFwiKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChsYXlvdXRDb25maWcuZGVuc2UpXG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tZ3JpZC1kZW5zZWApO1xuICAgIGlmIChsYXlvdXRDb25maWcuYXV0b0hlaWdodClcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1ncmlkLWF1dG8taGVpZ2h0YCk7XG4gIH1cblxuICAvLyBSb3ctc3BlY2lmaWMgcHJvcGVydGllc1xuICBpZiAobGF5b3V0Q29uZmlnLnR5cGUgPT09IFwicm93XCIgfHwgZ2V0TGF5b3V0VHlwZShlbGVtZW50KSA9PT0gXCJyb3dcIikge1xuICAgIGlmIChsYXlvdXRDb25maWcud3JhcCA9PT0gZmFsc2UgfHwgbGF5b3V0Q29uZmlnLndyYXAgPT09IFwibm93cmFwXCIpIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3ctbm93cmFwYCk7XG4gICAgfSBlbHNlIGlmIChsYXlvdXRDb25maWcud3JhcCA9PT0gXCJyZXZlcnNlXCIpIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3ctd3JhcC1yZXZlcnNlYCk7XG4gICAgfVxuICAgIGlmIChsYXlvdXRDb25maWcubW9iaWxlU3RhY2spXG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93LW1vYmlsZS1zdGFja2ApO1xuICAgIGlmIChsYXlvdXRDb25maWcubW9iaWxlU2Nyb2xsKVxuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLXJvdy1tb2JpbGUtc2Nyb2xsYCk7XG4gIH1cblxuICAvLyBDdXN0b20gY2xhc3Nlc1xuICBpZiAobGF5b3V0Q29uZmlnLmNsYXNzKSB7XG4gICAgbGF5b3V0Q29uZmlnLmNsYXNzXG4gICAgICAuc3BsaXQoXCIgXCIpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuZm9yRWFjaCgoY2xzKSA9PiBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xzKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIGxheW91dCBpdGVtIGNsYXNzZXMgYmFzZWQgb24gY29uZmlndXJhdGlvblxuICogVXNlcyBpbnRlZ3JhdGVkIGNhY2hpbmcgZm9yIG9wdGltYWwgcGVyZm9ybWFuY2VcbiAqL1xuZnVuY3Rpb24gYXBwbHlMYXlvdXRJdGVtQ2xhc3NlcyhcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIGl0ZW1Db25maWc6IExheW91dEl0ZW1Db25maWcsXG4pOiB2b2lkIHtcbiAgaWYgKCFlbGVtZW50IHx8ICFpdGVtQ29uZmlnKSByZXR1cm47XG5cbiAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXRfX2l0ZW1gKTtcblxuICAvLyBXaWR0aCBhbmQgcmVzcG9uc2l2ZSBjbGFzc2VzIHdpdGggY2FjaGluZ1xuICBpZiAoaXRlbUNvbmZpZy53aWR0aCAmJiBpdGVtQ29uZmlnLndpZHRoID49IDEgJiYgaXRlbUNvbmZpZy53aWR0aCA8PSAxMikge1xuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwiXCIsIGl0ZW1Db25maWcud2lkdGgpLFxuICAgICk7XG4gIH1cbiAgaWYgKGl0ZW1Db25maWcuc20pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJzbVwiLCBpdGVtQ29uZmlnLnNtKSxcbiAgICApO1xuICBpZiAoaXRlbUNvbmZpZy5tZClcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcIm1kXCIsIGl0ZW1Db25maWcubWQpLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLmxnKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwibGdcIiwgaXRlbUNvbmZpZy5sZyksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcueGwpXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJ4bFwiLCBpdGVtQ29uZmlnLnhsKSxcbiAgICApO1xuXG4gIC8vIEdyaWQgc3BhbiBjbGFzc2VzXG4gIGlmIChpdGVtQ29uZmlnLnNwYW4pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJzcGFuXCIsIGl0ZW1Db25maWcuc3BhbiksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcucm93U3BhbilcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcInJvdy1zcGFuXCIsIGl0ZW1Db25maWcucm93U3BhbiksXG4gICAgKTtcblxuICAvLyBPcmRlciBhbmQgYWxpZ25tZW50XG4gIGlmIChpdGVtQ29uZmlnLm9yZGVyKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwib3JkZXJcIiwgaXRlbUNvbmZpZy5vcmRlciksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcuYWxpZ24pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJzZWxmXCIsIGl0ZW1Db25maWcuYWxpZ24pLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLmF1dG8pXG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXRfX2l0ZW0tLWF1dG9gKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBsYXlvdXQgdHlwZSBmcm9tIGVsZW1lbnQgY2xhc3Nlc1xuICovXG5mdW5jdGlvbiBnZXRMYXlvdXRUeXBlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1zdGFja2ApXG4gICAgPyBcInN0YWNrXCJcbiAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3dgKVxuICAgICAgPyBcInJvd1wiXG4gICAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1ncmlkYClcbiAgICAgICAgPyBcImdyaWRcIlxuICAgICAgICA6IFwiXCI7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFVOSUZJRUQgU0NIRU1BIFBST0NFU1NPUlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBQcm9jZXNzZXMgYXJyYXktYmFzZWQgc2NoZW1hIGRlZmluaXRpb25zXG4gKiBPcHRpbWl6ZWQgd2l0aCBwYXJhbWV0ZXIgZXh0cmFjdGlvbiBhbmQgaW50ZWdyYXRlZCBjb25maWd1cmF0aW9uXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NBcnJheVNjaGVtYShcbiAgc2NoZW1hOiBTY2hlbWFJdGVtW10gfCBhbnksXG4gIHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGwsXG4gIGxldmVsOiBudW1iZXIgPSAwLFxuICBvcHRpb25zOiBMYXlvdXRPcHRpb25zID0ge30sXG4pOiBMYXlvdXRSZXN1bHQge1xuICBsZXZlbCsrO1xuICBjb25zdCBsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgY29uc3QgY29tcG9uZW50czogQXJyYXk8W3N0cmluZywgYW55XT4gPSBbXTtcbiAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICBsZXQgY29tcG9uZW50ID0gbnVsbDtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkoc2NoZW1hKSkge1xuICAgIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbiAgfVxuXG4gIGNvbnN0IGRlZmF1bHRDcmVhdG9yID0gKG9wdGlvbnMgYXMgYW55KS5jcmVhdG9yIHx8IGNyZWF0ZUVsZW1lbnQ7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWEubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpdGVtID0gc2NoZW1hW2ldO1xuICAgIGlmICghaXRlbSkgY29udGludWU7XG5cbiAgICAvLyBIYW5kbGUgbmVzdGVkIGFycmF5c1xuICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBjb21wb25lbnQgfHwgcGFyZW50RWxlbWVudDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHByb2Nlc3NBcnJheVNjaGVtYShpdGVtLCBjb250YWluZXIsIGxldmVsLCBvcHRpb25zKTtcbiAgICAgIC8vIE1lcmdlIG5lc3RlZCBjb21wb25lbnRzIGFycmF5IGluc3RlYWQgb2Ygb3ZlcndyaXRpbmdcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdC5sYXlvdXQuY29tcG9uZW50cykpIHtcbiAgICAgICAgY29tcG9uZW50cy5wdXNoKC4uLnJlc3VsdC5sYXlvdXQuY29tcG9uZW50cyk7XG4gICAgICAgIGRlbGV0ZSByZXN1bHQubGF5b3V0LmNvbXBvbmVudHM7XG4gICAgICB9XG4gICAgICBPYmplY3QuYXNzaWduKGxheW91dCwgcmVzdWx0LmxheW91dCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBVc2Ugb3B0aW1pemVkIHBhcmFtZXRlciBleHRyYWN0aW9uXG4gICAgY29uc3Qge1xuICAgICAgY3JlYXRvcixcbiAgICAgIG5hbWUsXG4gICAgICBvcHRpb25zOiBpdGVtT3B0aW9ucyxcbiAgICAgIGNvbnN1bWVkLFxuICAgIH0gPSBleHRyYWN0UGFyYW1ldGVycyhzY2hlbWEsIGksIGRlZmF1bHRDcmVhdG9yKTtcblxuICAgIGlmICghY3JlYXRvcikge1xuICAgICAgY29uc29sZS53YXJuKFwiU2tpcHBpbmcgdW5zdXBwb3J0ZWQgaXRlbSB0eXBlOlwiLCBpdGVtKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgdG8gZGl2IGZvciBjcmVhdGVFbGVtZW50XG4gICAgaWYgKGNyZWF0b3IgPT09IGNyZWF0ZUVsZW1lbnQgJiYgIShcInRhZ1wiIGluIGl0ZW1PcHRpb25zKSkge1xuICAgICAgaXRlbU9wdGlvbnMudGFnID0gXCJkaXZcIjtcbiAgICB9XG5cbiAgICAvLyBBZHZhbmNlIGluZGV4IGJ5IGNvbnN1bWVkIGl0ZW1zIG1pbnVzIDEgKGxvb3AgaW5jcmVtZW50IGhhbmRsZXMgdGhlICsxKVxuICAgIGkgKz0gY29uc3VtZWQgLSAxO1xuXG4gICAgLy8gUHJvY2VzcyBvcHRpb25zIHdpdGggcHJlZml4IC0gb3B0aW1pemVkIGRlY2lzaW9uIGxvZ2ljXG4gICAgY29uc3Qgc2hvdWxkQXBwbHlQcmVmaXggPVxuICAgICAgXCJwcmVmaXhcIiBpbiBpdGVtT3B0aW9ucyA/IGl0ZW1PcHRpb25zLnByZWZpeCA6IG9wdGlvbnMucHJlZml4ICE9PSBmYWxzZTtcblxuICAgIC8vIEZhc3QgcGF0aDogcHJvY2VzcyBvbmx5IHdoZW4gbmVlZGVkXG4gICAgY29uc3QgcHJvY2Vzc2VkT3B0aW9ucyA9XG4gICAgICBzaG91bGRBcHBseVByZWZpeCB8fCBpdGVtT3B0aW9ucy5yYXdDbGFzc1xuICAgICAgICA/IHByb2Nlc3NDbGFzc05hbWVzKGl0ZW1PcHRpb25zLCAhc2hvdWxkQXBwbHlQcmVmaXgpXG4gICAgICAgIDogaXRlbU9wdGlvbnM7IC8vIE5vIGNvcHkgbmVlZGVkIGlmIG5vIHByb2Nlc3NpbmdcblxuICAgIC8vIEFkZCBuYW1lIHRvIG9wdGlvbnMgaWYgbmVlZGVkXG4gICAgaWYgKFxuICAgICAgbmFtZSAmJlxuICAgICAgIShcIm5hbWVcIiBpbiBwcm9jZXNzZWRPcHRpb25zKSAmJlxuICAgICAgIShjcmVhdG9yID09PSBjcmVhdGVFbGVtZW50IHx8IChjcmVhdG9yIGFzIGFueSkuaXNFbGVtZW50KVxuICAgICkge1xuICAgICAgcHJvY2Vzc2VkT3B0aW9ucy5uYW1lID0gbmFtZTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY29tcG9uZW50XG4gICAgY29tcG9uZW50ID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoY3JlYXRvciwgcHJvY2Vzc2VkT3B0aW9ucyk7XG4gICAgY29uc3QgZWxlbWVudCA9IGlzQ29tcG9uZW50KGNvbXBvbmVudCkgPyBjb21wb25lbnQuZWxlbWVudCA6IGNvbXBvbmVudDtcblxuICAgIGlmIChsZXZlbCA9PT0gMSkgbGF5b3V0LmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIGlmIChuYW1lKSB7XG4gICAgICBsYXlvdXRbbmFtZV0gPSBjb21wb25lbnQ7XG4gICAgICBjb21wb25lbnRzLnB1c2goW25hbWUsIGNvbXBvbmVudF0pO1xuICAgIH1cblxuICAgIC8vIEFwcGVuZCB0byBET01cbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICBpZiAoXCJpbnNlcnRcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5pbnNlcnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb21wb25lbnQuaW5zZXJ0KGZyYWdtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50RWxlbWVudCkge1xuICAgICAgICBjb21wb25lbnQuX2NvbnRhaW5lciA9IHBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBcIm9uSW5zZXJ0ZWRcIiBpbiBjb21wb25lbnQgJiZcbiAgICAgICAgICB0eXBlb2YgY29tcG9uZW50Lm9uSW5zZXJ0ZWQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICBjb21wb25lbnQub25JbnNlcnRlZChwYXJlbnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEFwcGVuZCBmcmFnbWVudCB0byBwYXJlbnRcbiAgaWYgKHBhcmVudEVsZW1lbnQgJiYgZnJhZ21lbnQuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgY29uc3Qgd3JhcHBlciA9IGlzQ29tcG9uZW50KHBhcmVudEVsZW1lbnQpXG4gICAgICA/IHBhcmVudEVsZW1lbnQuZWxlbWVudFxuICAgICAgOiBwYXJlbnRFbGVtZW50O1xuICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuICB9XG5cbiAgLy8gUmVsZWFzZSBmcmFnbWVudCBiYWNrIHRvIHBvb2xcbiAgcmVsZWFzZUZyYWdtZW50KGZyYWdtZW50KTtcblxuICBsYXlvdXQuY29tcG9uZW50cyA9IGNvbXBvbmVudHM7XG4gIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgb2JqZWN0LWJhc2VkIHNjaGVtYSBkZWZpbml0aW9uc1xuICogU2ltcGxpZmllZCBhbmQgb3B0aW1pemVkIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc09iamVjdFNjaGVtYShcbiAgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgc3RyaW5nLFxuICBwYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsLFxuICBvcHRpb25zOiBMYXlvdXRPcHRpb25zID0ge30sXG4pOiBMYXlvdXRSZXN1bHQge1xuICBjb25zdCBsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgY29uc3QgZGVmYXVsdENyZWF0b3IgPSBvcHRpb25zLmNyZWF0b3IgfHwgY3JlYXRlRWxlbWVudDtcblxuICAvLyBIYW5kbGUgcm9vdCBlbGVtZW50IGNyZWF0aW9uXG4gIGlmICgoc2NoZW1hIGFzIGFueSkuZWxlbWVudCAmJiAhcGFyZW50RWxlbWVudCkge1xuICAgIGNvbnN0IGVsZW1lbnREZWYgPSAoc2NoZW1hIGFzIGFueSkuZWxlbWVudDtcbiAgICBjb25zdCBjcmVhdGVFbGVtZW50Rm4gPSBlbGVtZW50RGVmLmNyZWF0b3IgfHwgZGVmYXVsdENyZWF0b3I7XG5cbiAgICBjb25zdCBlbGVtZW50T3B0aW9ucyA9IGVsZW1lbnREZWYub3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBwcm9jZXNzZWRPcHRpb25zID1cbiAgICAgIG9wdGlvbnMucHJlZml4ICE9PSBmYWxzZVxuICAgICAgICA/IHByb2Nlc3NDbGFzc05hbWVzKGVsZW1lbnRPcHRpb25zKVxuICAgICAgICA6IHsgLi4uZWxlbWVudE9wdGlvbnMgfTtcblxuICAgIGNvbnN0IHJvb3RDb21wb25lbnQgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShcbiAgICAgIGNyZWF0ZUVsZW1lbnRGbixcbiAgICAgIHByb2Nlc3NlZE9wdGlvbnMsXG4gICAgKTtcbiAgICBsYXlvdXQuZWxlbWVudCA9IHJvb3RDb21wb25lbnQ7XG4gICAgaWYgKGVsZW1lbnREZWYubmFtZSkgbGF5b3V0W2VsZW1lbnREZWYubmFtZV0gPSByb290Q29tcG9uZW50O1xuXG4gICAgLy8gUHJvY2VzcyBjaGlsZHJlblxuICAgIGlmIChlbGVtZW50RGVmLmNoaWxkcmVuKSB7XG4gICAgICBjb25zdCByb290RWxlbWVudCA9IGlzQ29tcG9uZW50KHJvb3RDb21wb25lbnQpXG4gICAgICAgID8gcm9vdENvbXBvbmVudC5lbGVtZW50XG4gICAgICAgIDogcm9vdENvbXBvbmVudDtcbiAgICAgIGNvbnN0IGNoaWxkUmVzdWx0ID0gcHJvY2Vzc09iamVjdFNjaGVtYShcbiAgICAgICAgZWxlbWVudERlZi5jaGlsZHJlbixcbiAgICAgICAgcm9vdEVsZW1lbnQsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApO1xuICAgICAgT2JqZWN0LmFzc2lnbihsYXlvdXQsIGNoaWxkUmVzdWx0LmxheW91dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUxheW91dFJlc3VsdChsYXlvdXQpO1xuICB9XG5cbiAgLy8gUHJvY2VzcyBub3JtYWwgc2NoZW1hIGVsZW1lbnRzXG4gIGNvbnN0IGZyYWdtZW50ID0gcGFyZW50RWxlbWVudCA/IGNyZWF0ZUZyYWdtZW50KCkgOiBudWxsO1xuXG4gIGZvciAoY29uc3Qga2V5IGluIHNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgY29uc3QgZGVmID0gKHNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldO1xuICAgIGlmICghZGVmKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGVsZW1lbnRDcmVhdG9yID0gZGVmLmNyZWF0b3IgfHwgZGVmYXVsdENyZWF0b3I7XG4gICAgY29uc3QgZWxlbWVudE9wdGlvbnMgPSBkZWYub3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBzaG91bGRBcHBseVByZWZpeCA9XG4gICAgICBcInByZWZpeFwiIGluIGVsZW1lbnRPcHRpb25zXG4gICAgICAgID8gZWxlbWVudE9wdGlvbnMucHJlZml4XG4gICAgICAgIDogb3B0aW9ucy5wcmVmaXggIT09IGZhbHNlO1xuICAgIGNvbnN0IHByb2Nlc3NlZE9wdGlvbnMgPSBzaG91bGRBcHBseVByZWZpeFxuICAgICAgPyBwcm9jZXNzQ2xhc3NOYW1lcyhlbGVtZW50T3B0aW9ucylcbiAgICAgIDogeyAuLi5lbGVtZW50T3B0aW9ucyB9O1xuXG4gICAgaWYgKCFkZWYubmFtZSAmJiBrZXkgIT09IFwiZWxlbWVudFwiKSB7XG4gICAgICBkZWYubmFtZSA9IGtleTtcbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVkID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoZWxlbWVudENyZWF0b3IsIHByb2Nlc3NlZE9wdGlvbnMpO1xuICAgIGxheW91dFtrZXldID0gY3JlYXRlZDtcbiAgICBpZiAoZGVmLm5hbWUgJiYgZGVmLm5hbWUgIT09IGtleSkgbGF5b3V0W2RlZi5uYW1lXSA9IGNyZWF0ZWQ7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gaXNDb21wb25lbnQoY3JlYXRlZCkgPyBjcmVhdGVkLmVsZW1lbnQgOiBjcmVhdGVkO1xuICAgIGlmIChmcmFnbWVudCkgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG5cbiAgICAvLyBQcm9jZXNzIGNoaWxkcmVuXG4gICAgaWYgKGRlZi5jaGlsZHJlbikge1xuICAgICAgY29uc3QgY2hpbGRSZXN1bHQgPSBwcm9jZXNzT2JqZWN0U2NoZW1hKGRlZi5jaGlsZHJlbiwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICBPYmplY3QuYXNzaWduKGxheW91dCwgY2hpbGRSZXN1bHQubGF5b3V0KTtcbiAgICB9XG4gIH1cblxuICAvLyBBcHBlbmQgdG8gcGFyZW50XG4gIGlmIChwYXJlbnRFbGVtZW50ICYmIGZyYWdtZW50KSB7XG4gICAgY29uc3QgcGFyZW50RG9tID0gaXNDb21wb25lbnQocGFyZW50RWxlbWVudClcbiAgICAgID8gcGFyZW50RWxlbWVudC5lbGVtZW50XG4gICAgICA6IHBhcmVudEVsZW1lbnQ7XG4gICAgcGFyZW50RG9tLmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbiAgICByZWxlYXNlRnJhZ21lbnQoZnJhZ21lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUxheW91dFJlc3VsdChsYXlvdXQpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBMQVlPVVQgUkVTVUxUIENSRUFUSU9OXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRmxhdHRlbnMgYSBuZXN0ZWQgbGF5b3V0IGludG8gYSBzaW1wbGUgb2JqZWN0IHdpdGggZWxlbWVudCBhbmQgY29tcG9uZW50IHJlZmVyZW5jZXNcbiAqL1xuZnVuY3Rpb24gZmxhdHRlbkxheW91dChsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgY29uc3QgZmxhdHRlbmVkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgaWYgKCFsYXlvdXQgfHwgdHlwZW9mIGxheW91dCAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZsYXR0ZW5lZDtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBsYXlvdXQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGxheW91dFtrZXldO1xuICAgIGlmIChcbiAgICAgIHZhbHVlICYmXG4gICAgICB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgKHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHxcbiAgICAgICAgKHR5cGVvZiBTVkdFbGVtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIHZhbHVlIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkgfHxcbiAgICAgICAgaXNDb21wb25lbnQodmFsdWUpKVxuICAgICkge1xuICAgICAgZmxhdHRlbmVkW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmxhdHRlbmVkO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXlvdXQgcmVzdWx0IG9iamVjdCB3aXRoIHV0aWxpdHkgZnVuY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUxheW91dFJlc3VsdChsYXlvdXQ6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBMYXlvdXRSZXN1bHQge1xuICBjb25zdCBmbGF0dGVuZWRDb21wb25lbnRzID0gZmxhdHRlbkxheW91dChsYXlvdXQpO1xuXG4gIHJldHVybiB7XG4gICAgbGF5b3V0LFxuICAgIGVsZW1lbnQ6IGxheW91dC5lbGVtZW50LFxuICAgIGNvbXBvbmVudDogZmxhdHRlbmVkQ29tcG9uZW50cyxcblxuICAgIGdldChuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgICAgcmV0dXJuIGxheW91dFtuYW1lXSA/PyBudWxsO1xuICAgIH0sXG5cbiAgICBnZXRBbGwoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICByZXR1cm4gZmxhdHRlbmVkQ29tcG9uZW50cztcbiAgICB9LFxuXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgIC8vIFRyYWNrIGRlc3Ryb3llZCBjb21wb25lbnRzIHRvIGF2b2lkIGRvdWJsZS1kZXN0cm95XG4gICAgICBjb25zdCBkZXN0cm95ZWQgPSBuZXcgU2V0PGFueT4oKTtcblxuICAgICAgLy8gSGVscGVyIHRvIHNhZmVseSBkZXN0cm95IGEgY29tcG9uZW50XG4gICAgICBjb25zdCBkZXN0cm95Q29tcG9uZW50ID0gKGNvbXBvbmVudDogYW55KTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghY29tcG9uZW50IHx8IGRlc3Ryb3llZC5oYXMoY29tcG9uZW50KSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFNraXAgcGxhaW4gSFRNTCBlbGVtZW50cyBhbmQgbm9uLW9iamVjdHNcbiAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IHR5cGVvZiBjb21wb25lbnQgIT09IFwib2JqZWN0XCIpXG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjb21wb25lbnQgd2l0aCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBkZXN0cm95ZWQuYWRkKGNvbXBvbmVudCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gSWdub3JlIGRlc3Ryb3kgZXJyb3JzIC0gY29tcG9uZW50IG1heSBhbHJlYWR5IGJlIGNsZWFuZWQgdXBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIEZpcnN0IGRlc3Ryb3kgY29tcG9uZW50cyBmcm9tIHRoZSBjb21wb25lbnRzIGFycmF5IChpZiBwcmVzZW50KVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIGFsbCBuYW1lZCBjb21wb25lbnRzIGFyZSBkZXN0cm95ZWQgZXZlbiBpZiBuZXN0ZWRcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGxheW91dC5jb21wb25lbnRzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb21wb25lbnRdIG9mIGxheW91dC5jb21wb25lbnRzKSB7XG4gICAgICAgICAgZGVzdHJveUNvbXBvbmVudChjb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZW4gaXRlcmF0ZSBvdmVyIGFsbCBsYXlvdXQga2V5cyBmb3IgYW55IG1pc3NlZCBjb21wb25lbnRzXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBsYXlvdXQpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJlbGVtZW50XCIgfHwga2V5ID09PSBcImNvbXBvbmVudHNcIikgY29udGludWU7XG4gICAgICAgIGRlc3Ryb3lDb21wb25lbnQobGF5b3V0W2tleV0pO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciB0aGUgY29tcG9uZW50cyBhcnJheVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGF5b3V0LmNvbXBvbmVudHMpKSB7XG4gICAgICAgIGxheW91dC5jb21wb25lbnRzLmxlbmd0aCA9IDA7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSByb290IGVsZW1lbnQgZnJvbSBET01cbiAgICAgIGlmIChsYXlvdXQuZWxlbWVudCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gaXNDb21wb25lbnQobGF5b3V0LmVsZW1lbnQpXG4gICAgICAgICAgPyBsYXlvdXQuZWxlbWVudC5lbGVtZW50XG4gICAgICAgICAgOiBsYXlvdXQuZWxlbWVudDtcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFyIHJlZmVyZW5jZXMgdG8gaGVscCBHQ1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbGF5b3V0KSB7XG4gICAgICAgIGRlbGV0ZSBsYXlvdXRba2V5XTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVTklGSUVEIEVOVFJZIFBPSU5UXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ3JlYXRlcyBhIGxheW91dCBmcm9tIHZhcmlvdXMgc2NoZW1hIGZvcm1hdHNcbiAqIFVuaWZpZWQgcHJvY2Vzc29yIGZvciBhcnJheXMsIG9iamVjdHMsIEpTWCwgYW5kIEhUTUwgc3RyaW5nc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGF5b3V0KFxuICBzY2hlbWE6IGFueSxcbiAgcGFyZW50RWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbCxcbiAgb3B0aW9uczogTGF5b3V0T3B0aW9ucyA9IHt9LFxuKTogTGF5b3V0UmVzdWx0IHtcbiAgLy8gSGFuZGxlIGZ1bmN0aW9uIHNjaGVtYXNcbiAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHNjaGVtYSA9IHNjaGVtYSgpO1xuICB9XG5cbiAgLy8gSGFuZGxlIEhUTUwgc3RyaW5nIHNjaGVtYXNcbiAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBzY2hlbWEudHJpbSgpO1xuICAgIGNvbnN0IGZyYWdtZW50ID0gdGVtcGxhdGUuY29udGVudDtcblxuICAgIGlmIChwYXJlbnRFbGVtZW50ICYmIGZyYWdtZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgbGF5b3V0ID0geyBlbGVtZW50OiBmcmFnbWVudC5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudCB9O1xuICAgIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBKU1gtbGlrZSBzY2hlbWFzIChhcnJheSB3aXRoIGZ1bmN0aW9uLCBzdHJpbmcsIG9iamVjdCBwYXR0ZXJuKVxuICBpZiAoXG4gICAgQXJyYXkuaXNBcnJheShzY2hlbWEpICYmXG4gICAgc2NoZW1hLmxlbmd0aCA+PSAzICYmXG4gICAgdHlwZW9mIHNjaGVtYVswXSA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgdHlwZW9mIHNjaGVtYVsxXSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIGlzT2JqZWN0KHNjaGVtYVsyXSlcbiAgKSB7XG4gICAgcmV0dXJuIHByb2Nlc3NBcnJheVNjaGVtYShzY2hlbWEsIHBhcmVudEVsZW1lbnQsIDAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLy8gUm91dGUgdG8gYXBwcm9wcmlhdGUgcHJvY2Vzc29yXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHNjaGVtYSlcbiAgICA/IHByb2Nlc3NBcnJheVNjaGVtYShzY2hlbWEsIHBhcmVudEVsZW1lbnQsIDAsIG9wdGlvbnMpXG4gICAgOiBwcm9jZXNzT2JqZWN0U2NoZW1hKHNjaGVtYSwgcGFyZW50RWxlbWVudCwgb3B0aW9ucyk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVYUE9SVFNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gQ2xlYXIgZnVuY3Rpb25zIGZvciB0aGUgdW5pZmllZCBzeXN0ZW1cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNsYXNzQ2FjaGUoKTogdm9pZCB7XG4gIGNsYXNzQ2FjaGUuY2xlYXIoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyRnJhZ21lbnRQb29sKCk6IHZvaWQge1xuICBmcmFnbWVudFBvb2wuY2xlYXIoKTtcbn1cblxuZXhwb3J0IHtcbiAgcHJvY2Vzc0NsYXNzTmFtZXMsXG4gIGlzQ29tcG9uZW50LFxuICBmbGF0dGVuTGF5b3V0LFxuICBhcHBseUxheW91dENsYXNzZXMsXG4gIGFwcGx5TGF5b3V0SXRlbUNsYXNzZXMsXG4gIGNyZWF0ZUxheW91dFJlc3VsdCxcbn07XG4iLAogICAgIi8qKlxuICogQG1vZHVsZSBjb3JlL2xheW91dC9jb25maWdcbiAqIEBkZXNjcmlwdGlvbiBFc3NlbnRpYWwgbGF5b3V0IGNvbmZpZ3VyYXRpb24gdXRpbGl0aWVzXG4gKiBDb3JlIGZ1bmN0aW9uYWxpdHkgaXMgaW50ZWdyYXRlZCBpbnRvIHNjaGVtYS50cyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gKi9cblxuLy8gQ29uZmlndXJhdGlvbiBjb25zdGFudHNcbmNvbnN0IFBSRUZJWCA9IFwibXRybFwiOyAvLyBUT0RPOiBNYWtlIHRoaXMgY29uZmlndXJhYmxlIGZyb20gbWFpbiBtdHJsIGNvbmZpZ1xuY29uc3QgUFJFRklYX1dJVEhfREFTSCA9IGAke1BSRUZJWH0tYDtcblxuLyoqXG4gKiBTaW1wbGUgRE9NIHV0aWxpdGllc1xuICovXG5mdW5jdGlvbiBhZGRDbGFzcyhlbGVtZW50OiBhbnksIGNsYXNzTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChlbGVtZW50ICYmIGNsYXNzTmFtZSAmJiBlbGVtZW50LmNsYXNzTGlzdCkge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc0NsYXNzKGVsZW1lbnQ6IGFueSwgY2xhc3NOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudC5jbGFzc0xpc3QgJiYgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY2xlYW4gdXAgcHJldmlvdXMgbGF5b3V0IGNsYXNzZXMgZnJvbSBhbiBlbGVtZW50XG4gKiBVc2VmdWwgZm9yIGR5bmFtaWMgY2xhc3MgbWFuYWdlbWVudFxuICpcbiAqIEBwYXJhbSBlbGVtZW50IC0gRWxlbWVudCB0byBjbGVhbiBsYXlvdXQgY2xhc3NlcyBmcm9tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbnVwTGF5b3V0Q2xhc3NlcyhlbGVtZW50OiBhbnkpOiB2b2lkIHtcbiAgaWYgKCFlbGVtZW50IHx8ICFlbGVtZW50LmNsYXNzTGlzdCkgcmV0dXJuO1xuXG4gIC8vIEdldCBhbGwgY2xhc3NlcyBmcm9tIHRoZSBlbGVtZW50XG4gIGNvbnN0IGNsYXNzTGlzdCA9IEFycmF5LmZyb20oZWxlbWVudC5jbGFzc0xpc3QpIGFzIHN0cmluZ1tdO1xuXG4gIC8vIEZpbmQgYW5kIHJlbW92ZSBsYXlvdXQtcmVsYXRlZCBjbGFzc2VzXG4gIGNvbnN0IGxheW91dENsYXNzZXMgPSBjbGFzc0xpc3QuZmlsdGVyKFxuICAgIChjbHM6IHN0cmluZykgPT5cbiAgICAgIGNscy5zdGFydHNXaXRoKGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1gKSB8fFxuICAgICAgY2xzLmluY2x1ZGVzKGAtJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tYClcbiAgKTtcblxuICAvLyBSZW1vdmUgZWFjaCBsYXlvdXQgY2xhc3NcbiAgbGF5b3V0Q2xhc3Nlcy5mb3JFYWNoKChjbHM6IHN0cmluZykgPT4ge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjbHMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBsYXlvdXQgdHlwZSBmcm9tIGVsZW1lbnQgY2xhc3Nlc1xuICpcbiAqIEBwYXJhbSBlbGVtZW50IC0gRWxlbWVudCB0byBjaGVja1xuICogQHJldHVybnMgTGF5b3V0IHR5cGUgaWYgZm91bmQsIGVtcHR5IHN0cmluZyBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExheW91dFR5cGUoZWxlbWVudDogYW55KTogc3RyaW5nIHtcbiAgcmV0dXJuIGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1zdGFja2ApXG4gICAgPyBcInN0YWNrXCJcbiAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3dgKVxuICAgID8gXCJyb3dcIlxuICAgIDogaGFzQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLWdyaWRgKVxuICAgID8gXCJncmlkXCJcbiAgICA6IFwiXCI7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29uZmlndXJlZCBwcmVmaXggZm9yIHRoZSBsYXlvdXQgc3lzdGVtXG4gKiBAcmV0dXJucyBDdXJyZW50IHByZWZpeCB3aXRoIGRhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExheW91dFByZWZpeCgpOiBzdHJpbmcge1xuICByZXR1cm4gUFJFRklYX1dJVEhfREFTSDtcbn1cblxuLyoqXG4gKiBTZXRzIGxheW91dCBjbGFzc2VzIG9uIGFuIGVsZW1lbnQgZHluYW1pY2FsbHlcbiAqIFVzZWZ1bCBmb3IgcHJvZ3JhbW1hdGljIGxheW91dCB1cGRhdGVzXG4gKlxuICogQHBhcmFtIGVsZW1lbnQgLSBUYXJnZXQgZWxlbWVudFxuICogQHBhcmFtIGxheW91dFR5cGUgLSBMYXlvdXQgdHlwZSB0byBhcHBseVxuICogQHBhcmFtIGNsYXNzZXMgLSBBZGRpdGlvbmFsIGNsYXNzZXMgdG8gYXBwbHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldExheW91dENsYXNzZXMoXG4gIGVsZW1lbnQ6IGFueSxcbiAgbGF5b3V0VHlwZTogc3RyaW5nLFxuICBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdXG4pOiB2b2lkIHtcbiAgaWYgKCFlbGVtZW50IHx8ICFsYXlvdXRUeXBlKSByZXR1cm47XG5cbiAgLy8gQ2xlYW4gdXAgZXhpc3RpbmcgbGF5b3V0IGNsYXNzZXMgZmlyc3RcbiAgY2xlYW51cExheW91dENsYXNzZXMoZWxlbWVudCk7XG5cbiAgLy8gQXBwbHkgYmFzZSBsYXlvdXQgdHlwZVxuICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tJHtsYXlvdXRUeXBlfWApO1xuXG4gIC8vIEFwcGx5IGFkZGl0aW9uYWwgY2xhc3Nlc1xuICBjbGFzc2VzLmZvckVhY2goKGNscykgPT4ge1xuICAgIGlmIChjbHMuc3RhcnRzV2l0aChcImxheW91dC0tXCIpIHx8IGNscy5zdGFydHNXaXRoKFwibGF5b3V0X19cIikpIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9JHtjbHN9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGNscyk7XG4gICAgfVxuICB9KTtcbn1cbiIsCiAgICAiLyoqXG4gKiBAbW9kdWxlIGNvcmUvbGF5b3V0L2pzeFxuICogQGRlc2NyaXB0aW9uIEpTWC1saWtlIHN5bnRheCBzdXBwb3J0IGZvciBsYXlvdXQgY3JlYXRpb25cbiAqIFByb3ZpZGVzIGEgc2ltcGxlIGgoKSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgZWxlbWVudHMgd2l0aG91dCBSZWFjdCBkZXBlbmRlbmN5XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBMYXlvdXRSZXN1bHQgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlTGF5b3V0IH0gZnJvbSBcIi4vc2NoZW1hXCI7XG5cbi8qKlxuICogRnJhZ21lbnQgc3ltYm9sIGZvciBKU1ggZnJhZ21lbnRzXG4gKi9cbmV4cG9ydCBjb25zdCBGcmFnbWVudCA9IFN5bWJvbChcIkZyYWdtZW50XCIpO1xuXG4vKipcbiAqIEpTWC1saWtlIGh5cGVyc2NyaXB0IGZ1bmN0aW9uXG4gKiBDcmVhdGVzIGVsZW1lbnRzIGluIGEgUmVhY3QtbGlrZSBzeW50YXggd2l0aG91dCBSZWFjdCBkZXBlbmRlbmN5XG4gKlxuICogQHBhcmFtIHRhZyAtIEhUTUwgdGFnIG5hbWUsIGNvbXBvbmVudCBmdW5jdGlvbiwgb3IgRnJhZ21lbnRcbiAqIEBwYXJhbSBwcm9wcyAtIEVsZW1lbnQgcHJvcGVydGllcyBhbmQgYXR0cmlidXRlc1xuICogQHBhcmFtIGNoaWxkcmVuIC0gQ2hpbGQgZWxlbWVudHNcbiAqIEByZXR1cm5zIERPTSBlbGVtZW50IG9yIGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gaChcbiAgdGFnOiBzdHJpbmcgfCBGdW5jdGlvbiB8IHR5cGVvZiBGcmFnbWVudCxcbiAgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCxcbiAgLi4uY2hpbGRyZW46IGFueVtdXG4pOiBhbnkge1xuICAvLyBIYW5kbGUgRnJhZ21lbnRcbiAgaWYgKHRhZyA9PT0gRnJhZ21lbnQpIHtcbiAgICBjb25zdCBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgaWYgKGNoaWxkICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9XG4gICAgICAgICAgdHlwZW9mIGNoaWxkID09PSBcInN0cmluZ1wiID8gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGQpIDogY2hpbGQ7XG4gICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIC8vIEhhbmRsZSBzdHJpbmcgdGFncyAoSFRNTCBlbGVtZW50cylcbiAgaWYgKHR5cGVvZiB0YWcgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xuXG4gICAgLy8gQXBwbHkgcHJvcHNcbiAgICBpZiAocHJvcHMpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BzKSkge1xuICAgICAgICBpZiAoa2V5ID09PSBcImNsYXNzTmFtZVwiIHx8IGtleSA9PT0gXCJjbGFzc1wiKSB7XG4gICAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkuc3RhcnRzV2l0aChcIm9uXCIpICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gRXZlbnQgaGFuZGxlclxuICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGtleS5zbGljZSgyKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IFwic3R5bGVcIiAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAvLyBTdHlsZSBvYmplY3RcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IFwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIikge1xuICAgICAgICAgIC8vIEhUTUwgY29udGVudFxuICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gdmFsdWUuX19odG1sIHx8IFwiXCI7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIFJlZ3VsYXIgYXR0cmlidXRlXG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcGVuZCBjaGlsZHJlblxuICAgIGNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoY2hpbGQgIT0gbnVsbCkge1xuICAgICAgICBpZiAodHlwZW9mIGNoaWxkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjaGlsZCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGNoaWxkKSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIC8vIEhhbmRsZSBjb21wb25lbnQgZnVuY3Rpb25zXG4gIGlmICh0eXBlb2YgdGFnID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCBhbGxQcm9wcyA9IHByb3BzIHx8IHt9O1xuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBhbGxQcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgIH1cbiAgICByZXR1cm4gdGFnKGFsbFByb3BzKTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIHRvIGRpdlxuICByZXR1cm4gaChcImRpdlwiLCBwcm9wcywgLi4uY2hpbGRyZW4pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXlvdXQgdXNpbmcgSlNYLWxpa2Ugc3ludGF4XG4gKiBQcm92aWRlcyBhIGJyaWRnZSBiZXR3ZWVuIEpTWCBhbmQgdGhlIGxheW91dCBzeXN0ZW1cbiAqXG4gKiBAcGFyYW0ganN4RWxlbWVudCAtIEpTWCBlbGVtZW50IGNyZWF0ZWQgd2l0aCBoKClcbiAqIEBwYXJhbSBwYXJlbnRFbGVtZW50IC0gUGFyZW50IGVsZW1lbnQgdG8gYXR0YWNoIHRvXG4gKiBAcmV0dXJucyBMYXlvdXQgcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVKc3hMYXlvdXQoXG4gIGpzeEVsZW1lbnQ6IGFueSxcbiAgcGFyZW50RWxlbWVudD86IGFueVxuKTogTGF5b3V0UmVzdWx0IHtcbiAgLy8gQ29udmVydCBKU1ggZWxlbWVudCB0byBsYXlvdXQgc2NoZW1hXG4gIGNvbnN0IHNjaGVtYSA9IGpzeEVsZW1lbnQ7XG5cbiAgLy8gQ3JlYXRlIGxheW91dCB1c2luZyB0aGUgc3RhbmRhcmQgY3JlYXRlTGF5b3V0IGZ1bmN0aW9uXG4gIHJldHVybiBjcmVhdGVMYXlvdXQoc2NoZW1hLCBwYXJlbnRFbGVtZW50KTtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIHNpbXBsZSBjb21wb25lbnQgZnJvbSBhIGZ1bmN0aW9uXG4gKiBVc2VmdWwgZm9yIGNyZWF0aW5nIHJldXNhYmxlIEpTWCBjb21wb25lbnRzXG4gKlxuICogQHBhcmFtIGZuIC0gQ29tcG9uZW50IGZ1bmN0aW9uXG4gKiBAcmV0dXJucyBDb21wb25lbnQgdGhhdCBjYW4gYmUgdXNlZCBpbiBKU1hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvbmVudChmbjogKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBhbnkpOiBGdW5jdGlvbiB7XG4gIHJldHVybiBmdW5jdGlvbiAocHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBhbnkge1xuICAgIHJldHVybiBmbihwcm9wcyB8fCB7fSk7XG4gIH07XG59XG5cbi8qKlxuICogVXRpbGl0eSB0byByZW5kZXIgbXVsdGlwbGUgSlNYIGVsZW1lbnRzXG4gKiBVc2VmdWwgZm9yIGNyZWF0aW5nIGxpc3RzIG9yIGNvbGxlY3Rpb25zXG4gKlxuICogQHBhcmFtIGVsZW1lbnRzIC0gQXJyYXkgb2YgSlNYIGVsZW1lbnRzXG4gKiBAcGFyYW0gcGFyZW50RWxlbWVudCAtIFBhcmVudCBlbGVtZW50IHRvIGF0dGFjaCB0b1xuICogQHJldHVybnMgQXJyYXkgb2YgbGF5b3V0IHJlc3VsdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckVsZW1lbnRzKFxuICBlbGVtZW50czogYW55W10sXG4gIHBhcmVudEVsZW1lbnQ/OiBhbnlcbik6IExheW91dFJlc3VsdFtdIHtcbiAgcmV0dXJuIGVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gY3JlYXRlSnN4TGF5b3V0KGVsZW1lbnQsIHBhcmVudEVsZW1lbnQpKTtcbn1cblxuLyoqXG4gKiBDb21tb24gSlNYIGVsZW1lbnQgY3JlYXRvcnMgZm9yIGNvbnZlbmllbmNlXG4gKi9cbmV4cG9ydCBjb25zdCBqc3ggPSB7XG4gIGRpdjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJkaXZcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgc3BhbjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJzcGFuXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIHA6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwicFwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBidXR0b246IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwiYnV0dG9uXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGlucHV0OiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBoKFwiaW5wdXRcIiwgcHJvcHMpLFxuICBpbWc6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IGgoXCJpbWdcIiwgcHJvcHMpLFxuICBhOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcImFcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgdWw6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwidWxcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgbGk6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwibGlcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgc2VjdGlvbjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJzZWN0aW9uXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGhlYWRlcjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJoZWFkZXJcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgZm9vdGVyOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcImZvb3RlclwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBtYWluOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcIm1haW5cIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgYXJ0aWNsZTogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJhcnRpY2xlXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG59O1xuIiwKICAgICIvKipcbiAqIEBtb2R1bGUgY29yZS9sYXlvdXRcbiAqIEBkZXNjcmlwdGlvbiBVbmlmaWVkIGxheW91dCBzeXN0ZW0gZm9yIG10cmwtYWRkb25zXG4gKiBQcm92aWRlcyBhcnJheSwgb2JqZWN0LCBhbmQgSlNYLWJhc2VkIGxheW91dCBjcmVhdGlvbiB3aXRoIGludGVncmF0ZWQgb3B0aW1pemF0aW9uc1xuICovXG5cbi8vIEltcG9ydCBmb3IgdXNlIGluIGNvbnZlbmllbmNlIGZ1bmN0aW9uc1xuaW1wb3J0IHsgY3JlYXRlTGF5b3V0LCBjbGVhckNsYXNzQ2FjaGUsIGNsZWFyRnJhZ21lbnRQb29sIH0gZnJvbSBcIi4vc2NoZW1hXCI7XG5cbi8vIENvcmUgc2NoZW1hIHByb2Nlc3NvciBhbmQgdXRpbGl0aWVzXG5leHBvcnQge1xuICBjcmVhdGVMYXlvdXQsXG4gIHByb2Nlc3NDbGFzc05hbWVzLFxuICBpc0NvbXBvbmVudCxcbiAgZmxhdHRlbkxheW91dCxcbiAgYXBwbHlMYXlvdXRDbGFzc2VzLFxuICBhcHBseUxheW91dEl0ZW1DbGFzc2VzLFxuICBjcmVhdGVMYXlvdXRSZXN1bHQsXG4gIGNsZWFyQ2xhc3NDYWNoZSxcbiAgY2xlYXJGcmFnbWVudFBvb2wsXG59IGZyb20gXCIuL3NjaGVtYVwiO1xuXG4vLyBFc3NlbnRpYWwgdHlwZXNcbmV4cG9ydCB0eXBlIHtcbiAgTGF5b3V0Q29uZmlnLFxuICBMYXlvdXRJdGVtQ29uZmlnLFxuICBMYXlvdXRPcHRpb25zLFxuICBMYXlvdXRSZXN1bHQsXG4gIENvbXBvbmVudExpa2UsXG4gIEVsZW1lbnRPcHRpb25zLFxuICBFbGVtZW50RGVmaW5pdGlvbixcbiAgU2NoZW1hLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vLyBDb25maWd1cmF0aW9uIHV0aWxpdGllc1xuZXhwb3J0IHtcbiAgY2xlYW51cExheW91dENsYXNzZXMsXG4gIGdldExheW91dFR5cGUsXG4gIGdldExheW91dFByZWZpeCxcbiAgc2V0TGF5b3V0Q2xhc3Nlcyxcbn0gZnJvbSBcIi4vY29uZmlnXCI7XG5cbi8vIEpTWCBzdXBwb3J0XG5leHBvcnQge1xuICBoLFxuICBGcmFnbWVudCxcbiAgY3JlYXRlSnN4TGF5b3V0LFxuICBjb21wb25lbnQsXG4gIHJlbmRlckVsZW1lbnRzLFxuICBqc3gsXG59IGZyb20gXCIuL2pzeFwiO1xuXG4vLyBEZWZhdWx0IGV4cG9ydCBmb3IgY29udmVuaWVudCB1c2FnZVxuZXhwb3J0IHsgY3JlYXRlTGF5b3V0IGFzIGRlZmF1bHQgfSBmcm9tIFwiLi9zY2hlbWFcIjtcblxuLyoqXG4gKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBsYXlvdXQgd2l0aCBjb21tb24gcGF0dGVybnNcbiAqIFByb3ZpZGVzIGEgc2ltcGxlciBBUEkgZm9yIGNvbW1vbiB1c2UgY2FzZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxheW91dChcbiAgdHlwZTogXCJzdGFja1wiIHwgXCJyb3dcIiB8IFwiZ3JpZFwiIHwgXCJmbGV4XCIgPSBcInN0YWNrXCIsXG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuKTogYW55IHtcbiAgcmV0dXJuIGNyZWF0ZUxheW91dChbXG4gICAgXCJkaXZcIixcbiAgICB7XG4gICAgICBsYXlvdXQ6IHsgdHlwZSB9LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9LFxuICBdKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVzcG9uc2l2ZSBncmlkIGxheW91dFxuICogQXV0b21hdGljYWxseSBoYW5kbGVzIHJlc3BvbnNpdmUgYnJlYWtwb2ludHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyaWQoXG4gIGNvbHVtbnM6IG51bWJlciB8IFwiYXV0by1maXRcIiB8IFwiYXV0by1maWxsXCIgPSBcImF1dG8tZml0XCIsXG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuKTogYW55IHtcbiAgcmV0dXJuIGNyZWF0ZUxheW91dChbXG4gICAgXCJkaXZcIixcbiAgICB7XG4gICAgICBsYXlvdXQ6IHtcbiAgICAgICAgdHlwZTogXCJncmlkXCIsXG4gICAgICAgIGNvbHVtbnMsXG4gICAgICAgIGdhcDogb3B0aW9ucy5nYXAgfHwgXCIxcmVtXCIsXG4gICAgICAgIC4uLm9wdGlvbnMubGF5b3V0LFxuICAgICAgfSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSxcbiAgXSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZsZXhpYmxlIHJvdyBsYXlvdXRcbiAqIEF1dG9tYXRpY2FsbHkgaGFuZGxlcyBtb2JpbGUgc3RhY2tpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvdyhvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30pOiBhbnkge1xuICByZXR1cm4gY3JlYXRlTGF5b3V0KFtcbiAgICBcImRpdlwiLFxuICAgIHtcbiAgICAgIGxheW91dDoge1xuICAgICAgICB0eXBlOiBcInJvd1wiLFxuICAgICAgICBnYXA6IG9wdGlvbnMuZ2FwIHx8IFwiMXJlbVwiLFxuICAgICAgICBtb2JpbGVTdGFjazogb3B0aW9ucy5tb2JpbGVTdGFjayAhPT0gZmFsc2UsXG4gICAgICAgIC4uLm9wdGlvbnMubGF5b3V0LFxuICAgICAgfSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSxcbiAgXSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHZlcnRpY2FsIHN0YWNrIGxheW91dFxuICogRGVmYXVsdCBsYXlvdXQgdHlwZSB3aXRoIGNvbnNpc3RlbnQgc3BhY2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhY2sob3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9KTogYW55IHtcbiAgcmV0dXJuIGNyZWF0ZUxheW91dChbXG4gICAgXCJkaXZcIixcbiAgICB7XG4gICAgICBsYXlvdXQ6IHtcbiAgICAgICAgdHlwZTogXCJzdGFja1wiLFxuICAgICAgICBnYXA6IG9wdGlvbnMuZ2FwIHx8IFwiMXJlbVwiLFxuICAgICAgICAuLi5vcHRpb25zLmxheW91dCxcbiAgICAgIH0sXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0sXG4gIF0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXlvdXQgZnJvbSBhIHRlbXBsYXRlIGZ1bmN0aW9uXG4gKiBVc2VmdWwgZm9yIGR5bmFtaWMgbGF5b3V0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGUoXG4gIGZuOiAocHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IGFueSxcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuKTogYW55IHtcbiAgY29uc3Qgc2NoZW1hID0gZm4ocHJvcHMpO1xuICByZXR1cm4gY3JlYXRlTGF5b3V0KHNjaGVtYSk7XG59XG5cbi8qKlxuICogUGVyZm9ybWFuY2UgdXRpbGl0aWVzIGZvciBsYXlvdXQgbWFuYWdlbWVudFxuICovXG5leHBvcnQgY29uc3QgcGVyZm9ybWFuY2UgPSB7XG4gIGNsZWFyQ2FjaGU6IGNsZWFyQ2xhc3NDYWNoZSxcbiAgY2xlYXJGcmFnbWVudFBvb2wsXG5cbiAgLyoqXG4gICAqIENsZWFycyBhbGwgY2FjaGVkIHJlc291cmNlc1xuICAgKi9cbiAgY2xlYXJBbGwoKTogdm9pZCB7XG4gICAgY2xlYXJDbGFzc0NhY2hlKCk7XG4gICAgY2xlYXJGcmFnbWVudFBvb2woKTtcbiAgfSxcblxuICAvKipcbiAgICogR2V0cyBjdXJyZW50IGNhY2hlIHN0YXRzXG4gICAqL1xuICBnZXRTdGF0cygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gU3RhdHMgd291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIGFjdHVhbCBjYWNoZSBzeXN0ZW1cbiAgICAgIG1lc3NhZ2U6IFwiUGVyZm9ybWFuY2Ugc3RhdHMgYXZhaWxhYmxlIGluIGJyb3dzZXIgY29uc29sZVwiLFxuICAgIH07XG4gIH0sXG59O1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjtBQTZGQSxNQUFNLGFBQWE7QUFBQSxFQUNULE9BQTJCLENBQUM7QUFBQSxFQUM1QixVQUFVO0FBQUEsRUFFbEIsR0FBRyxHQUFxQjtBQUFBLElBQ3RCLE9BQU8sS0FBSyxLQUFLLElBQUksS0FBSyxTQUFTLHVCQUF1QjtBQUFBO0FBQUEsRUFHNUQsT0FBTyxDQUFDLFVBQWtDO0FBQUEsSUFDeEMsSUFBSSxLQUFLLEtBQUssU0FBUyxLQUFLLFdBQVcsU0FBUyxXQUFXLFdBQVcsR0FBRztBQUFBLE1BQ3ZFLEtBQUssS0FBSyxLQUFLLFFBQVE7QUFBQSxJQUN6QjtBQUFBO0FBQUEsRUFHRixLQUFLLEdBQVM7QUFBQSxJQUNaLEtBQUssS0FBSyxTQUFTO0FBQUE7QUFFdkI7QUFFQSxJQUFNLGVBQWUsSUFBSTtBQU16QixJQUFNLGFBQWEsSUFBSTtBQUd2QixJQUFNLFNBQVM7QUFDZixJQUFNLG1CQUFtQixHQUFHO0FBTTVCLFNBQVMsa0JBQWtCLENBQ3pCLE1BQ0EsVUFDQSxPQUNRO0FBQUEsRUFDUixNQUFNLE1BQU0sR0FBRyxRQUFRLFlBQVk7QUFBQSxFQUNuQyxJQUFJLENBQUMsV0FBVyxJQUFJLEdBQUcsR0FBRztBQUFBLElBQ3hCLElBQUksU0FBUyxRQUFRO0FBQUEsTUFDbkIsV0FBVyxJQUNULEtBQ0EsYUFBYSxLQUNULGlCQUFpQixVQUNqQixpQkFBaUIsWUFBWSxPQUNu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