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