easy 24.1.2 → 24.1.4

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.
package/example.js DELETED
@@ -1,3312 +0,0 @@
1
- (() => {
2
- var __defProp = Object.defineProperty;
3
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, {enumerable: true, configurable: true, writable: true, value}) : obj[key] = value;
4
- var __commonJS = (cb, mod) => () => (mod || cb((mod = {exports: {}}).exports, mod), mod.exports);
5
- var __publicField = (obj, key, value) => {
6
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
7
- return value;
8
- };
9
-
10
- // lib/offset.js
11
- var require_offset = __commonJS((exports) => {
12
- "use strict";
13
- Object.defineProperty(exports, "__esModule", {
14
- value: true
15
- });
16
- Object.defineProperty(exports, "default", {
17
- enumerable: true,
18
- get: function() {
19
- return Offset;
20
- }
21
- });
22
- var Offset = class {
23
- constructor(top, left) {
24
- this.top = top;
25
- this.left = left;
26
- }
27
- getTop() {
28
- return this.top;
29
- }
30
- getLeft() {
31
- return this.left;
32
- }
33
- static fromDOMElement(domElement) {
34
- const {offsetTop, offsetLeft} = domElement, top = offsetTop, left = offsetLeft, offset = new Offset(top, left);
35
- return offset;
36
- }
37
- };
38
- });
39
-
40
- // lib/bounds.js
41
- var require_bounds = __commonJS((exports) => {
42
- "use strict";
43
- Object.defineProperty(exports, "__esModule", {
44
- value: true
45
- });
46
- Object.defineProperty(exports, "default", {
47
- enumerable: true,
48
- get: function() {
49
- return Bounds;
50
- }
51
- });
52
- var Bounds = class {
53
- constructor(top, left, right, bottom) {
54
- this.top = top;
55
- this.left = left;
56
- this.right = right;
57
- this.bottom = bottom;
58
- }
59
- getTop() {
60
- return this.top;
61
- }
62
- getLeft() {
63
- return this.left;
64
- }
65
- getRight() {
66
- return this.right;
67
- }
68
- getBottom() {
69
- return this.bottom;
70
- }
71
- getWidth() {
72
- const width = this.right - this.left;
73
- return width;
74
- }
75
- getHeight() {
76
- const height = this.bottom - this.top;
77
- return height;
78
- }
79
- setTop(top) {
80
- this.top = top;
81
- }
82
- setLeft(left) {
83
- this.left = left;
84
- }
85
- setRight(right) {
86
- this.right = right;
87
- }
88
- setBottom(bottom) {
89
- this.bottom = bottom;
90
- }
91
- areOverlapping(bounds) {
92
- const bottom = bounds.getBottom(), right = bounds.getRight(), left = bounds.getLeft(), top = bounds.getTop(), overlapping = this.top < bottom && this.left < right && this.right > left && this.bottom > top;
93
- return overlapping;
94
- }
95
- areOverlappingByTopAndLeft(top, left) {
96
- const overlapping = this.top <= top && this.left <= left && this.right > left && this.bottom > top;
97
- return overlapping;
98
- }
99
- static fromDOMElement(domElement) {
100
- const {pageXOffset, pageYOffset} = window, boundingClientRect = domElement.getBoundingClientRect(), windowScrollTop = pageYOffset, windowScrollLeft = pageXOffset, top = boundingClientRect.top + windowScrollTop, left = boundingClientRect.left + windowScrollLeft, right = boundingClientRect.right + windowScrollLeft, bottom = boundingClientRect.bottom + windowScrollTop, bounds = new Bounds(top, left, right, bottom);
101
- return bounds;
102
- }
103
- static fromTopLeftWidthAndHeight(top, left, width, height) {
104
- const bottom = top + height, right = left + width, bounds = new Bounds(top, left, right, bottom);
105
- return bounds;
106
- }
107
- };
108
- });
109
-
110
- // lib/utilities/array.js
111
- var require_array = __commonJS((exports) => {
112
- "use strict";
113
- Object.defineProperty(exports, "__esModule", {
114
- value: true
115
- });
116
- function _export(target, all) {
117
- for (var name in all)
118
- Object.defineProperty(target, name, {
119
- enumerable: true,
120
- get: Object.getOwnPropertyDescriptor(all, name).get
121
- });
122
- }
123
- _export(exports, {
124
- get augment() {
125
- return augment;
126
- },
127
- get first() {
128
- return first;
129
- },
130
- get flatten() {
131
- return flatten;
132
- },
133
- get guarantee() {
134
- return guarantee;
135
- },
136
- get push() {
137
- return push;
138
- }
139
- });
140
- function first(array) {
141
- return array[0];
142
- }
143
- function push(array1, array2) {
144
- Array.prototype.push.apply(array1, array2);
145
- }
146
- function augment(array1, array2, test) {
147
- array1 = [
148
- ...array1
149
- ];
150
- array2.forEach((element, index) => {
151
- const passed = test(element, index);
152
- if (passed) {
153
- array1.push(element);
154
- }
155
- });
156
- return array1;
157
- }
158
- function flatten(array) {
159
- return array.reduce((array2, element) => {
160
- array2 = array2.concat(element);
161
- return array2;
162
- }, []);
163
- }
164
- function guarantee(arrayOrElement) {
165
- arrayOrElement = arrayOrElement || [];
166
- return arrayOrElement instanceof Array ? arrayOrElement : [
167
- arrayOrElement
168
- ];
169
- }
170
- });
171
-
172
- // lib/constants.js
173
- var require_constants = __commonJS((exports) => {
174
- "use strict";
175
- Object.defineProperty(exports, "__esModule", {
176
- value: true
177
- });
178
- function _export(target, all) {
179
- for (var name in all)
180
- Object.defineProperty(target, name, {
181
- enumerable: true,
182
- get: Object.getOwnPropertyDescriptor(all, name).get
183
- });
184
- }
185
- _export(exports, {
186
- get BLOCK() {
187
- return BLOCK;
188
- },
189
- get BODY() {
190
- return BODY;
191
- },
192
- get BOOLEAN() {
193
- return BOOLEAN;
194
- },
195
- get CLASS() {
196
- return CLASS;
197
- },
198
- get CLASS_NAME() {
199
- return CLASS_NAME;
200
- },
201
- get DEFAULT_PROPERTIES() {
202
- return DEFAULT_PROPERTIES;
203
- },
204
- get DISABLED() {
205
- return DISABLED;
206
- },
207
- get DISPLAY() {
208
- return DISPLAY;
209
- },
210
- get EMPTY_STRING() {
211
- return EMPTY_STRING;
212
- },
213
- get FOR() {
214
- return FOR;
215
- },
216
- get FUNCTION() {
217
- return FUNCTION;
218
- },
219
- get HEIGHT() {
220
- return HEIGHT;
221
- },
222
- get HTML_FOR() {
223
- return HTML_FOR;
224
- },
225
- get IGNORED_PROPERTIES() {
226
- return IGNORED_PROPERTIES;
227
- },
228
- get NONE() {
229
- return NONE;
230
- },
231
- get OBJECT() {
232
- return OBJECT;
233
- },
234
- get SPACE() {
235
- return SPACE;
236
- },
237
- get STRING() {
238
- return STRING;
239
- },
240
- get SVG_NAMESPACE_URI() {
241
- return SVG_NAMESPACE_URI;
242
- },
243
- get UNDEFINED() {
244
- return UNDEFINED;
245
- },
246
- get WIDTH() {
247
- return WIDTH;
248
- },
249
- get WILDCARD() {
250
- return WILDCARD;
251
- }
252
- });
253
- var FOR = "for";
254
- var BODY = "body";
255
- var NONE = "none";
256
- var SPACE = " ";
257
- var CLASS = "class";
258
- var WIDTH = "width";
259
- var BLOCK = "block";
260
- var HEIGHT = "height";
261
- var OBJECT = "object";
262
- var STRING = "string";
263
- var DISPLAY = "display";
264
- var BOOLEAN = "boolean";
265
- var DISABLED = "disabled";
266
- var FUNCTION = "function";
267
- var WILDCARD = "*";
268
- var HTML_FOR = "htmlFor";
269
- var UNDEFINED = "undefined";
270
- var CLASS_NAME = "className";
271
- var EMPTY_STRING = "";
272
- var SVG_NAMESPACE_URI = "http://www.w3.org/2000/svg";
273
- var DEFAULT_PROPERTIES = "defaultProperties";
274
- var IGNORED_PROPERTIES = "ignoredProperties";
275
- });
276
-
277
- // lib/utilities/object.js
278
- var require_object = __commonJS((exports) => {
279
- "use strict";
280
- Object.defineProperty(exports, "__esModule", {
281
- value: true
282
- });
283
- function _export(target, all) {
284
- for (var name in all)
285
- Object.defineProperty(target, name, {
286
- enumerable: true,
287
- get: Object.getOwnPropertyDescriptor(all, name).get
288
- });
289
- }
290
- _export(exports, {
291
- get combine() {
292
- return combine;
293
- },
294
- get prune() {
295
- return prune;
296
- }
297
- });
298
- var _constants = require_constants();
299
- function combine(target, source = {}) {
300
- target = {
301
- ...target
302
- };
303
- const names = Object.keys(source);
304
- names.forEach((name) => {
305
- const targetValue = target[name], sourceValue = source[name], targetHasOwnProperty = target.hasOwnProperty(name);
306
- target[name] = targetHasOwnProperty ? combineValues(targetValue, sourceValue) : sourceValue;
307
- });
308
- return target;
309
- }
310
- function prune(target, names = []) {
311
- target = {
312
- ...target
313
- };
314
- names.forEach((name) => {
315
- const targetHasOwnProperty = target.hasOwnProperty(name);
316
- if (targetHasOwnProperty) {
317
- delete target[name];
318
- }
319
- });
320
- return target;
321
- }
322
- function combineValues(targetValue, sourceValue) {
323
- const targetValueBoolean = isValueBoolean(targetValue), sourceValueBoolean = isValueBoolean(sourceValue), combinedValue = targetValueBoolean && sourceValueBoolean ? targetValue : `${targetValue} ${sourceValue}`;
324
- return combinedValue;
325
- }
326
- function isValueBoolean(value) {
327
- const valueBoolean = typeof value === _constants.BOOLEAN;
328
- return valueBoolean;
329
- }
330
- });
331
-
332
- // lib/utilities/string.js
333
- var require_string = __commonJS((exports) => {
334
- "use strict";
335
- Object.defineProperty(exports, "__esModule", {
336
- value: true
337
- });
338
- Object.defineProperty(exports, "camelCaseToSnakeCase", {
339
- enumerable: true,
340
- get: function() {
341
- return camelCaseToSnakeCase;
342
- }
343
- });
344
- function camelCaseToSnakeCase(string) {
345
- return string.replace(/([A-Z]+)/g, (match, characters) => {
346
- const upperCaseCharacters = characters.toLowerCase(), snakeCaseCharacters = `-${upperCaseCharacters}`;
347
- return snakeCaseCharacters;
348
- });
349
- }
350
- });
351
-
352
- // lib/utilities/name.js
353
- var require_name = __commonJS((exports) => {
354
- "use strict";
355
- Object.defineProperty(exports, "__esModule", {
356
- value: true
357
- });
358
- function _export(target, all) {
359
- for (var name in all)
360
- Object.defineProperty(target, name, {
361
- enumerable: true,
362
- get: Object.getOwnPropertyDescriptor(all, name).get
363
- });
364
- }
365
- _export(exports, {
366
- get isHTMLAttributeName() {
367
- return isHTMLAttributeName;
368
- },
369
- get isSVGAttributeName() {
370
- return isSVGAttributeName;
371
- },
372
- get isSVGTagName() {
373
- return isSVGTagName;
374
- }
375
- });
376
- function isSVGTagName(tagName) {
377
- return svgTagNames.includes(tagName);
378
- }
379
- function isSVGAttributeName(attributeName) {
380
- return svgAttributeNames.includes(attributeName);
381
- }
382
- function isHTMLAttributeName(attributeName) {
383
- return htmlAttributeNames.includes(attributeName);
384
- }
385
- var svgTagNames = [
386
- "altGlyph",
387
- "animate",
388
- "animateColor",
389
- "animateMotion",
390
- "animateTransform",
391
- "animation",
392
- "audio",
393
- "circle",
394
- "clipPath",
395
- "color-profile",
396
- "cursor",
397
- "defs",
398
- "desc",
399
- "discard",
400
- "ellipse",
401
- "feBlend",
402
- "feColorMatrix",
403
- "feComponentTransfer",
404
- "feComposite",
405
- "feConvolveMatrix",
406
- "feDiffuseLighting",
407
- "feDisplacementMap",
408
- "feDistantLight",
409
- "feDropShadow",
410
- "feFlood",
411
- "feFuncA",
412
- "feFuncB",
413
- "feFuncG",
414
- "feFuncR",
415
- "feGaussianBlur",
416
- "feImage",
417
- "feMerge",
418
- "feMergeNode",
419
- "feMorphology",
420
- "feOffset",
421
- "fePointLight",
422
- "feSpecularLighting",
423
- "feSpotLight",
424
- "feTile",
425
- "feTurbulence",
426
- "filter",
427
- "font",
428
- "font-face",
429
- "font-face-format",
430
- "font-face-name",
431
- "font-face-uri",
432
- "foreignObject",
433
- "g",
434
- "glyph",
435
- "glyphRef",
436
- "handler",
437
- "hatch",
438
- "hatchpath",
439
- "hkern",
440
- "image",
441
- "line",
442
- "linearGradient",
443
- "listener",
444
- "marker",
445
- "mask",
446
- "mesh",
447
- "meshgradient",
448
- "meshpatch",
449
- "meshrow",
450
- "metadata",
451
- "missing-glyph",
452
- "mpath",
453
- "path",
454
- "pattern",
455
- "polygon",
456
- "polyline",
457
- "prefetch",
458
- "radialGradient",
459
- "rect",
460
- "script",
461
- "set",
462
- "solidcolor",
463
- "stop",
464
- "style",
465
- "svg",
466
- "switch",
467
- "symbol",
468
- "tbreak",
469
- "text",
470
- "textArea",
471
- "textPath",
472
- "title",
473
- "tref",
474
- "tspan",
475
- "unknown",
476
- "use",
477
- "video",
478
- "view",
479
- "vkern"
480
- ];
481
- var svgAttributeNames = [
482
- "accent-height",
483
- "accumulate",
484
- "additive",
485
- "alignment-baseline",
486
- "alphabetic",
487
- "amplitude",
488
- "arabic-form",
489
- "ascent",
490
- "attributeName",
491
- "attributeType",
492
- "azimuth",
493
- "bandwidth",
494
- "baseFrequency",
495
- "baseProfile",
496
- "baseline-shift",
497
- "bbox",
498
- "begin",
499
- "bias",
500
- "by",
501
- "calcMode",
502
- "cap-height",
503
- "clip",
504
- "className",
505
- "clip-path",
506
- "clip-rule",
507
- "clipPathUnits",
508
- "color",
509
- "color-interpolation",
510
- "color-interpolation-filters",
511
- "color-profile",
512
- "color-rendering",
513
- "contentScriptType",
514
- "contentStyleType",
515
- "crossorigin",
516
- "cursor",
517
- "cx",
518
- "cy",
519
- "d",
520
- "defaultAction",
521
- "descent",
522
- "diffuseConstant",
523
- "direction",
524
- "display",
525
- "divisor",
526
- "dominant-baseline",
527
- "download",
528
- "dur",
529
- "dx",
530
- "dy",
531
- "edgeMode",
532
- "editable",
533
- "elevation",
534
- "enable-background",
535
- "end",
536
- "event",
537
- "exponent",
538
- "externalResourcesRequired",
539
- "fill",
540
- "fill-opacity",
541
- "fill-rule",
542
- "filter",
543
- "filterRes",
544
- "filterUnits",
545
- "flood-color",
546
- "flood-opacity",
547
- "focusHighlight",
548
- "focusable",
549
- "font-family",
550
- "font-size",
551
- "font-size-adjust",
552
- "font-stretch",
553
- "font-style",
554
- "font-variant",
555
- "font-weight",
556
- "format",
557
- "fr",
558
- "from",
559
- "fx",
560
- "fy",
561
- "g1",
562
- "g2",
563
- "glyph-name",
564
- "glyph-orientation-horizontal",
565
- "glyph-orientation-vertical",
566
- "glyphRef",
567
- "gradientTransform",
568
- "gradientUnits",
569
- "handler",
570
- "hanging",
571
- "hatchContentUnits",
572
- "hatchUnits",
573
- "height",
574
- "horiz-adv-x",
575
- "horiz-origin-x",
576
- "horiz-origin-y",
577
- "href",
578
- "hreflang",
579
- "id",
580
- "ideographic",
581
- "image-rendering",
582
- "in",
583
- "in2",
584
- "initialVisibility",
585
- "intercept",
586
- "k",
587
- "k1",
588
- "k2",
589
- "k3",
590
- "k4",
591
- "kernelMatrix",
592
- "kernelUnitLength",
593
- "kerning",
594
- "keyPoints",
595
- "keySplines",
596
- "keyTimes",
597
- "lengthAdjust",
598
- "letter-spacing",
599
- "lighting-color",
600
- "limitingConeAngle",
601
- "local",
602
- "marker-end",
603
- "marker-mid",
604
- "marker-start",
605
- "markerHeight",
606
- "markerUnits",
607
- "markerWidth",
608
- "mask",
609
- "maskContentUnits",
610
- "maskUnits",
611
- "mathematical",
612
- "max",
613
- "media",
614
- "mediaCharacterEncoding",
615
- "mediaContentEncodings",
616
- "mediaSize",
617
- "mediaTime",
618
- "method",
619
- "min",
620
- "mode",
621
- "name",
622
- "nav-down",
623
- "nav-down-left",
624
- "nav-down-right",
625
- "nav-left",
626
- "nav-next",
627
- "nav-prev",
628
- "nav-right",
629
- "nav-up",
630
- "nav-up-left",
631
- "nav-up-right",
632
- "numOctaves",
633
- "observer",
634
- "offset",
635
- "opacity",
636
- "operator",
637
- "order",
638
- "orient",
639
- "orientation",
640
- "origin",
641
- "overflow",
642
- "overlay",
643
- "overline-position",
644
- "overline-thickness",
645
- "panose-1",
646
- "path",
647
- "pathLength",
648
- "patternContentUnits",
649
- "patternTransform",
650
- "patternUnits",
651
- "phase",
652
- "pitch",
653
- "playbackOrder",
654
- "playbackorder",
655
- "pointer-events",
656
- "points",
657
- "pointsAtX",
658
- "pointsAtY",
659
- "pointsAtZ",
660
- "preserveAlpha",
661
- "preserveAspectRatio",
662
- "primitiveUnits",
663
- "propagate",
664
- "r",
665
- "radius",
666
- "refX",
667
- "refY",
668
- "rendering-intent",
669
- "repeatCount",
670
- "repeatDur",
671
- "requiredExtensions",
672
- "requiredFeatures",
673
- "requiredFonts",
674
- "requiredFormats",
675
- "restart",
676
- "result",
677
- "rotate",
678
- "rx",
679
- "ry",
680
- "scale",
681
- "seed",
682
- "shape-rendering",
683
- "side",
684
- "slope",
685
- "snapshotTime",
686
- "spacing",
687
- "specularConstant",
688
- "specularExponent",
689
- "spreadMethod",
690
- "src",
691
- "startOffset",
692
- "stdDeviation",
693
- "stemh",
694
- "stemv",
695
- "stitchTiles",
696
- "stop-color",
697
- "stop-opacity",
698
- "strikethrough-position",
699
- "strikethrough-thickness",
700
- "string",
701
- "stroke",
702
- "stroke-dasharray",
703
- "stroke-dashoffset",
704
- "stroke-linecap",
705
- "stroke-linejoin",
706
- "stroke-miterlimit",
707
- "stroke-opacity",
708
- "stroke-width",
709
- "style",
710
- "surfaceScale",
711
- "syncBehavior",
712
- "syncBehaviorDefault",
713
- "syncMaster",
714
- "syncTolerance",
715
- "syncToleranceDefault",
716
- "systemLanguage",
717
- "tableValues",
718
- "target",
719
- "targetX",
720
- "targetY",
721
- "text-anchor",
722
- "text-decoration",
723
- "text-rendering",
724
- "textLength",
725
- "timelineBegin",
726
- "timelinebegin",
727
- "title",
728
- "to",
729
- "transform",
730
- "transformBehavior",
731
- "type",
732
- "u1",
733
- "u2",
734
- "underline-position",
735
- "underline-thickness",
736
- "unicode",
737
- "unicode-bidi",
738
- "unicode-range",
739
- "units-per-em",
740
- "v-alphabetic",
741
- "v-hanging",
742
- "v-ideographic",
743
- "v-mathematical",
744
- "values",
745
- "version",
746
- "vert-adv-y",
747
- "vert-origin-x",
748
- "vert-origin-y",
749
- "viewBox",
750
- "viewTarget",
751
- "visibility",
752
- "width",
753
- "widths",
754
- "word-spacing",
755
- "writing-mode",
756
- "x",
757
- "x-height",
758
- "x1",
759
- "x2",
760
- "xChannelSelector",
761
- "y",
762
- "y1",
763
- "y2",
764
- "yChannelSelector",
765
- "z",
766
- "zoomAndPan"
767
- ];
768
- var htmlAttributeNames = [
769
- "accept",
770
- "acceptCharset",
771
- "accessKey",
772
- "action",
773
- "allow",
774
- "allowFullScreen",
775
- "allowTransparency",
776
- "alt",
777
- "async",
778
- "autoComplete",
779
- "autoFocus",
780
- "autoPlay",
781
- "capture",
782
- "cellPadding",
783
- "cellSpacing",
784
- "challenge",
785
- "charSet",
786
- "checked",
787
- "cite",
788
- "classID",
789
- "className",
790
- "colSpan",
791
- "cols",
792
- "content",
793
- "contentEditable",
794
- "contextMenu",
795
- "controls",
796
- "coords",
797
- "crossOrigin",
798
- "data",
799
- "dateTime",
800
- "default",
801
- "defer",
802
- "dir",
803
- "disabled",
804
- "download",
805
- "draggable",
806
- "encType",
807
- "form",
808
- "formAction",
809
- "formEncType",
810
- "formMethod",
811
- "formNoValidate",
812
- "formTarget",
813
- "frameBorder",
814
- "headers",
815
- "height",
816
- "hidden",
817
- "high",
818
- "href",
819
- "hrefLang",
820
- "htmlFor",
821
- "httpEquiv",
822
- "icon",
823
- "id",
824
- "inputMode",
825
- "integrity",
826
- "is",
827
- "keyParams",
828
- "keyType",
829
- "kind",
830
- "label",
831
- "lang",
832
- "list",
833
- "loop",
834
- "low",
835
- "manifest",
836
- "marginHeight",
837
- "marginWidth",
838
- "max",
839
- "maxLength",
840
- "media",
841
- "mediaGroup",
842
- "method",
843
- "min",
844
- "minLength",
845
- "multiple",
846
- "muted",
847
- "name",
848
- "noValidate",
849
- "nonce",
850
- "open",
851
- "optimum",
852
- "pattern",
853
- "placeholder",
854
- "poster",
855
- "preload",
856
- "profile",
857
- "radioGroup",
858
- "readOnly",
859
- "rel",
860
- "required",
861
- "reversed",
862
- "role",
863
- "rowSpan",
864
- "rows",
865
- "sandbox",
866
- "scope",
867
- "scoped",
868
- "scrolling",
869
- "seamless",
870
- "selected",
871
- "shape",
872
- "size",
873
- "sizes",
874
- "span",
875
- "spellCheck",
876
- "src",
877
- "srcDoc",
878
- "srcLang",
879
- "srcSet",
880
- "start",
881
- "step",
882
- "style",
883
- "summary",
884
- "tabIndex",
885
- "target",
886
- "title",
887
- "type",
888
- "useMap",
889
- "value",
890
- "width",
891
- "wmode",
892
- "wrap"
893
- ];
894
- });
895
-
896
- // lib/utilities/element.js
897
- var require_element = __commonJS((exports) => {
898
- "use strict";
899
- Object.defineProperty(exports, "__esModule", {
900
- value: true
901
- });
902
- function _export(target, all) {
903
- for (var name in all)
904
- Object.defineProperty(target, name, {
905
- enumerable: true,
906
- get: Object.getOwnPropertyDescriptor(all, name).get
907
- });
908
- }
909
- _export(exports, {
910
- get constructElement() {
911
- return constructElement;
912
- },
913
- get default() {
914
- return _default;
915
- },
916
- get destroyElement() {
917
- return destroyElement;
918
- },
919
- get mountElement() {
920
- return mountElement;
921
- },
922
- get unmountElement() {
923
- return unmountElement;
924
- }
925
- });
926
- function constructElement(element, domElement) {
927
- element.domElement = domElement;
928
- domElement.__element__ = element;
929
- }
930
- function destroyElement(element) {
931
- const descendantElements = element.getDescendantElements(), elements = [
932
- element,
933
- ...descendantElements
934
- ];
935
- elements.forEach((element2) => {
936
- const domElement = element2.getDOMElement();
937
- delete element2.domElement;
938
- delete domElement.__element__;
939
- });
940
- }
941
- function mountElement(element) {
942
- const descendantElements = element.getDescendantElements(), elements = [
943
- element,
944
- ...descendantElements
945
- ];
946
- elements.reverse();
947
- elements.forEach((element2) => {
948
- element2.didMount && element2.didMount();
949
- });
950
- }
951
- function unmountElement(element) {
952
- const descendantElements = element.getDescendantElements(), elements = [
953
- element,
954
- ...descendantElements
955
- ];
956
- elements.forEach((element2) => {
957
- element2.willUnmount && element2.willUnmount();
958
- });
959
- }
960
- var _default = {
961
- constructElement,
962
- destroyElement,
963
- mountElement,
964
- unmountElement
965
- };
966
- });
967
-
968
- // lib/utilities/dom.js
969
- var require_dom = __commonJS((exports) => {
970
- "use strict";
971
- Object.defineProperty(exports, "__esModule", {
972
- value: true
973
- });
974
- function _export(target, all) {
975
- for (var name in all)
976
- Object.defineProperty(target, name, {
977
- enumerable: true,
978
- get: Object.getOwnPropertyDescriptor(all, name).get
979
- });
980
- }
981
- _export(exports, {
982
- get ascendantDOMNodesFromDOMNode() {
983
- return ascendantDOMNodesFromDOMNode;
984
- },
985
- get descendantDOMNodesFromDOMNode() {
986
- return descendantDOMNodesFromDOMNode;
987
- },
988
- get domNodeMatchesSelector() {
989
- return domNodeMatchesSelector;
990
- },
991
- get elementsFromDOMElements() {
992
- return elementsFromDOMElements;
993
- },
994
- get filterDOMNodes() {
995
- return filterDOMNodes;
996
- },
997
- get filterDOMNodesBySelector() {
998
- return filterDOMNodesBySelector;
999
- }
1000
- });
1001
- var _array = require_array();
1002
- var _constants = require_constants();
1003
- function elementsFromDOMElements(domElements) {
1004
- const domElementsWithElements = filterDOMNodes(domElements, (domElement) => {
1005
- if (domElement.__element__) {
1006
- return true;
1007
- }
1008
- }), elements = domElementsWithElements.map((domElement) => {
1009
- const element = domElement.__element__;
1010
- return element;
1011
- });
1012
- return elements;
1013
- }
1014
- function ascendantDOMNodesFromDOMNode(domNode, height, ascendantDOMNodes = []) {
1015
- if (height > 0) {
1016
- const parentDOMNode = domNode.parentElement;
1017
- if (parentDOMNode !== null) {
1018
- ascendantDOMNodes.push(parentDOMNode);
1019
- height--;
1020
- ascendantDOMNodesFromDOMNode(parentDOMNode, height, ascendantDOMNodes);
1021
- }
1022
- }
1023
- return ascendantDOMNodes;
1024
- }
1025
- function descendantDOMNodesFromDOMNode(domNode, depth, descendantDOMNodes = []) {
1026
- if (depth > 0) {
1027
- const childDOMNodes = domNode.childNodes;
1028
- (0, _array.push)(descendantDOMNodes, childDOMNodes);
1029
- depth--;
1030
- childDOMNodes.forEach((childDOMNode) => {
1031
- descendantDOMNodesFromDOMNode(childDOMNode, depth, descendantDOMNodes);
1032
- });
1033
- }
1034
- return descendantDOMNodes;
1035
- }
1036
- function filterDOMNodesBySelector(domNodes, selector) {
1037
- const filteredDOMNodes = filterDOMNodes(domNodes, (domNode) => {
1038
- if (domNodeMatchesSelector(domNode, selector)) {
1039
- return true;
1040
- }
1041
- });
1042
- return filteredDOMNodes;
1043
- }
1044
- function domNodeMatchesSelector(domNode, selector) {
1045
- const domNodeType = domNode.nodeType;
1046
- switch (domNodeType) {
1047
- case Node.ELEMENT_NODE: {
1048
- const domElement = domNode;
1049
- return domElement.matches(selector);
1050
- }
1051
- case Node.TEXT_NODE: {
1052
- if (selector === _constants.WILDCARD) {
1053
- return true;
1054
- }
1055
- }
1056
- }
1057
- return false;
1058
- }
1059
- function filterDOMNodes(domNodes, test) {
1060
- const filteredDOMNodes = [], domNodesLength = domNodes.length;
1061
- for (let index = 0; index < domNodesLength; index++) {
1062
- const domNode = domNodes[index], result = test(domNode);
1063
- if (result) {
1064
- filteredDOMNodes.push(domNode);
1065
- }
1066
- }
1067
- return filteredDOMNodes;
1068
- }
1069
- });
1070
-
1071
- // lib/mixins/element.js
1072
- var require_element2 = __commonJS((exports) => {
1073
- "use strict";
1074
- Object.defineProperty(exports, "__esModule", {
1075
- value: true
1076
- });
1077
- function _export(target, all) {
1078
- for (var name in all)
1079
- Object.defineProperty(target, name, {
1080
- enumerable: true,
1081
- get: Object.getOwnPropertyDescriptor(all, name).get
1082
- });
1083
- }
1084
- _export(exports, {
1085
- get default() {
1086
- return _default;
1087
- },
1088
- get getAscendantElements() {
1089
- return getAscendantElements;
1090
- },
1091
- get getChildElements() {
1092
- return getChildElements;
1093
- },
1094
- get getDescendantElements() {
1095
- return getDescendantElements;
1096
- },
1097
- get getNextSiblingElement() {
1098
- return getNextSiblingElement;
1099
- },
1100
- get getParentElement() {
1101
- return getParentElement;
1102
- },
1103
- get getPreviousSiblingElement() {
1104
- return getPreviousSiblingElement;
1105
- }
1106
- });
1107
- var _array = require_array();
1108
- var _constants = require_constants();
1109
- var _dom = require_dom();
1110
- function getParentElement(selector = _constants.WILDCARD) {
1111
- let parentElement = null;
1112
- const parentDOMElement = this.domElement.parentElement;
1113
- if (parentDOMElement !== null) {
1114
- if (parentDOMElement.matches(selector)) {
1115
- const parentDOMElements = [
1116
- parentDOMElement
1117
- ], parentElements = (0, _dom.elementsFromDOMElements)(parentDOMElements), firstParentElement = (0, _array.first)(parentElements);
1118
- parentElement = firstParentElement || null;
1119
- }
1120
- }
1121
- return parentElement;
1122
- }
1123
- function getChildElements(selector = _constants.WILDCARD) {
1124
- const childDOMNodes = this.domElement.childNodes, childDOMElements = (0, _dom.filterDOMNodesBySelector)(childDOMNodes, selector), childElements = (0, _dom.elementsFromDOMElements)(childDOMElements);
1125
- return childElements;
1126
- }
1127
- function getAscendantElements(selector = _constants.WILDCARD, maximumHeight = Infinity) {
1128
- const height = maximumHeight, domNode = this.domElement, ascendantDOMNodes = (0, _dom.ascendantDOMNodesFromDOMNode)(domNode, height), ascendantDOMElements = (0, _dom.filterDOMNodesBySelector)(ascendantDOMNodes, selector), ascendantElements = (0, _dom.elementsFromDOMElements)(ascendantDOMElements);
1129
- return ascendantElements;
1130
- }
1131
- function getDescendantElements(selector = _constants.WILDCARD, maximumDepth = Infinity) {
1132
- const depth = maximumDepth, domNode = this.domElement, descendantDOMNodes = (0, _dom.descendantDOMNodesFromDOMNode)(domNode, depth), descendantDOMElements = (0, _dom.filterDOMNodesBySelector)(descendantDOMNodes, selector), descendantElements = (0, _dom.elementsFromDOMElements)(descendantDOMElements);
1133
- return descendantElements;
1134
- }
1135
- function getNextSiblingElement(selector = _constants.WILDCARD) {
1136
- let nextSiblingElement = null;
1137
- const nextSiblingDOMNode = this.domElement.nextSibling;
1138
- if (nextSiblingDOMNode !== null && (0, _dom.domNodeMatchesSelector)(nextSiblingDOMNode, selector)) {
1139
- nextSiblingElement = nextSiblingDOMNode.__element__ || null;
1140
- }
1141
- return nextSiblingElement;
1142
- }
1143
- function getPreviousSiblingElement(selector = _constants.WILDCARD) {
1144
- let previousSiblingElement = null;
1145
- const previousSiblingDOMNode = this.domElement.previousSibling;
1146
- if (previousSiblingDOMNode !== null && (0, _dom.domNodeMatchesSelector)(previousSiblingDOMNode, selector)) {
1147
- previousSiblingElement = previousSiblingDOMNode.__element__ || null;
1148
- }
1149
- return previousSiblingElement;
1150
- }
1151
- var elementMixins = {
1152
- getParentElement,
1153
- getChildElements,
1154
- getAscendantElements,
1155
- getDescendantElements,
1156
- getNextSiblingElement,
1157
- getPreviousSiblingElement
1158
- };
1159
- var _default = elementMixins;
1160
- });
1161
-
1162
- // lib/textElement.js
1163
- var require_textElement = __commonJS((exports) => {
1164
- "use strict";
1165
- Object.defineProperty(exports, "__esModule", {
1166
- value: true
1167
- });
1168
- Object.defineProperty(exports, "default", {
1169
- enumerable: true,
1170
- get: function() {
1171
- return TextElement;
1172
- }
1173
- });
1174
- var _offset = /* @__PURE__ */ _interop_require_default(require_offset());
1175
- var _bounds = /* @__PURE__ */ _interop_require_default(require_bounds());
1176
- var _element = require_element();
1177
- var _element1 = require_element2();
1178
- function _interop_require_default(obj) {
1179
- return obj && obj.__esModule ? obj : {
1180
- default: obj
1181
- };
1182
- }
1183
- var TextElement = class {
1184
- constructor(text) {
1185
- const element = this, domElement = document.createTextNode(text);
1186
- (0, _element.constructElement)(element, domElement);
1187
- }
1188
- getDOMElement() {
1189
- return this.domElement;
1190
- }
1191
- getOffset() {
1192
- const offset = _offset.default.fromDOMElement(this.domElement);
1193
- return offset;
1194
- }
1195
- getBounds() {
1196
- const bounds = _bounds.default.fromDOMElement(this.domElement);
1197
- return bounds;
1198
- }
1199
- getWidth() {
1200
- return this.domElement.offsetWidth;
1201
- }
1202
- getHeight() {
1203
- return this.domElement.offsetHeight;
1204
- }
1205
- getText() {
1206
- const nodeValue = this.domElement.nodeValue, text = nodeValue;
1207
- return text;
1208
- }
1209
- setText(text) {
1210
- const nodeValue = text;
1211
- this.domElement.nodeValue = nodeValue;
1212
- }
1213
- prependTo(parentElement) {
1214
- parentElement.prepend(this);
1215
- }
1216
- appendTo(parentElement) {
1217
- parentElement.append(this);
1218
- }
1219
- addTo(parentElement) {
1220
- parentElement.add(this);
1221
- }
1222
- removeFrom(parentElement) {
1223
- parentElement.remove(this);
1224
- }
1225
- insertBefore(siblingElement) {
1226
- const parentDOMNode = siblingElement.domElement.parentNode, siblingDOMElement = siblingElement.domElement;
1227
- parentDOMNode.insertBefore(this.domElement, siblingDOMElement);
1228
- }
1229
- insertAfter(siblingElement) {
1230
- const parentDOMNode = siblingElement.domElement.parentNode, siblingDOMElement = siblingElement.domElement;
1231
- parentDOMNode.insertBefore(this.domElement, siblingDOMElement.nextSibling);
1232
- }
1233
- remove() {
1234
- this.domElement.remove();
1235
- }
1236
- destroy() {
1237
- const element = this;
1238
- (0, _element.destroyElement)(element);
1239
- }
1240
- };
1241
- Object.assign(TextElement.prototype, {
1242
- getParentElement: _element1.getParentElement,
1243
- getAscendantElements: _element1.getAscendantElements,
1244
- getNextSiblingElement: _element1.getNextSiblingElement,
1245
- getPreviousSiblingElement: _element1.getPreviousSiblingElement
1246
- });
1247
- });
1248
-
1249
- // lib/utilities/elements.js
1250
- var require_elements = __commonJS((exports) => {
1251
- "use strict";
1252
- Object.defineProperty(exports, "__esModule", {
1253
- value: true
1254
- });
1255
- function _export(target, all) {
1256
- for (var name in all)
1257
- Object.defineProperty(target, name, {
1258
- enumerable: true,
1259
- get: Object.getOwnPropertyDescriptor(all, name).get
1260
- });
1261
- }
1262
- _export(exports, {
1263
- get removeFalseyElements() {
1264
- return removeFalseyElements;
1265
- },
1266
- get replaceStringsWithTextElements() {
1267
- return replaceStringsWithTextElements;
1268
- }
1269
- });
1270
- var _textElement = /* @__PURE__ */ _interop_require_default(require_textElement());
1271
- var _constants = require_constants();
1272
- function _interop_require_default(obj) {
1273
- return obj && obj.__esModule ? obj : {
1274
- default: obj
1275
- };
1276
- }
1277
- function removeFalseyElements(elements) {
1278
- elements = elements.reduce((elements2, element) => {
1279
- if (element) {
1280
- elements2.push(element);
1281
- }
1282
- return elements2;
1283
- }, []);
1284
- return elements;
1285
- }
1286
- function replaceStringsWithTextElements(elements) {
1287
- elements = elements.map((element) => {
1288
- if (typeof element === _constants.STRING) {
1289
- const text = element, textElement = new _textElement.default(text);
1290
- element = textElement;
1291
- }
1292
- return element;
1293
- });
1294
- return elements;
1295
- }
1296
- });
1297
-
1298
- // lib/eventTypes.js
1299
- var require_eventTypes = __commonJS((exports) => {
1300
- "use strict";
1301
- Object.defineProperty(exports, "__esModule", {
1302
- value: true
1303
- });
1304
- function _export(target, all) {
1305
- for (var name in all)
1306
- Object.defineProperty(target, name, {
1307
- enumerable: true,
1308
- get: Object.getOwnPropertyDescriptor(all, name).get
1309
- });
1310
- }
1311
- _export(exports, {
1312
- get AUXCLICK_EVENT_TYPE() {
1313
- return AUXCLICK_EVENT_TYPE;
1314
- },
1315
- get BLUR_EVENT_TYPE() {
1316
- return BLUR_EVENT_TYPE;
1317
- },
1318
- get CHANGE_EVENT_TYPE() {
1319
- return CHANGE_EVENT_TYPE;
1320
- },
1321
- get CLICK_EVENT_TYPE() {
1322
- return CLICK_EVENT_TYPE;
1323
- },
1324
- get CONTEXTMENU_EVENT_TYPE() {
1325
- return CONTEXTMENU_EVENT_TYPE;
1326
- },
1327
- get COPY_EVENT_TYPE() {
1328
- return COPY_EVENT_TYPE;
1329
- },
1330
- get CUT_EVENT_TYPE() {
1331
- return CUT_EVENT_TYPE;
1332
- },
1333
- get DBLCLICK_EVENT_TYPE() {
1334
- return DBLCLICK_EVENT_TYPE;
1335
- },
1336
- get ERROR_EVENT_TYPE() {
1337
- return ERROR_EVENT_TYPE;
1338
- },
1339
- get FOCUS_EVENT_TYPE() {
1340
- return FOCUS_EVENT_TYPE;
1341
- },
1342
- get FULLSCREENCHANGE_EVENT_TYPE() {
1343
- return FULLSCREENCHANGE_EVENT_TYPE;
1344
- },
1345
- get INPUT_EVENT_TYPE() {
1346
- return INPUT_EVENT_TYPE;
1347
- },
1348
- get KEYDOWN_EVENT_TYPE() {
1349
- return KEYDOWN_EVENT_TYPE;
1350
- },
1351
- get KEYUP_EVENT_TYPE() {
1352
- return KEYUP_EVENT_TYPE;
1353
- },
1354
- get MOUSEDOWN_EVENT_TYPE() {
1355
- return MOUSEDOWN_EVENT_TYPE;
1356
- },
1357
- get MOUSEMOVE_EVENT_TYPE() {
1358
- return MOUSEMOVE_EVENT_TYPE;
1359
- },
1360
- get MOUSEOUT_EVENT_TYPE() {
1361
- return MOUSEOUT_EVENT_TYPE;
1362
- },
1363
- get MOUSEOVER_EVENT_TYPE() {
1364
- return MOUSEOVER_EVENT_TYPE;
1365
- },
1366
- get MOUSEUP_EVENT_TYPE() {
1367
- return MOUSEUP_EVENT_TYPE;
1368
- },
1369
- get PASTE_EVENT_TYPE() {
1370
- return PASTE_EVENT_TYPE;
1371
- },
1372
- get RESIZE_EVENT_TYPE() {
1373
- return RESIZE_EVENT_TYPE;
1374
- },
1375
- get SCROLL_EVENT_TYPE() {
1376
- return SCROLL_EVENT_TYPE;
1377
- },
1378
- get SELECTIONCHANGE_EVENT_TYPE() {
1379
- return SELECTIONCHANGE_EVENT_TYPE;
1380
- },
1381
- get SELECT_EVENT_TYPE() {
1382
- return SELECT_EVENT_TYPE;
1383
- },
1384
- get TOUCHEND_EVENT_TYPE() {
1385
- return TOUCHEND_EVENT_TYPE;
1386
- },
1387
- get TOUCHMOVE_EVENT_TYPE() {
1388
- return TOUCHMOVE_EVENT_TYPE;
1389
- },
1390
- get TOUCHSTART_EVENT_TYPE() {
1391
- return TOUCHSTART_EVENT_TYPE;
1392
- },
1393
- get UNHANDLEDREJECTION_EVENT_TYPE() {
1394
- return UNHANDLEDREJECTION_EVENT_TYPE;
1395
- },
1396
- get WHEEL_EVENT_TYPE() {
1397
- return WHEEL_EVENT_TYPE;
1398
- },
1399
- get default() {
1400
- return _default;
1401
- }
1402
- });
1403
- var CUT_EVENT_TYPE = "cut";
1404
- var COPY_EVENT_TYPE = "copy";
1405
- var BLUR_EVENT_TYPE = "blur";
1406
- var ERROR_EVENT_TYPE = "error";
1407
- var PASTE_EVENT_TYPE = "paste";
1408
- var WHEEL_EVENT_TYPE = "wheel";
1409
- var INPUT_EVENT_TYPE = "input";
1410
- var FOCUS_EVENT_TYPE = "focus";
1411
- var CLICK_EVENT_TYPE = "click";
1412
- var KEYUP_EVENT_TYPE = "keyup";
1413
- var SELECT_EVENT_TYPE = "select";
1414
- var CHANGE_EVENT_TYPE = "change";
1415
- var RESIZE_EVENT_TYPE = "resize";
1416
- var SCROLL_EVENT_TYPE = "scroll";
1417
- var KEYDOWN_EVENT_TYPE = "keydown";
1418
- var MOUSEUP_EVENT_TYPE = "mouseup";
1419
- var AUXCLICK_EVENT_TYPE = "auxclick";
1420
- var MOUSEOUT_EVENT_TYPE = "mouseout";
1421
- var DBLCLICK_EVENT_TYPE = "dblclick";
1422
- var TOUCHEND_EVENT_TYPE = "touchend";
1423
- var TOUCHMOVE_EVENT_TYPE = "touchmove";
1424
- var MOUSEOVER_EVENT_TYPE = "mouseover";
1425
- var MOUSEDOWN_EVENT_TYPE = "mousedown";
1426
- var MOUSEMOVE_EVENT_TYPE = "mousemove";
1427
- var TOUCHSTART_EVENT_TYPE = "touchstart";
1428
- var CONTEXTMENU_EVENT_TYPE = "contextmenu";
1429
- var SELECTIONCHANGE_EVENT_TYPE = "selectionchange";
1430
- var FULLSCREENCHANGE_EVENT_TYPE = "fullscreenchange";
1431
- var UNHANDLEDREJECTION_EVENT_TYPE = "unhandledrejection";
1432
- var _default = {
1433
- CUT_EVENT_TYPE,
1434
- COPY_EVENT_TYPE,
1435
- BLUR_EVENT_TYPE,
1436
- ERROR_EVENT_TYPE,
1437
- PASTE_EVENT_TYPE,
1438
- WHEEL_EVENT_TYPE,
1439
- INPUT_EVENT_TYPE,
1440
- FOCUS_EVENT_TYPE,
1441
- CLICK_EVENT_TYPE,
1442
- KEYUP_EVENT_TYPE,
1443
- SELECT_EVENT_TYPE,
1444
- CHANGE_EVENT_TYPE,
1445
- RESIZE_EVENT_TYPE,
1446
- SCROLL_EVENT_TYPE,
1447
- KEYDOWN_EVENT_TYPE,
1448
- MOUSEUP_EVENT_TYPE,
1449
- AUXCLICK_EVENT_TYPE,
1450
- MOUSEOUT_EVENT_TYPE,
1451
- DBLCLICK_EVENT_TYPE,
1452
- TOUCHEND_EVENT_TYPE,
1453
- TOUCHMOVE_EVENT_TYPE,
1454
- MOUSEOVER_EVENT_TYPE,
1455
- MOUSEDOWN_EVENT_TYPE,
1456
- MOUSEMOVE_EVENT_TYPE,
1457
- TOUCHSTART_EVENT_TYPE,
1458
- CONTEXTMENU_EVENT_TYPE,
1459
- SELECTIONCHANGE_EVENT_TYPE,
1460
- FULLSCREENCHANGE_EVENT_TYPE,
1461
- UNHANDLEDREJECTION_EVENT_TYPE
1462
- };
1463
- });
1464
-
1465
- // lib/mixins/jsx.js
1466
- var require_jsx = __commonJS((exports) => {
1467
- "use strict";
1468
- Object.defineProperty(exports, "__esModule", {
1469
- value: true
1470
- });
1471
- Object.defineProperty(exports, "default", {
1472
- enumerable: true,
1473
- get: function() {
1474
- return _default;
1475
- }
1476
- });
1477
- var _array = require_array();
1478
- var _object = require_object();
1479
- var _string = require_string();
1480
- var _name = require_name();
1481
- var _elements = require_elements();
1482
- var _eventTypes = require_eventTypes();
1483
- var _constants = require_constants();
1484
- var DOUBLE_CLICK_EVENT_TYPE = "doubleclick";
1485
- var SELECTION_CHANGE_EVENT_TYPE = "selectionChange";
1486
- var FULL_SCREEN_CHANGE_EVENT_TYPE = "fullScreenChange";
1487
- function applyProperties(properties, defaultProperties, ignoredProperties) {
1488
- this.properties = (0, _object.combine)(properties, defaultProperties);
1489
- properties = (0, _object.prune)(this.properties, ignoredProperties);
1490
- const namespaceURI = this.domElement.namespaceURI, svg = namespaceURI === _constants.SVG_NAMESPACE_URI, propertiesKeys = Object.keys(properties), names = propertiesKeys;
1491
- names.forEach((name) => {
1492
- const value = properties[name], nameHandlerName = isNameHandlerName(name), nameCustomHandlerName = isNameCustomHandlerName(name);
1493
- if (false) {
1494
- } else if (nameHandlerName) {
1495
- addHandler(this, name, value);
1496
- } else if (nameCustomHandlerName) {
1497
- addCustomHandler(this, name, value);
1498
- } else {
1499
- const nameAttributeName = isNameAttributeName(name, svg);
1500
- if (nameAttributeName) {
1501
- addAttribute(this, name, value);
1502
- }
1503
- }
1504
- });
1505
- const childElements = childElementsFromElement(this) || properties.childElements, context = {};
1506
- childElements.forEach((childElement) => {
1507
- updateContext(childElement, context);
1508
- this.add(childElement);
1509
- });
1510
- this.context = context;
1511
- }
1512
- function getProperties() {
1513
- return this.properties;
1514
- }
1515
- function getContext() {
1516
- return this.context;
1517
- }
1518
- function assignContext(names) {
1519
- if (names === void 0) {
1520
- names = Object.keys(this.context);
1521
- }
1522
- names.forEach((name) => {
1523
- const value = this.context[name], propertyName = name, descriptor = {
1524
- value
1525
- };
1526
- Object.defineProperty(this, propertyName, descriptor);
1527
- delete this.context[name];
1528
- });
1529
- }
1530
- var jsxMixins = {
1531
- applyProperties,
1532
- getProperties,
1533
- getContext,
1534
- assignContext
1535
- };
1536
- var _default = jsxMixins;
1537
- function childElementsFromElement(element) {
1538
- let childElements = null;
1539
- if (typeof element.childElements === _constants.FUNCTION) {
1540
- childElements = element.childElements.call(element);
1541
- childElements = (0, _array.guarantee)(childElements);
1542
- childElements = (0, _elements.removeFalseyElements)(childElements);
1543
- childElements = (0, _elements.replaceStringsWithTextElements)(childElements);
1544
- }
1545
- return childElements;
1546
- }
1547
- function updateContext(childElement, context) {
1548
- const parentContext = typeof childElement.parentContext === _constants.FUNCTION ? childElement.parentContext() : childElement.context;
1549
- Object.assign(context, parentContext);
1550
- }
1551
- function addHandler(element, name, value) {
1552
- let eventType = name.substring(2).toLowerCase();
1553
- switch (eventType) {
1554
- case DOUBLE_CLICK_EVENT_TYPE: {
1555
- eventType = _eventTypes.DBLCLICK_EVENT_TYPE;
1556
- break;
1557
- }
1558
- case SELECTION_CHANGE_EVENT_TYPE: {
1559
- eventType = _eventTypes.SELECTIONCHANGE_EVENT_TYPE;
1560
- break;
1561
- }
1562
- case FULL_SCREEN_CHANGE_EVENT_TYPE: {
1563
- eventType = _eventTypes.FULLSCREENCHANGE_EVENT_TYPE;
1564
- break;
1565
- }
1566
- }
1567
- const handler = value;
1568
- element.onEvent(eventType, handler);
1569
- }
1570
- function addCustomHandler(element, name, value) {
1571
- const customEventType = (0, _string.camelCaseToSnakeCase)(name).replace(/on-custom-/, ""), customHandler = value;
1572
- element.onCustomEvent(customEventType, customHandler);
1573
- }
1574
- function addAttribute(element, name, value) {
1575
- if (name === _constants.CLASS_NAME) {
1576
- name = _constants.CLASS;
1577
- }
1578
- if (name === _constants.HTML_FOR) {
1579
- name = _constants.FOR;
1580
- }
1581
- if (typeof value === _constants.OBJECT) {
1582
- const keys = Object.keys(value);
1583
- keys.forEach((key) => {
1584
- element.domElement[name][key] = value[key];
1585
- });
1586
- } else if (typeof value === _constants.BOOLEAN) {
1587
- if (value) {
1588
- value = name;
1589
- element.addAttribute(name, value);
1590
- }
1591
- } else {
1592
- element.addAttribute(name, value);
1593
- }
1594
- }
1595
- function isNameHandlerName(name) {
1596
- const nameHandlerName = /^on(?!Custom)/.test(name);
1597
- return nameHandlerName;
1598
- }
1599
- function isNameAttributeName(name, svg) {
1600
- const nameAttributeName = svg ? (0, _name.isSVGAttributeName)(name) : (0, _name.isHTMLAttributeName)(name);
1601
- return nameAttributeName;
1602
- }
1603
- function isNameCustomHandlerName(name) {
1604
- const nameCustomHandlerName = /^onCustom/.test(name);
1605
- return nameCustomHandlerName;
1606
- }
1607
- });
1608
-
1609
- // lib/mixins/key.js
1610
- var require_key = __commonJS((exports) => {
1611
- "use strict";
1612
- Object.defineProperty(exports, "__esModule", {
1613
- value: true
1614
- });
1615
- Object.defineProperty(exports, "default", {
1616
- enumerable: true,
1617
- get: function() {
1618
- return _default;
1619
- }
1620
- });
1621
- var _eventTypes = require_eventTypes();
1622
- function onKeyUp(keyUpHandler, element) {
1623
- this.onEvent(_eventTypes.KEYUP_EVENT_TYPE, keyUpHandler, element);
1624
- }
1625
- function offKeyUp(keyUpHandler, element) {
1626
- this.offEvent(_eventTypes.KEYUP_EVENT_TYPE, keyUpHandler, element);
1627
- }
1628
- function onKeyDown(keyDownHandler, element) {
1629
- this.onEvent(_eventTypes.KEYDOWN_EVENT_TYPE, keyDownHandler, element);
1630
- }
1631
- function offKeyDown(keyDownHandler, element) {
1632
- this.offEvent(_eventTypes.KEYDOWN_EVENT_TYPE, keyDownHandler, element);
1633
- }
1634
- var keyMixins = {
1635
- onKeyUp,
1636
- offKeyUp,
1637
- onKeyDown,
1638
- offKeyDown
1639
- };
1640
- var _default = keyMixins;
1641
- });
1642
-
1643
- // lib/mixins/state.js
1644
- var require_state = __commonJS((exports) => {
1645
- "use strict";
1646
- Object.defineProperty(exports, "__esModule", {
1647
- value: true
1648
- });
1649
- Object.defineProperty(exports, "default", {
1650
- enumerable: true,
1651
- get: function() {
1652
- return _default;
1653
- }
1654
- });
1655
- function getState() {
1656
- return this.state;
1657
- }
1658
- function setState(state) {
1659
- this.state = state;
1660
- }
1661
- function updateState(state) {
1662
- this.state === void 0 ? this.state = state : Object.assign(this.state, state);
1663
- }
1664
- var stateMixins = {
1665
- getState,
1666
- setState,
1667
- updateState
1668
- };
1669
- var _default = stateMixins;
1670
- });
1671
-
1672
- // lib/mixins/event.js
1673
- var require_event = __commonJS((exports) => {
1674
- "use strict";
1675
- Object.defineProperty(exports, "__esModule", {
1676
- value: true
1677
- });
1678
- Object.defineProperty(exports, "default", {
1679
- enumerable: true,
1680
- get: function() {
1681
- return _default;
1682
- }
1683
- });
1684
- var _constants = require_constants();
1685
- var _eventTypes = require_eventTypes();
1686
- function onEvent(eventTypes, handler, element = this) {
1687
- eventTypes = eventTypes.split(_constants.SPACE);
1688
- eventTypes.forEach((eventType) => {
1689
- if (eventType === _eventTypes.RESIZE_EVENT_TYPE) {
1690
- const resizeEventListeners = this.findEventListeners(_eventTypes.RESIZE_EVENT_TYPE), resizeEventListenersLength = resizeEventListeners.length;
1691
- if (resizeEventListenersLength === 0) {
1692
- this.resizeObserver = new ResizeObserver((entries) => {
1693
- const resizeEventListeners2 = this.findEventListeners(_eventTypes.RESIZE_EVENT_TYPE);
1694
- resizeEventListeners2.forEach((resizeEventListener) => {
1695
- const event = null;
1696
- resizeEventListener(event);
1697
- });
1698
- });
1699
- this.resizeObserver.observe(this.domElement);
1700
- }
1701
- this.addEventListener(eventType, handler, element);
1702
- } else {
1703
- const eventListener = this.addEventListener(eventType, handler, element);
1704
- this.domElement.addEventListener(eventType, eventListener);
1705
- }
1706
- });
1707
- }
1708
- function offEvent(eventTypes, handler, element = this) {
1709
- eventTypes = eventTypes.split(_constants.SPACE);
1710
- eventTypes.forEach((eventType) => {
1711
- if (eventType === _eventTypes.RESIZE_EVENT_TYPE) {
1712
- this.removeEventListener(eventType, handler, element);
1713
- const resizeEventListeners = this.findEventListeners(_eventTypes.RESIZE_EVENT_TYPE), resizeEventListenersLength = resizeEventListeners.length;
1714
- if (resizeEventListenersLength === 0) {
1715
- this.resizeObserver.unobserve(this.domElement);
1716
- delete this.resizeObserver;
1717
- }
1718
- } else {
1719
- const eventListener = this.removeEventListener(eventType, handler, element);
1720
- this.domElement.removeEventListener(eventType, eventListener);
1721
- }
1722
- });
1723
- }
1724
- function addEventListener(eventType, handler, element) {
1725
- const eventListener = this.createEventListener(eventType, handler, element);
1726
- if (!this.eventListeners) {
1727
- this.eventListeners = [];
1728
- }
1729
- this.eventListeners.push(eventListener);
1730
- return eventListener;
1731
- }
1732
- function removeEventListener(eventType, handler, element) {
1733
- const eventListener = this.findEventListener(eventType, handler, element), index = this.eventListeners.indexOf(eventListener), start = index, deleteCount = 1;
1734
- this.eventListeners.splice(start, deleteCount);
1735
- if (this.eventListeners.length === 0) {
1736
- delete this.eventListeners;
1737
- }
1738
- return eventListener;
1739
- }
1740
- function findEventListener(eventType, handler, element) {
1741
- const eventListener = this.eventListeners.find((eventListener2) => {
1742
- if (eventListener2.element === element && eventListener2.handler === handler && eventListener2.eventType === eventType) {
1743
- return true;
1744
- }
1745
- });
1746
- return eventListener;
1747
- }
1748
- function findEventListeners(eventType) {
1749
- const eventListeners = [];
1750
- if (this.eventListeners) {
1751
- this.eventListeners.forEach((eventListener) => {
1752
- const found = eventListener.eventType === eventType;
1753
- if (found) {
1754
- eventListeners.push(eventListener);
1755
- }
1756
- });
1757
- }
1758
- return eventListeners;
1759
- }
1760
- function createEventListener(eventType, handler, element) {
1761
- let eventListener;
1762
- const handlerElement = element;
1763
- eventListener = (event) => {
1764
- const element2 = this;
1765
- handler.call(handlerElement, event, element2);
1766
- };
1767
- Object.assign(eventListener, {
1768
- element,
1769
- handler,
1770
- eventType
1771
- });
1772
- return eventListener;
1773
- }
1774
- var eventMixins = {
1775
- onEvent,
1776
- offEvent,
1777
- addEventListener,
1778
- removeEventListener,
1779
- findEventListener,
1780
- findEventListeners,
1781
- createEventListener
1782
- };
1783
- var _default = eventMixins;
1784
- });
1785
-
1786
- // lib/mixins/mouse.js
1787
- var require_mouse = __commonJS((exports) => {
1788
- "use strict";
1789
- Object.defineProperty(exports, "__esModule", {
1790
- value: true
1791
- });
1792
- Object.defineProperty(exports, "default", {
1793
- enumerable: true,
1794
- get: function() {
1795
- return _default;
1796
- }
1797
- });
1798
- var _eventTypes = require_eventTypes();
1799
- function onMouseUp(mouseUpHandler, element) {
1800
- this.onEvent(_eventTypes.MOUSEUP_EVENT_TYPE, mouseUpHandler, element);
1801
- }
1802
- function offMouseUp(mouseUpHandler, element) {
1803
- this.offEvent(_eventTypes.MOUSEUP_EVENT_TYPE, mouseUpHandler, element);
1804
- }
1805
- function onMouseOut(mouseOutHandler, element) {
1806
- this.onEvent(_eventTypes.MOUSEOUT_EVENT_TYPE, mouseOutHandler, element);
1807
- }
1808
- function offMouseOut(mouseOutHandler, element) {
1809
- this.offEvent(_eventTypes.MOUSEOUT_EVENT_TYPE, mouseOutHandler, element);
1810
- }
1811
- function onMouseDown(mouseDownHandler, element) {
1812
- this.onEvent(_eventTypes.MOUSEDOWN_EVENT_TYPE, mouseDownHandler, element);
1813
- }
1814
- function offMouseDown(mouseDownHandler, element) {
1815
- this.offEvent(_eventTypes.MOUSEDOWN_EVENT_TYPE, mouseDownHandler, element);
1816
- }
1817
- function onMouseOver(mouseOverHandler, element) {
1818
- this.onEvent(_eventTypes.MOUSEOVER_EVENT_TYPE, mouseOverHandler, element);
1819
- }
1820
- function offMouseOver(mouseOverHandler, element) {
1821
- this.offEvent(_eventTypes.MOUSEOVER_EVENT_TYPE, mouseOverHandler, element);
1822
- }
1823
- function onMouseMove(mouseMoveHandler, element) {
1824
- this.onEvent(_eventTypes.MOUSEMOVE_EVENT_TYPE, mouseMoveHandler, element);
1825
- }
1826
- function offMouseMove(mouseMoveHandler, element) {
1827
- this.offEvent(_eventTypes.MOUSEMOVE_EVENT_TYPE, mouseMoveHandler, element);
1828
- }
1829
- var mouseMixins = {
1830
- onMouseUp,
1831
- offMouseUp,
1832
- onMouseOut,
1833
- offMouseOut,
1834
- onMouseDown,
1835
- offMouseDown,
1836
- onMouseOver,
1837
- offMouseOver,
1838
- onMouseMove,
1839
- offMouseMove
1840
- };
1841
- var _default = mouseMixins;
1842
- });
1843
-
1844
- // lib/mixins/click.js
1845
- var require_click = __commonJS((exports) => {
1846
- "use strict";
1847
- Object.defineProperty(exports, "__esModule", {
1848
- value: true
1849
- });
1850
- Object.defineProperty(exports, "default", {
1851
- enumerable: true,
1852
- get: function() {
1853
- return _default;
1854
- }
1855
- });
1856
- var _eventTypes = require_eventTypes();
1857
- function onClick(clickHandler, element) {
1858
- this.onEvent(_eventTypes.CLICK_EVENT_TYPE, clickHandler, element);
1859
- }
1860
- function offClick(clickHandler, element) {
1861
- this.offEvent(_eventTypes.CLICK_EVENT_TYPE, clickHandler, element);
1862
- }
1863
- function onAuxClick(auxClickHandler, element) {
1864
- this.onEvent(_eventTypes.AUXCLICK_EVENT_TYPE, auxClickHandler, element);
1865
- }
1866
- function offAuxClick(auxClickHandler, element) {
1867
- this.offEvent(_eventTypes.AUXCLICK_EVENT_TYPE, auxClickHandler, element);
1868
- }
1869
- function onDoubleClick(doubleClickHandler, element) {
1870
- this.onEvent(_eventTypes.DBLCLICK_EVENT_TYPE, doubleClickHandler, element);
1871
- }
1872
- function offDoubleClick(doubleClickHandler, element) {
1873
- this.offEvent(_eventTypes.DBLCLICK_EVENT_TYPE, doubleClickHandler, element);
1874
- }
1875
- var clickMixins = {
1876
- onClick,
1877
- offClick,
1878
- onAuxClick,
1879
- offAuxClick,
1880
- onDoubleClick,
1881
- offDoubleClick
1882
- };
1883
- var _default = clickMixins;
1884
- });
1885
-
1886
- // lib/mixins/touch.js
1887
- var require_touch = __commonJS((exports) => {
1888
- "use strict";
1889
- Object.defineProperty(exports, "__esModule", {
1890
- value: true
1891
- });
1892
- Object.defineProperty(exports, "default", {
1893
- enumerable: true,
1894
- get: function() {
1895
- return _default;
1896
- }
1897
- });
1898
- var _eventTypes = require_eventTypes();
1899
- function onTouchStart(touchStartHandler) {
1900
- this.onEvent(_eventTypes.TOUCHSTART_EVENT_TYPE, touchStartHandler);
1901
- }
1902
- function offTouchStart(touchStartHandler) {
1903
- this.offEvent(_eventTypes.TOUCHSTART_EVENT_TYPE, touchStartHandler);
1904
- }
1905
- function onTouchMove(touchStartHandler) {
1906
- this.onEvent(_eventTypes.TOUCHMOVE_EVENT_TYPE, touchStartHandler);
1907
- }
1908
- function offTouchMove(touchStartHandler) {
1909
- this.offEvent(_eventTypes.TOUCHMOVE_EVENT_TYPE, touchStartHandler);
1910
- }
1911
- function onTouchEnd(touchStartHandler) {
1912
- this.onEvent(_eventTypes.TOUCHEND_EVENT_TYPE, touchStartHandler);
1913
- }
1914
- function offTouchEnd(touchStartHandler) {
1915
- this.offEvent(_eventTypes.TOUCHEND_EVENT_TYPE, touchStartHandler);
1916
- }
1917
- var clickMixins = {
1918
- onTouchStart,
1919
- offTouchStart,
1920
- onTouchMove,
1921
- offTouchMove,
1922
- onTouchEnd,
1923
- offTouchEnd
1924
- };
1925
- var _default = clickMixins;
1926
- });
1927
-
1928
- // lib/mixins/scroll.js
1929
- var require_scroll = __commonJS((exports) => {
1930
- "use strict";
1931
- Object.defineProperty(exports, "__esModule", {
1932
- value: true
1933
- });
1934
- function _export(target, all) {
1935
- for (var name in all)
1936
- Object.defineProperty(target, name, {
1937
- enumerable: true,
1938
- get: Object.getOwnPropertyDescriptor(all, name).get
1939
- });
1940
- }
1941
- _export(exports, {
1942
- get default() {
1943
- return _default;
1944
- },
1945
- get offScroll() {
1946
- return offScroll;
1947
- },
1948
- get onScroll() {
1949
- return onScroll;
1950
- }
1951
- });
1952
- var _eventTypes = require_eventTypes();
1953
- function onScroll(scrollHandler, element) {
1954
- this.onEvent(_eventTypes.SCROLL_EVENT_TYPE, scrollHandler, element);
1955
- }
1956
- function offScroll(scrollHandler, element) {
1957
- this.offEvent(_eventTypes.SCROLL_EVENT_TYPE, scrollHandler, element);
1958
- }
1959
- function scrollTo(scrollTop, scrollLeft) {
1960
- this.domElement.scrollTo(scrollLeft, scrollTop);
1961
- }
1962
- function getScrollTop() {
1963
- return this.domElement.scrollTop;
1964
- }
1965
- function getScrollLeft() {
1966
- return this.domElement.scrollLeft;
1967
- }
1968
- function getScrollWidth() {
1969
- return this.domElement.scrollWidth;
1970
- }
1971
- function getScrollHeight() {
1972
- return this.domElement.scrollHeight;
1973
- }
1974
- function setScrollTop(scrollTop) {
1975
- this.domElement.scrollTop = scrollTop;
1976
- }
1977
- function setScrollLeft(scrollLeft) {
1978
- this.domElement.scrollLeft = scrollLeft;
1979
- }
1980
- var scrollMixins = {
1981
- onScroll,
1982
- offScroll,
1983
- scrollTo,
1984
- getScrollTop,
1985
- getScrollLeft,
1986
- getScrollWidth,
1987
- getScrollHeight,
1988
- setScrollTop,
1989
- setScrollLeft
1990
- };
1991
- var _default = scrollMixins;
1992
- });
1993
-
1994
- // lib/mixins/resize.js
1995
- var require_resize = __commonJS((exports) => {
1996
- "use strict";
1997
- Object.defineProperty(exports, "__esModule", {
1998
- value: true
1999
- });
2000
- Object.defineProperty(exports, "default", {
2001
- enumerable: true,
2002
- get: function() {
2003
- return _default;
2004
- }
2005
- });
2006
- var _eventTypes = require_eventTypes();
2007
- function onResize(resizeHandler, element) {
2008
- this.onEvent(_eventTypes.RESIZE_EVENT_TYPE, resizeHandler, element);
2009
- }
2010
- function offResize(resizeHandler, element) {
2011
- this.offEvent(_eventTypes.RESIZE_EVENT_TYPE, resizeHandler, element);
2012
- }
2013
- var resizeMixins = {
2014
- onResize,
2015
- offResize
2016
- };
2017
- var _default = resizeMixins;
2018
- });
2019
-
2020
- // lib/mixins/fullScreen.js
2021
- var require_fullScreen = __commonJS((exports) => {
2022
- "use strict";
2023
- Object.defineProperty(exports, "__esModule", {
2024
- value: true
2025
- });
2026
- Object.defineProperty(exports, "default", {
2027
- enumerable: true,
2028
- get: function() {
2029
- return _default;
2030
- }
2031
- });
2032
- var _eventTypes = require_eventTypes();
2033
- function onFullScreenChange(fullScreenChangeHandler, element) {
2034
- this.onEvent(_eventTypes.FULLSCREENCHANGE_EVENT_TYPE, fullScreenChangeHandler, element);
2035
- }
2036
- function offFullScreenChange(fullScreenChangeHandler, element) {
2037
- this.offEvent(_eventTypes.FULLSCREENCHANGE_EVENT_TYPE, fullScreenChangeHandler, element);
2038
- }
2039
- function requestFullScreen(errorHandler) {
2040
- const domElement = this.getDOMElement();
2041
- domElement.requestFullscreen().catch(errorHandler);
2042
- }
2043
- function exitFullScreen() {
2044
- document.exitFullscreen();
2045
- }
2046
- function isFullScreen() {
2047
- const {fullscreenElement} = document, fullScreen = fullscreenElement !== null;
2048
- return fullScreen;
2049
- }
2050
- var fullscreenMixins = {
2051
- onFullScreenChange,
2052
- offFullScreenChange,
2053
- requestFullScreen,
2054
- exitFullScreen,
2055
- isFullScreen
2056
- };
2057
- var _default = fullscreenMixins;
2058
- });
2059
-
2060
- // lib/utilities/async.js
2061
- var require_async = __commonJS((exports) => {
2062
- "use strict";
2063
- Object.defineProperty(exports, "__esModule", {
2064
- value: true
2065
- });
2066
- Object.defineProperty(exports, "forEach", {
2067
- enumerable: true,
2068
- get: function() {
2069
- return forEach;
2070
- }
2071
- });
2072
- function forEach(array, operation, done, context) {
2073
- const length = array.length;
2074
- let count = -1;
2075
- function next() {
2076
- count++;
2077
- const terminate = count === length;
2078
- if (terminate) {
2079
- done();
2080
- } else {
2081
- const index = count, element = array[index];
2082
- operation(element, next, done, context, index);
2083
- }
2084
- }
2085
- next();
2086
- }
2087
- });
2088
-
2089
- // lib/mixins/customEvent.js
2090
- var require_customEvent = __commonJS((exports) => {
2091
- "use strict";
2092
- Object.defineProperty(exports, "__esModule", {
2093
- value: true
2094
- });
2095
- Object.defineProperty(exports, "default", {
2096
- enumerable: true,
2097
- get: function() {
2098
- return _default;
2099
- }
2100
- });
2101
- var _constants = require_constants();
2102
- var _async = require_async();
2103
- function onCustomEvent(customEventTypes, customHandler, element = this) {
2104
- customEventTypes = customEventTypes.split(_constants.SPACE);
2105
- customEventTypes.forEach((customEventType) => {
2106
- this.addCustomEventListener(customEventType, customHandler, element);
2107
- });
2108
- }
2109
- function offCustomEvent(customEventTypes, customHandler, element = this) {
2110
- customEventTypes = customEventTypes.split(_constants.SPACE);
2111
- customEventTypes.forEach((customEventType) => {
2112
- this.removeCustomEventListener(customEventType, customHandler, element);
2113
- });
2114
- }
2115
- function callCustomHandlers(customEventType, ...remainingArguments) {
2116
- const customEventListeners = this.findCustomEventListeners(customEventType);
2117
- customEventListeners.forEach((customEventListener) => {
2118
- const {customHandler, element: customHandlerElement} = customEventListener;
2119
- customHandler.call(customHandlerElement, ...remainingArguments);
2120
- });
2121
- }
2122
- function callCustomHandlersAsync(customEventType, ...remainingArguments) {
2123
- const customEventListeners = this.findCustomEventListeners(customEventType), done = remainingArguments.pop();
2124
- (0, _async.forEach)(customEventListeners, (customEventListener, next) => {
2125
- const {customHandler, element: customHandlerElement} = customEventListener, done2 = next;
2126
- customHandler.call(customHandlerElement, ...remainingArguments, done2);
2127
- }, done);
2128
- }
2129
- function addCustomEventListener(customEventType, customHandler, element) {
2130
- const customEventListener = this.createCustomEventListener(customEventType, customHandler, element);
2131
- if (!this.customEventListeners) {
2132
- this.customEventListeners = [];
2133
- }
2134
- this.customEventListeners.push(customEventListener);
2135
- return customEventListener;
2136
- }
2137
- function removeCustomEventListener(customEventType, customHandler, element) {
2138
- const customEventListener = this.findCustomEventListener(customEventType, customHandler, element), index = this.customEventListeners.indexOf(customEventListener), start = index, deleteCount = 1;
2139
- this.customEventListeners.splice(start, deleteCount);
2140
- if (this.customEventListeners.length === 0) {
2141
- delete this.customEventListeners;
2142
- }
2143
- return customEventListener;
2144
- }
2145
- function findCustomEventListener(customEventType, customHandler, element) {
2146
- const customEventListener = this.customEventListeners.find((customEventListener2) => {
2147
- if (customEventListener2.element === element && customEventListener2.customHandler === customHandler && customEventListener2.customEventType === customEventType) {
2148
- return true;
2149
- }
2150
- });
2151
- return customEventListener;
2152
- }
2153
- function findCustomEventListeners(customEventType) {
2154
- const customEventListeners = [];
2155
- if (this.customEventListeners) {
2156
- this.customEventListeners.forEach((customEventListener) => {
2157
- const found = customEventListener.customEventType === customEventType;
2158
- if (found) {
2159
- customEventListeners.push(customEventListener);
2160
- }
2161
- });
2162
- }
2163
- return customEventListeners;
2164
- }
2165
- function createCustomEventListener(customEventType, customHandler, element) {
2166
- let customEventListener;
2167
- customEventListener = () => {
2168
- };
2169
- Object.assign(customEventListener, {
2170
- element,
2171
- customHandler,
2172
- customEventType
2173
- });
2174
- return customEventListener;
2175
- }
2176
- var customEventMixins = {
2177
- onCustomEvent,
2178
- offCustomEvent,
2179
- callCustomHandlers,
2180
- callCustomHandlersAsync,
2181
- addCustomEventListener,
2182
- removeCustomEventListener,
2183
- findCustomEventListener,
2184
- findCustomEventListeners,
2185
- createCustomEventListener
2186
- };
2187
- var _default = customEventMixins;
2188
- });
2189
-
2190
- // lib/element.js
2191
- var require_element3 = __commonJS((exports) => {
2192
- "use strict";
2193
- Object.defineProperty(exports, "__esModule", {
2194
- value: true
2195
- });
2196
- Object.defineProperty(exports, "default", {
2197
- enumerable: true,
2198
- get: function() {
2199
- return Element;
2200
- }
2201
- });
2202
- var _offset = /* @__PURE__ */ _interop_require_default(require_offset());
2203
- var _bounds = /* @__PURE__ */ _interop_require_default(require_bounds());
2204
- var _jsx = /* @__PURE__ */ _interop_require_default(require_jsx());
2205
- var _key = /* @__PURE__ */ _interop_require_default(require_key());
2206
- var _state = /* @__PURE__ */ _interop_require_default(require_state());
2207
- var _event = /* @__PURE__ */ _interop_require_default(require_event());
2208
- var _mouse = /* @__PURE__ */ _interop_require_default(require_mouse());
2209
- var _click = /* @__PURE__ */ _interop_require_default(require_click());
2210
- var _touch = /* @__PURE__ */ _interop_require_default(require_touch());
2211
- var _scroll = /* @__PURE__ */ _interop_require_default(require_scroll());
2212
- var _resize = /* @__PURE__ */ _interop_require_default(require_resize());
2213
- var _element = /* @__PURE__ */ _interop_require_default(require_element2());
2214
- var _fullScreen = /* @__PURE__ */ _interop_require_default(require_fullScreen());
2215
- var _customEvent = /* @__PURE__ */ _interop_require_default(require_customEvent());
2216
- var _array = require_array();
2217
- var _object = require_object();
2218
- var _name = require_name();
2219
- var _element1 = require_element();
2220
- var _constants = require_constants();
2221
- function _interop_require_default(obj) {
2222
- return obj && obj.__esModule ? obj : {
2223
- default: obj
2224
- };
2225
- }
2226
- var Element = class {
2227
- constructor(selector) {
2228
- if (selector !== null) {
2229
- const element = this, domElement = document.querySelector(selector);
2230
- (0, _element1.constructElement)(element, domElement);
2231
- }
2232
- }
2233
- getDOMElement() {
2234
- return this.domElement;
2235
- }
2236
- getOffset() {
2237
- const offset = _offset.default.fromDOMElement(this.domElement);
2238
- return offset;
2239
- }
2240
- getBounds() {
2241
- const bounds = _bounds.default.fromDOMElement(this.domElement);
2242
- return bounds;
2243
- }
2244
- getWidth() {
2245
- return this.domElement.offsetWidth;
2246
- }
2247
- getHeight() {
2248
- return this.domElement.offsetHeight;
2249
- }
2250
- getInnerWidth() {
2251
- return this.domElement.clientWidth;
2252
- }
2253
- getInnerHeight() {
2254
- return this.domElement.clientHeight;
2255
- }
2256
- setWidth(width) {
2257
- width = `${width}px`;
2258
- this.style(_constants.WIDTH, width);
2259
- }
2260
- setHeight(height) {
2261
- height = `${height}px`;
2262
- this.style(_constants.HEIGHT, height);
2263
- }
2264
- hasAttribute(name) {
2265
- return this.domElement.hasAttribute(name);
2266
- }
2267
- getAttribute(name) {
2268
- return this.domElement.getAttribute(name);
2269
- }
2270
- setAttribute(name, value) {
2271
- this.domElement.setAttribute(name, value);
2272
- }
2273
- clearAttribute(name) {
2274
- this.domElement.removeAttribute(name);
2275
- }
2276
- addAttribute(name, value) {
2277
- this.setAttribute(name, value);
2278
- }
2279
- removeAttribute(name) {
2280
- this.clearAttribute(name);
2281
- }
2282
- hasClass(className) {
2283
- return this.domElement.classList.contains(className);
2284
- }
2285
- setClass(className) {
2286
- this.domElement.className = className;
2287
- }
2288
- addClass(className) {
2289
- this.domElement.classList.add(className);
2290
- }
2291
- removeClass(className) {
2292
- this.domElement.classList.remove(className);
2293
- }
2294
- toggleClass(className) {
2295
- this.domElement.classList.toggle(className);
2296
- }
2297
- removeAllClasses() {
2298
- this.domElement.className = _constants.EMPTY_STRING;
2299
- }
2300
- addTo(parentElement) {
2301
- parentElement.add(this);
2302
- }
2303
- appendTo(parentElement) {
2304
- parentElement.append(this);
2305
- }
2306
- prependTo(parentElement) {
2307
- parentElement.prepend(this);
2308
- }
2309
- removeFrom(parentElement) {
2310
- parentElement.remove(this);
2311
- }
2312
- insert(element) {
2313
- this.append(element);
2314
- }
2315
- add(element) {
2316
- this.append(element);
2317
- }
2318
- remove(element) {
2319
- if (element) {
2320
- element.remove();
2321
- return;
2322
- }
2323
- this.domElement.remove();
2324
- }
2325
- prepend(element) {
2326
- const domElement = element.domElement, referenceDOMElement = this.domElement.firstChild;
2327
- this.domElement.insertBefore(domElement, referenceDOMElement);
2328
- }
2329
- append(element) {
2330
- const domElement = element.domElement, referenceDOMElement = null;
2331
- this.domElement.insertBefore(domElement, referenceDOMElement);
2332
- }
2333
- insertBefore(siblingElement) {
2334
- const parentDOMNode = siblingElement.domElement.parentNode, referenceDOMElement = siblingElement.domElement;
2335
- parentDOMNode.insertBefore(this.domElement, referenceDOMElement);
2336
- }
2337
- insertAfter(siblingElement) {
2338
- const parentDOMNode = siblingElement.domElement.parentNode, referenceDOMElement = siblingElement.domElement.nextSibling;
2339
- parentDOMNode.insertBefore(this.domElement, referenceDOMElement);
2340
- }
2341
- mount(element) {
2342
- this.add(element);
2343
- (0, _element1.mountElement)(element);
2344
- }
2345
- unmount(element) {
2346
- (0, _element1.unmountElement)(element);
2347
- this.remove(element);
2348
- }
2349
- mountBefore(siblingElement) {
2350
- this.insertBefore(siblingElement);
2351
- const element = this;
2352
- (0, _element1.mountElement)(element);
2353
- }
2354
- mountAfter(siblingElement) {
2355
- this.insertAfter(siblingElement);
2356
- const element = this;
2357
- (0, _element1.mountElement)(element);
2358
- }
2359
- show(displayStyle = _constants.BLOCK) {
2360
- this.display(displayStyle);
2361
- }
2362
- hide() {
2363
- this.style(_constants.DISPLAY, _constants.NONE);
2364
- }
2365
- display(display) {
2366
- this.style(_constants.DISPLAY, display);
2367
- }
2368
- enable() {
2369
- this.clearAttribute(_constants.DISABLED);
2370
- }
2371
- disable() {
2372
- this.setAttribute(_constants.DISABLED, _constants.DISABLED);
2373
- }
2374
- isEnabled() {
2375
- const disabled = this.isDisabled(), enabled = !disabled;
2376
- return enabled;
2377
- }
2378
- isDisabled() {
2379
- const disabled = this.hasAttribute(_constants.DISABLED);
2380
- return disabled;
2381
- }
2382
- isDisplayed() {
2383
- const display = this.css(_constants.DISPLAY), displayed = display !== _constants.NONE;
2384
- return displayed;
2385
- }
2386
- isShowing() {
2387
- const displayed = this.isDisplayed(), showing = displayed;
2388
- return showing;
2389
- }
2390
- isHidden() {
2391
- const displayed = this.isDisplayed(), hidden = !displayed;
2392
- return hidden;
2393
- }
2394
- style(name, value = null) {
2395
- if (value !== null) {
2396
- this.domElement.style[name] = value;
2397
- return;
2398
- }
2399
- const style = this.domElement.style[name];
2400
- return style;
2401
- }
2402
- html(html = null) {
2403
- if (html !== null) {
2404
- const innerHTML2 = html;
2405
- this.domElement.innerHTML = innerHTML2;
2406
- return;
2407
- }
2408
- const innerHTML = this.domElement.innerHTML;
2409
- html = innerHTML;
2410
- return html;
2411
- }
2412
- css(css = null) {
2413
- if (css === null) {
2414
- css = {};
2415
- const computedStyles = getComputedStyle(this.domElement);
2416
- for (let index = 0; index < computedStyles.length; index++) {
2417
- const computedStyle = computedStyles[index], name = computedStyle, value = computedStyles.getPropertyValue(name);
2418
- css[name] = value;
2419
- }
2420
- } else if (typeof css === _constants.STRING) {
2421
- let name = css;
2422
- const computedStyles = getComputedStyle(this.domElement), value = computedStyles.getPropertyValue(name);
2423
- css = value;
2424
- } else {
2425
- const names = Object.keys(css);
2426
- names.forEach((name) => {
2427
- const value = css[name];
2428
- this.style(name, value);
2429
- });
2430
- }
2431
- return css;
2432
- }
2433
- destroy() {
2434
- const element = this;
2435
- (0, _element1.destroyElement)(element);
2436
- }
2437
- static fromClass(Class, properties, ...remainingArguments) {
2438
- const {tagName} = Class, element = elementFromTagName(Class, tagName, ...remainingArguments), defaultProperties = defaultPropertiesFromClass(Class), ignoredProperties = ignoredPropertiesFromClass(Class);
2439
- element.applyProperties(properties, defaultProperties, ignoredProperties);
2440
- element.initialise && element.initialise();
2441
- return element;
2442
- }
2443
- static fromTagName(tagName, properties, ...remainingArguments) {
2444
- const Class = Element, element = elementFromTagName(Class, tagName, ...remainingArguments), defaultProperties = {}, ignoredProperties = [];
2445
- element.applyProperties(properties, defaultProperties, ignoredProperties);
2446
- element.initialise && element.initialise();
2447
- return element;
2448
- }
2449
- };
2450
- Object.assign(Element.prototype, _jsx.default);
2451
- Object.assign(Element.prototype, _key.default);
2452
- Object.assign(Element.prototype, _mouse.default);
2453
- Object.assign(Element.prototype, _click.default);
2454
- Object.assign(Element.prototype, _state.default);
2455
- Object.assign(Element.prototype, _event.default);
2456
- Object.assign(Element.prototype, _touch.default);
2457
- Object.assign(Element.prototype, _scroll.default);
2458
- Object.assign(Element.prototype, _resize.default);
2459
- Object.assign(Element.prototype, _element.default);
2460
- Object.assign(Element.prototype, _fullScreen.default);
2461
- Object.assign(Element.prototype, _customEvent.default);
2462
- function elementFromTagName(Class, tagName, ...remainingArguments) {
2463
- const selector = null, element = new (Function.prototype.bind.call(Class, null, selector, ...remainingArguments))(), domElement = (0, _name.isSVGTagName)(tagName) ? document.createElementNS(_constants.SVG_NAMESPACE_URI, tagName) : document.createElement(tagName);
2464
- (0, _element1.constructElement)(element, domElement);
2465
- return element;
2466
- }
2467
- function defaultPropertiesFromClass(Class, defaultProperties = {}) {
2468
- if (Class.hasOwnProperty(_constants.DEFAULT_PROPERTIES)) {
2469
- defaultProperties = (0, _object.combine)(defaultProperties, Class[_constants.DEFAULT_PROPERTIES]);
2470
- }
2471
- const superClass = Object.getPrototypeOf(Class);
2472
- if (superClass !== null) {
2473
- defaultProperties = defaultPropertiesFromClass(superClass, defaultProperties);
2474
- }
2475
- return defaultProperties;
2476
- }
2477
- function ignoredPropertiesFromClass(Class, ignoredProperties = []) {
2478
- if (Class.hasOwnProperty(_constants.IGNORED_PROPERTIES)) {
2479
- ignoredProperties = (0, _array.augment)(ignoredProperties, Class[_constants.IGNORED_PROPERTIES], (ignoredProperty) => {
2480
- if (!ignoredProperties.includes(ignoredProperty)) {
2481
- return true;
2482
- }
2483
- });
2484
- }
2485
- const superClass = Object.getPrototypeOf(Class);
2486
- if (superClass !== null) {
2487
- ignoredProperties = ignoredPropertiesFromClass(superClass, ignoredProperties);
2488
- }
2489
- return ignoredProperties;
2490
- }
2491
- });
2492
-
2493
- // lib/react.js
2494
- var require_react = __commonJS((exports) => {
2495
- "use strict";
2496
- Object.defineProperty(exports, "__esModule", {
2497
- value: true
2498
- });
2499
- Object.defineProperty(exports, "default", {
2500
- enumerable: true,
2501
- get: function() {
2502
- return _default;
2503
- }
2504
- });
2505
- var _element = /* @__PURE__ */ _interop_require_default(require_element3());
2506
- var _array = require_array();
2507
- var _constants = require_constants();
2508
- var _elements = require_elements();
2509
- function _interop_require_default(obj) {
2510
- return obj && obj.__esModule ? obj : {
2511
- default: obj
2512
- };
2513
- }
2514
- function createElement(firstArgument, properties, ...childElements) {
2515
- let element = null;
2516
- if (firstArgument) {
2517
- childElements = sanitiseChildElements(childElements);
2518
- properties = Object.assign({
2519
- childElements
2520
- }, properties);
2521
- if (false) {
2522
- } else if (isSubclassOf(firstArgument, _element.default)) {
2523
- const Class = firstArgument;
2524
- element = Class.fromClass(Class, properties);
2525
- } else if (typeof firstArgument === _constants.STRING) {
2526
- const tagName = firstArgument;
2527
- element = _element.default.fromTagName(tagName, properties);
2528
- } else if (typeof firstArgument === _constants.FUNCTION) {
2529
- const elementFunction = firstArgument;
2530
- element = elementFunction(properties);
2531
- }
2532
- }
2533
- return element;
2534
- }
2535
- var React2 = {
2536
- createElement
2537
- };
2538
- var _default = React2;
2539
- function sanitiseChildElements(childElements) {
2540
- childElements = (0, _array.flatten)(childElements);
2541
- childElements = (0, _elements.removeFalseyElements)(childElements);
2542
- childElements = (0, _elements.replaceStringsWithTextElements)(childElements);
2543
- return childElements;
2544
- }
2545
- function isSubclassOf(argument, Class) {
2546
- const subclassOf = argument.prototype instanceof Class;
2547
- return subclassOf;
2548
- }
2549
- });
2550
-
2551
- // lib/mouseButtons.js
2552
- var require_mouseButtons = __commonJS((exports) => {
2553
- "use strict";
2554
- Object.defineProperty(exports, "__esModule", {
2555
- value: true
2556
- });
2557
- function _export(target, all) {
2558
- for (var name in all)
2559
- Object.defineProperty(target, name, {
2560
- enumerable: true,
2561
- get: Object.getOwnPropertyDescriptor(all, name).get
2562
- });
2563
- }
2564
- _export(exports, {
2565
- get LEFT_MOUSE_BUTTON() {
2566
- return LEFT_MOUSE_BUTTON;
2567
- },
2568
- get MIDDLE_MOUSE_BUTTON() {
2569
- return MIDDLE_MOUSE_BUTTON;
2570
- },
2571
- get RIGHT_MOUSE_BUTTON() {
2572
- return RIGHT_MOUSE_BUTTON;
2573
- },
2574
- get default() {
2575
- return _default;
2576
- }
2577
- });
2578
- var LEFT_MOUSE_BUTTON = 0;
2579
- var RIGHT_MOUSE_BUTTON = 2;
2580
- var MIDDLE_MOUSE_BUTTON = 1;
2581
- var _default = {
2582
- LEFT_MOUSE_BUTTON,
2583
- RIGHT_MOUSE_BUTTON,
2584
- MIDDLE_MOUSE_BUTTON
2585
- };
2586
- });
2587
-
2588
- // lib/mixins/input.js
2589
- var require_input = __commonJS((exports) => {
2590
- "use strict";
2591
- Object.defineProperty(exports, "__esModule", {
2592
- value: true
2593
- });
2594
- Object.defineProperty(exports, "default", {
2595
- enumerable: true,
2596
- get: function() {
2597
- return _default;
2598
- }
2599
- });
2600
- var _eventTypes = require_eventTypes();
2601
- function onInput(inputHandler, element) {
2602
- this.onEvent(_eventTypes.INPUT_EVENT_TYPE, inputHandler, element);
2603
- }
2604
- function offInput(inputHandler, element) {
2605
- this.offEvent(_eventTypes.INPUT_EVENT_TYPE, inputHandler, element);
2606
- }
2607
- function onChange(changeHandler, element) {
2608
- this.onEvent(_eventTypes.CHANGE_EVENT_TYPE, changeHandler, element);
2609
- }
2610
- function offChange(changeHandler, element) {
2611
- this.offEvent(_eventTypes.CHANGE_EVENT_TYPE, changeHandler, element);
2612
- }
2613
- function getValue() {
2614
- return this.domElement.value;
2615
- }
2616
- function setValue(value) {
2617
- this.domElement.value = value;
2618
- }
2619
- function isReadOnly() {
2620
- return this.domElement.readOnly;
2621
- }
2622
- function setReadOnly(readOnly) {
2623
- this.domElement.readOnly = readOnly;
2624
- }
2625
- var inputMixins = {
2626
- onInput,
2627
- offInput,
2628
- onChange,
2629
- offChange,
2630
- getValue,
2631
- setValue,
2632
- isReadOnly,
2633
- setReadOnly
2634
- };
2635
- var _default = inputMixins;
2636
- });
2637
-
2638
- // lib/mixins/focus.js
2639
- var require_focus = __commonJS((exports) => {
2640
- "use strict";
2641
- Object.defineProperty(exports, "__esModule", {
2642
- value: true
2643
- });
2644
- Object.defineProperty(exports, "default", {
2645
- enumerable: true,
2646
- get: function() {
2647
- return _default;
2648
- }
2649
- });
2650
- var _eventTypes = require_eventTypes();
2651
- function onBlur(blurHandler, element) {
2652
- this.onEvent(_eventTypes.BLUR_EVENT_TYPE, blurHandler, element);
2653
- }
2654
- function offBlur(blurHandler, element) {
2655
- this.offEvent(_eventTypes.BLUR_EVENT_TYPE, blurHandler, element);
2656
- }
2657
- function onFocus(focusHandler, element) {
2658
- this.onEvent(_eventTypes.FOCUS_EVENT_TYPE, focusHandler, element);
2659
- }
2660
- function offFocus(focusHandler, element) {
2661
- this.offEvent(_eventTypes.FOCUS_EVENT_TYPE, focusHandler, element);
2662
- }
2663
- function blur() {
2664
- this.domElement.blur();
2665
- }
2666
- function focus() {
2667
- this.domElement.focus();
2668
- }
2669
- function hasFocus() {
2670
- const focus2 = document.activeElement === this.domElement;
2671
- return focus2;
2672
- }
2673
- var focusMixins = {
2674
- onBlur,
2675
- offBlur,
2676
- onFocus,
2677
- offFocus,
2678
- blur,
2679
- focus,
2680
- hasFocus
2681
- };
2682
- var _default = focusMixins;
2683
- });
2684
-
2685
- // lib/mixins/selection.js
2686
- var require_selection = __commonJS((exports) => {
2687
- "use strict";
2688
- Object.defineProperty(exports, "__esModule", {
2689
- value: true
2690
- });
2691
- Object.defineProperty(exports, "default", {
2692
- enumerable: true,
2693
- get: function() {
2694
- return _default;
2695
- }
2696
- });
2697
- var _eventTypes = require_eventTypes();
2698
- function onCut(cutHandler, element) {
2699
- this.onEvent(_eventTypes.CUT_EVENT_TYPE, cutHandler, element);
2700
- }
2701
- function offCut(cutHandler, element) {
2702
- this.offEvent(_eventTypes.CUT_EVENT_TYPE, cutHandler, element);
2703
- }
2704
- function onCopy(copyHandler, element) {
2705
- this.onEvent(_eventTypes.COPY_EVENT_TYPE, copyHandler, element);
2706
- }
2707
- function offCopy(copyHandler, element) {
2708
- this.offEvent(_eventTypes.COPY_EVENT_TYPE, copyHandler, element);
2709
- }
2710
- function onPaste(pasteHandler, element) {
2711
- this.onEvent(_eventTypes.PASTE_EVENT_TYPE, pasteHandler, element);
2712
- }
2713
- function offPaste(pasteHandler, element) {
2714
- this.offEvent(_eventTypes.PASTE_EVENT_TYPE, pasteHandler, element);
2715
- }
2716
- function getSelectionStart() {
2717
- return this.domElement.selectionStart;
2718
- }
2719
- function getSelectionEnd() {
2720
- return this.domElement.selectionEnd;
2721
- }
2722
- function setSelectionStart(selectionStart) {
2723
- this.domElement.selectionStart = selectionStart;
2724
- }
2725
- function setSelectionEnd(selectionEnd) {
2726
- this.domElement.selectionEnd = selectionEnd;
2727
- }
2728
- function select() {
2729
- this.domElement.select();
2730
- }
2731
- var selectionMixins = {
2732
- onCut,
2733
- offCut,
2734
- onCopy,
2735
- offCopy,
2736
- onPaste,
2737
- offPaste,
2738
- getSelectionStart,
2739
- getSelectionEnd,
2740
- setSelectionStart,
2741
- setSelectionEnd,
2742
- select
2743
- };
2744
- var _default = selectionMixins;
2745
- });
2746
-
2747
- // lib/document.js
2748
- var require_document = __commonJS((exports) => {
2749
- "use strict";
2750
- Object.defineProperty(exports, "__esModule", {
2751
- value: true
2752
- });
2753
- Object.defineProperty(exports, "default", {
2754
- enumerable: true,
2755
- get: function() {
2756
- return _default;
2757
- }
2758
- });
2759
- var _key = /* @__PURE__ */ _interop_require_default(require_key());
2760
- var _event = /* @__PURE__ */ _interop_require_default(require_event());
2761
- var _mouse = /* @__PURE__ */ _interop_require_default(require_mouse());
2762
- var _click = /* @__PURE__ */ _interop_require_default(require_click());
2763
- var _constants = require_constants();
2764
- var _eventTypes = require_eventTypes();
2765
- function _interop_require_default(obj) {
2766
- return obj && obj.__esModule ? obj : {
2767
- default: obj
2768
- };
2769
- }
2770
- var Document = class {
2771
- constructor() {
2772
- this.domElement = document;
2773
- }
2774
- getDOMElement() {
2775
- return this.domElement;
2776
- }
2777
- getSelection() {
2778
- return this.domElement.getSelection();
2779
- }
2780
- createRange() {
2781
- return this.domElement.createRange();
2782
- }
2783
- createTextNode(data) {
2784
- return this.domElement.createTextNode(data);
2785
- }
2786
- onSelectionChange(selectionChangeHandler, element) {
2787
- this.onEvent(_eventTypes.SELECTIONCHANGE_EVENT_TYPE, selectionChangeHandler, element);
2788
- }
2789
- offSelectionChange(selectionChangeHandler, element) {
2790
- this.offEvent(_eventTypes.SELECTIONCHANGE_EVENT_TYPE, selectionChangeHandler, element);
2791
- }
2792
- createEventListener(eventType, handler, element) {
2793
- let eventListener;
2794
- const handlerElement = element;
2795
- eventListener = (event) => {
2796
- if (eventType === _eventTypes.SELECTIONCHANGE_EVENT_TYPE) {
2797
- const {domElement} = handlerElement, {currentTarget} = event, {activeElement} = currentTarget;
2798
- if (domElement !== activeElement) {
2799
- return;
2800
- }
2801
- }
2802
- const element2 = this;
2803
- handler.call(handlerElement, event, element2);
2804
- };
2805
- Object.assign(eventListener, {
2806
- element,
2807
- handler,
2808
- eventType
2809
- });
2810
- return eventListener;
2811
- }
2812
- };
2813
- Object.assign(Document.prototype, _key.default);
2814
- Object.assign(Document.prototype, _event.default);
2815
- Object.assign(Document.prototype, _mouse.default);
2816
- Object.assign(Document.prototype, _click.default);
2817
- var _default = typeof document === _constants.UNDEFINED ? void 0 : new Document();
2818
- });
2819
-
2820
- // lib/window.js
2821
- var require_window = __commonJS((exports) => {
2822
- "use strict";
2823
- Object.defineProperty(exports, "__esModule", {
2824
- value: true
2825
- });
2826
- Object.defineProperty(exports, "default", {
2827
- enumerable: true,
2828
- get: function() {
2829
- return _default;
2830
- }
2831
- });
2832
- var _key = /* @__PURE__ */ _interop_require_default(require_key());
2833
- var _event = /* @__PURE__ */ _interop_require_default(require_event());
2834
- var _mouse = /* @__PURE__ */ _interop_require_default(require_mouse());
2835
- var _click = /* @__PURE__ */ _interop_require_default(require_click());
2836
- var _focus = /* @__PURE__ */ _interop_require_default(require_focus());
2837
- var _constants = require_constants();
2838
- var _eventTypes = require_eventTypes();
2839
- var _scroll = require_scroll();
2840
- function _interop_require_default(obj) {
2841
- return obj && obj.__esModule ? obj : {
2842
- default: obj
2843
- };
2844
- }
2845
- var Window = class {
2846
- constructor() {
2847
- this.domElement = window;
2848
- }
2849
- getDOMElement() {
2850
- return this.domElement;
2851
- }
2852
- assign(...sources) {
2853
- const target = this.domElement;
2854
- Object.assign(target, ...sources);
2855
- }
2856
- reload() {
2857
- window.location.reload();
2858
- }
2859
- getWidth() {
2860
- return this.domElement.innerWidth;
2861
- }
2862
- getHeight() {
2863
- return this.domElement.innerHeight;
2864
- }
2865
- getScrollTop() {
2866
- return this.domElement.pageYOffset;
2867
- }
2868
- getScrollLeft() {
2869
- return this.domElement.pageXOffset;
2870
- }
2871
- getSelection() {
2872
- return this.domElement.getSelection();
2873
- }
2874
- getScreenWidth() {
2875
- return this.domElement.screen.width;
2876
- }
2877
- getScreenHeight() {
2878
- return this.domElement.screen.height;
2879
- }
2880
- scrollTo(scrollTop, scrollLeft) {
2881
- this.domElement.scrollTo(scrollLeft, scrollTop);
2882
- }
2883
- onResize(resizeHandler, element) {
2884
- const eventType = _eventTypes.RESIZE_EVENT_TYPE, eventListener = this.addEventListener(eventType, resizeHandler, element);
2885
- this.domElement.addEventListener(eventType, eventListener);
2886
- }
2887
- offResize(resizeHandler, element) {
2888
- const eventType = _eventTypes.RESIZE_EVENT_TYPE, eventListener = this.removeEventListener(eventType, resizeHandler, element);
2889
- this.domElement.removeEventListener(eventType, eventListener);
2890
- }
2891
- };
2892
- Object.assign(Window.prototype, _key.default);
2893
- Object.assign(Window.prototype, _event.default);
2894
- Object.assign(Window.prototype, _mouse.default);
2895
- Object.assign(Window.prototype, _click.default);
2896
- Object.assign(Window.prototype, _focus.default);
2897
- Object.assign(Window.prototype, {
2898
- onScroll: _scroll.onScroll,
2899
- offScroll: _scroll.offScroll
2900
- });
2901
- var _default = typeof window === _constants.UNDEFINED ? void 0 : new Window();
2902
- });
2903
-
2904
- // lib/element/body.js
2905
- var require_body = __commonJS((exports) => {
2906
- "use strict";
2907
- Object.defineProperty(exports, "__esModule", {
2908
- value: true
2909
- });
2910
- Object.defineProperty(exports, "default", {
2911
- enumerable: true,
2912
- get: function() {
2913
- return Body;
2914
- }
2915
- });
2916
- var _element = /* @__PURE__ */ _interop_require_default(require_element3());
2917
- var _constants = require_constants();
2918
- function _interop_require_default(obj) {
2919
- return obj && obj.__esModule ? obj : {
2920
- default: obj
2921
- };
2922
- }
2923
- var Body = class extends _element.default {
2924
- constructor(selector = _constants.BODY) {
2925
- super(selector);
2926
- }
2927
- };
2928
- __publicField(Body, "tagName", "body");
2929
- });
2930
-
2931
- // lib/element/link.js
2932
- var require_link = __commonJS((exports) => {
2933
- "use strict";
2934
- Object.defineProperty(exports, "__esModule", {
2935
- value: true
2936
- });
2937
- Object.defineProperty(exports, "default", {
2938
- enumerable: true,
2939
- get: function() {
2940
- return Link;
2941
- }
2942
- });
2943
- var _element = /* @__PURE__ */ _interop_require_default(require_element3());
2944
- var _focus = /* @__PURE__ */ _interop_require_default(require_focus());
2945
- function _interop_require_default(obj) {
2946
- return obj && obj.__esModule ? obj : {
2947
- default: obj
2948
- };
2949
- }
2950
- var Link = class extends _element.default {
2951
- getHRef() {
2952
- return this.getAttribute("href");
2953
- }
2954
- setHRef(href) {
2955
- return this.setAttribute("href", href);
2956
- }
2957
- };
2958
- __publicField(Link, "tagName", "a");
2959
- Object.assign(Link.prototype, _focus.default);
2960
- });
2961
-
2962
- // lib/element/input.js
2963
- var require_input2 = __commonJS((exports) => {
2964
- "use strict";
2965
- Object.defineProperty(exports, "__esModule", {
2966
- value: true
2967
- });
2968
- Object.defineProperty(exports, "default", {
2969
- enumerable: true,
2970
- get: function() {
2971
- return Input;
2972
- }
2973
- });
2974
- var _element = /* @__PURE__ */ _interop_require_default(require_element3());
2975
- var _input = /* @__PURE__ */ _interop_require_default(require_input());
2976
- var _focus = /* @__PURE__ */ _interop_require_default(require_focus());
2977
- var _selection = /* @__PURE__ */ _interop_require_default(require_selection());
2978
- function _interop_require_default(obj) {
2979
- return obj && obj.__esModule ? obj : {
2980
- default: obj
2981
- };
2982
- }
2983
- var Input = class extends _element.default {
2984
- };
2985
- __publicField(Input, "tagName", "input");
2986
- Object.assign(Input.prototype, _input.default);
2987
- Object.assign(Input.prototype, _focus.default);
2988
- Object.assign(Input.prototype, _selection.default);
2989
- });
2990
-
2991
- // lib/element/button.js
2992
- var require_button = __commonJS((exports) => {
2993
- "use strict";
2994
- Object.defineProperty(exports, "__esModule", {
2995
- value: true
2996
- });
2997
- Object.defineProperty(exports, "default", {
2998
- enumerable: true,
2999
- get: function() {
3000
- return Button;
3001
- }
3002
- });
3003
- var _element = /* @__PURE__ */ _interop_require_default(require_element3());
3004
- var _focus = /* @__PURE__ */ _interop_require_default(require_focus());
3005
- function _interop_require_default(obj) {
3006
- return obj && obj.__esModule ? obj : {
3007
- default: obj
3008
- };
3009
- }
3010
- var Button = class extends _element.default {
3011
- };
3012
- __publicField(Button, "tagName", "button");
3013
- Object.assign(Button.prototype, _focus.default);
3014
- });
3015
-
3016
- // lib/element/select.js
3017
- var require_select = __commonJS((exports) => {
3018
- "use strict";
3019
- Object.defineProperty(exports, "__esModule", {
3020
- value: true
3021
- });
3022
- Object.defineProperty(exports, "default", {
3023
- enumerable: true,
3024
- get: function() {
3025
- return Select;
3026
- }
3027
- });
3028
- var _element = /* @__PURE__ */ _interop_require_default(require_element3());
3029
- var _input = /* @__PURE__ */ _interop_require_default(require_input());
3030
- var _focus = /* @__PURE__ */ _interop_require_default(require_focus());
3031
- function _interop_require_default(obj) {
3032
- return obj && obj.__esModule ? obj : {
3033
- default: obj
3034
- };
3035
- }
3036
- var Select = class extends _element.default {
3037
- };
3038
- __publicField(Select, "tagName", "select");
3039
- Object.assign(Select.prototype, _input.default);
3040
- Object.assign(Select.prototype, _focus.default);
3041
- });
3042
-
3043
- // lib/element/checkbox.js
3044
- var require_checkbox = __commonJS((exports) => {
3045
- "use strict";
3046
- Object.defineProperty(exports, "__esModule", {
3047
- value: true
3048
- });
3049
- Object.defineProperty(exports, "default", {
3050
- enumerable: true,
3051
- get: function() {
3052
- return Checkbox;
3053
- }
3054
- });
3055
- var _element = /* @__PURE__ */ _interop_require_default(require_element3());
3056
- var _input = /* @__PURE__ */ _interop_require_default(require_input());
3057
- var _focus = /* @__PURE__ */ _interop_require_default(require_focus());
3058
- function _interop_require_default(obj) {
3059
- return obj && obj.__esModule ? obj : {
3060
- default: obj
3061
- };
3062
- }
3063
- var Checkbox = class extends _element.default {
3064
- isChecked() {
3065
- return this.domElement.checked;
3066
- }
3067
- check(checked = true) {
3068
- this.domElement.checked = checked;
3069
- }
3070
- };
3071
- __publicField(Checkbox, "tagName", "input");
3072
- __publicField(Checkbox, "defaultProperties", {
3073
- type: "checkbox"
3074
- });
3075
- Object.assign(Checkbox.prototype, _input.default);
3076
- Object.assign(Checkbox.prototype, _focus.default);
3077
- });
3078
-
3079
- // lib/element/textarea.js
3080
- var require_textarea = __commonJS((exports) => {
3081
- "use strict";
3082
- Object.defineProperty(exports, "__esModule", {
3083
- value: true
3084
- });
3085
- Object.defineProperty(exports, "default", {
3086
- enumerable: true,
3087
- get: function() {
3088
- return Textarea;
3089
- }
3090
- });
3091
- var _element = /* @__PURE__ */ _interop_require_default(require_element3());
3092
- var _input = /* @__PURE__ */ _interop_require_default(require_input());
3093
- var _focus = /* @__PURE__ */ _interop_require_default(require_focus());
3094
- var _selection = /* @__PURE__ */ _interop_require_default(require_selection());
3095
- function _interop_require_default(obj) {
3096
- return obj && obj.__esModule ? obj : {
3097
- default: obj
3098
- };
3099
- }
3100
- var Textarea = class extends _element.default {
3101
- };
3102
- __publicField(Textarea, "tagName", "textarea");
3103
- Object.assign(Textarea.prototype, _input.default);
3104
- Object.assign(Textarea.prototype, _focus.default);
3105
- Object.assign(Textarea.prototype, _selection.default);
3106
- });
3107
-
3108
- // lib/index.js
3109
- var require_lib = __commonJS((exports) => {
3110
- "use strict";
3111
- Object.defineProperty(exports, "__esModule", {
3112
- value: true
3113
- });
3114
- function _export(target, all) {
3115
- for (var name in all)
3116
- Object.defineProperty(target, name, {
3117
- enumerable: true,
3118
- get: Object.getOwnPropertyDescriptor(all, name).get
3119
- });
3120
- }
3121
- _export(exports, {
3122
- get Body() {
3123
- return _body.default;
3124
- },
3125
- get Bounds() {
3126
- return _bounds.default;
3127
- },
3128
- get Button() {
3129
- return _button.default;
3130
- },
3131
- get Checkbox() {
3132
- return _checkbox.default;
3133
- },
3134
- get Element() {
3135
- return _element1.default;
3136
- },
3137
- get Input() {
3138
- return _input1.default;
3139
- },
3140
- get Link() {
3141
- return _link.default;
3142
- },
3143
- get Offset() {
3144
- return _offset.default;
3145
- },
3146
- get React() {
3147
- return _react.default;
3148
- },
3149
- get Select() {
3150
- return _select.default;
3151
- },
3152
- get TextElement() {
3153
- return _textElement.default;
3154
- },
3155
- get Textarea() {
3156
- return _textarea.default;
3157
- },
3158
- get customEventMixins() {
3159
- return _customEvent.default;
3160
- },
3161
- get document() {
3162
- return _document.default;
3163
- },
3164
- get elementUtilities() {
3165
- return _element.default;
3166
- },
3167
- get eventTypes() {
3168
- return _eventTypes.default;
3169
- },
3170
- get focusMixins() {
3171
- return _focus.default;
3172
- },
3173
- get inputMixins() {
3174
- return _input.default;
3175
- },
3176
- get mouseButtons() {
3177
- return _mouseButtons.default;
3178
- },
3179
- get selectionMixins() {
3180
- return _selection.default;
3181
- },
3182
- get window() {
3183
- return _window.default;
3184
- }
3185
- });
3186
- var _react = /* @__PURE__ */ _interop_require_default(require_react());
3187
- var _bounds = /* @__PURE__ */ _interop_require_default(require_bounds());
3188
- var _offset = /* @__PURE__ */ _interop_require_default(require_offset());
3189
- var _eventTypes = /* @__PURE__ */ _interop_require_default(require_eventTypes());
3190
- var _mouseButtons = /* @__PURE__ */ _interop_require_default(require_mouseButtons());
3191
- var _element = /* @__PURE__ */ _interop_require_default(require_element());
3192
- var _input = /* @__PURE__ */ _interop_require_default(require_input());
3193
- var _focus = /* @__PURE__ */ _interop_require_default(require_focus());
3194
- var _selection = /* @__PURE__ */ _interop_require_default(require_selection());
3195
- var _customEvent = /* @__PURE__ */ _interop_require_default(require_customEvent());
3196
- var _element1 = /* @__PURE__ */ _interop_require_default(require_element3());
3197
- var _textElement = /* @__PURE__ */ _interop_require_default(require_textElement());
3198
- var _document = /* @__PURE__ */ _interop_require_default(require_document());
3199
- var _window = /* @__PURE__ */ _interop_require_default(require_window());
3200
- var _body = /* @__PURE__ */ _interop_require_default(require_body());
3201
- var _link = /* @__PURE__ */ _interop_require_default(require_link());
3202
- var _input1 = /* @__PURE__ */ _interop_require_default(require_input2());
3203
- var _button = /* @__PURE__ */ _interop_require_default(require_button());
3204
- var _select = /* @__PURE__ */ _interop_require_default(require_select());
3205
- var _checkbox = /* @__PURE__ */ _interop_require_default(require_checkbox());
3206
- var _textarea = /* @__PURE__ */ _interop_require_default(require_textarea());
3207
- function _interop_require_default(obj) {
3208
- return obj && obj.__esModule ? obj : {
3209
- default: obj
3210
- };
3211
- }
3212
- });
3213
-
3214
- // lib/example/preamble.js
3215
- var require_preamble = __commonJS((exports) => {
3216
- "use strict";
3217
- Object.defineProperty(exports, "__esModule", {
3218
- value: true
3219
- });
3220
- var _index = require_lib();
3221
- Object.assign(globalThis, {
3222
- React: _index.React
3223
- });
3224
- });
3225
-
3226
- // lib/example/view/div.js
3227
- var require_div = __commonJS((exports) => {
3228
- "use strict";
3229
- Object.defineProperty(exports, "__esModule", {
3230
- value: true
3231
- });
3232
- Object.defineProperty(exports, "default", {
3233
- enumerable: true,
3234
- get: function() {
3235
- return Div;
3236
- }
3237
- });
3238
- var _index = require_lib();
3239
- var Div = class extends _index.Element {
3240
- mouseMoveHandler = (event, element) => {
3241
- const {pageX, pageY} = event;
3242
- console.log(pageX, pageY);
3243
- };
3244
- resizeHandler = (event, element) => {
3245
- const width = this.getWidth(), height = this.getHeight();
3246
- console.log(width, height);
3247
- };
3248
- didMount() {
3249
- this.onResize(this.resizeHandler, this);
3250
- this.onMouseMove(this.mouseMoveHandler, this);
3251
- }
3252
- willUnmount() {
3253
- this.offMouseMove(this.mouseMoveHandler, this);
3254
- this.offResize(this.resizeHandler, this);
3255
- }
3256
- childElements() {
3257
- return /* @__PURE__ */ React.createElement("p", null, "A paragraph contained in a div with resize and mouse move handlers.");
3258
- }
3259
- };
3260
- __publicField(Div, "tagName", "div");
3261
- });
3262
-
3263
- // lib/example/view.js
3264
- var require_view = __commonJS((exports) => {
3265
- "use strict";
3266
- Object.defineProperty(exports, "__esModule", {
3267
- value: true
3268
- });
3269
- Object.defineProperty(exports, "default", {
3270
- enumerable: true,
3271
- get: function() {
3272
- return View;
3273
- }
3274
- });
3275
- var _index = require_lib();
3276
- var _div = /* @__PURE__ */ _interop_require_default(require_div());
3277
- function _interop_require_default(obj) {
3278
- return obj && obj.__esModule ? obj : {
3279
- default: obj
3280
- };
3281
- }
3282
- var View = class extends _index.Element {
3283
- childElements() {
3284
- return /* @__PURE__ */ React.createElement(_div.default, null);
3285
- }
3286
- };
3287
- __publicField(View, "tagName", "div");
3288
- __publicField(View, "defaultProperties", {
3289
- className: "view"
3290
- });
3291
- });
3292
-
3293
- // lib/example.js
3294
- var require_example = __commonJS((exports) => {
3295
- "use strict";
3296
- Object.defineProperty(exports, "__esModule", {
3297
- value: true
3298
- });
3299
- require_preamble();
3300
- var _index = require_lib();
3301
- var _view = /* @__PURE__ */ _interop_require_default(require_view());
3302
- function _interop_require_default(obj) {
3303
- return obj && obj.__esModule ? obj : {
3304
- default: obj
3305
- };
3306
- }
3307
- var body = new _index.Body();
3308
- body.mount(/* @__PURE__ */ React.createElement(_view.default, null));
3309
- });
3310
- require_example();
3311
- })();
3312
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL29mZnNldC5qcyIsICJzcmMvYm91bmRzLmpzIiwgInNyYy91dGlsaXRpZXMvYXJyYXkuanMiLCAic3JjL2NvbnN0YW50cy5qcyIsICJzcmMvdXRpbGl0aWVzL29iamVjdC5qcyIsICJzcmMvdXRpbGl0aWVzL3N0cmluZy5qcyIsICJzcmMvdXRpbGl0aWVzL25hbWUuanMiLCAic3JjL3V0aWxpdGllcy9lbGVtZW50LmpzIiwgInNyYy91dGlsaXRpZXMvZG9tLmpzIiwgInNyYy9taXhpbnMvZWxlbWVudC5qcyIsICJzcmMvdGV4dEVsZW1lbnQuanMiLCAic3JjL3V0aWxpdGllcy9lbGVtZW50cy5qcyIsICJzcmMvZXZlbnRUeXBlcy5qcyIsICJzcmMvbWl4aW5zL2pzeC5qcyIsICJzcmMvbWl4aW5zL2tleS5qcyIsICJzcmMvbWl4aW5zL3N0YXRlLmpzIiwgInNyYy9taXhpbnMvZXZlbnQuanMiLCAic3JjL21peGlucy9tb3VzZS5qcyIsICJzcmMvbWl4aW5zL2NsaWNrLmpzIiwgInNyYy9taXhpbnMvdG91Y2guanMiLCAic3JjL21peGlucy9zY3JvbGwuanMiLCAic3JjL21peGlucy9yZXNpemUuanMiLCAic3JjL21peGlucy9mdWxsU2NyZWVuLmpzIiwgInNyYy91dGlsaXRpZXMvYXN5bmMuanMiLCAic3JjL21peGlucy9jdXN0b21FdmVudC5qcyIsICJzcmMvZWxlbWVudC5qcyIsICJzcmMvcmVhY3QuanMiLCAic3JjL21vdXNlQnV0dG9ucy5qcyIsICJzcmMvbWl4aW5zL2lucHV0LmpzIiwgInNyYy9taXhpbnMvZm9jdXMuanMiLCAic3JjL21peGlucy9zZWxlY3Rpb24uanMiLCAic3JjL2RvY3VtZW50LmpzIiwgInNyYy93aW5kb3cuanMiLCAic3JjL2VsZW1lbnQvYm9keS5qcyIsICJzcmMvZWxlbWVudC9saW5rLmpzIiwgInNyYy9lbGVtZW50L2lucHV0LmpzIiwgInNyYy9lbGVtZW50L2J1dHRvbi5qcyIsICJzcmMvZWxlbWVudC9zZWxlY3QuanMiLCAic3JjL2VsZW1lbnQvY2hlY2tib3guanMiLCAic3JjL2VsZW1lbnQvdGV4dGFyZWEuanMiLCAic3JjL2luZGV4LmpzIiwgInNyYy9leGFtcGxlL3ByZWFtYmxlLmpzIiwgInNyYy9leGFtcGxlL3ZpZXcvZGl2LmpzIiwgInNyYy9leGFtcGxlL3ZpZXcuanMiLCAic3JjL2V4YW1wbGUuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPZmZzZXQge1xuICBjb25zdHJ1Y3Rvcih0b3AsIGxlZnQpIHtcbiAgICB0aGlzLnRvcCA9IHRvcDtcbiAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuICB9XG5cbiAgZ2V0VG9wKCkge1xuICAgIHJldHVybiB0aGlzLnRvcDtcbiAgfVxuXG4gIGdldExlZnQoKSB7XG4gICAgcmV0dXJuIHRoaXMubGVmdDtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tRE9NRWxlbWVudChkb21FbGVtZW50KSB7XG4gICAgY29uc3QgeyBvZmZzZXRUb3AsIG9mZnNldExlZnQgfSA9IGRvbUVsZW1lbnQsXG4gICAgICAgICAgdG9wID0gb2Zmc2V0VG9wLCAgLy8vXG4gICAgICAgICAgbGVmdCA9IG9mZnNldExlZnQsICAvLy9cbiAgICAgICAgICBvZmZzZXQgPSBuZXcgT2Zmc2V0KHRvcCwgbGVmdCk7XG5cbiAgICByZXR1cm4gb2Zmc2V0O1xuICB9XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvdW5kcyB7XG4gIGNvbnN0cnVjdG9yKHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSkge1xuICAgIHRoaXMudG9wID0gdG9wO1xuICAgIHRoaXMubGVmdCA9IGxlZnQ7XG4gICAgdGhpcy5yaWdodCA9IHJpZ2h0O1xuICAgIHRoaXMuYm90dG9tID0gYm90dG9tO1xuICB9XG5cbiAgZ2V0VG9wKCkge1xuICAgIHJldHVybiB0aGlzLnRvcDtcbiAgfVxuXG4gIGdldExlZnQoKSB7XG4gICAgcmV0dXJuIHRoaXMubGVmdDtcbiAgfVxuXG4gIGdldFJpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzLnJpZ2h0O1xuICB9XG5cbiAgZ2V0Qm90dG9tKCkge1xuICAgIHJldHVybiB0aGlzLmJvdHRvbTtcbiAgfVxuXG4gIGdldFdpZHRoKCkge1xuICAgIGNvbnN0IHdpZHRoID0gKHRoaXMucmlnaHQgLSB0aGlzLmxlZnQpO1xuXG4gICAgcmV0dXJuIHdpZHRoO1xuICB9XG5cbiAgZ2V0SGVpZ2h0KCkge1xuICAgIGNvbnN0IGhlaWdodCA9ICh0aGlzLmJvdHRvbSAtIHRoaXMudG9wKTtcblxuICAgIHJldHVybiBoZWlnaHQ7XG4gIH1cbiAgXG4gIHNldFRvcCh0b3ApIHtcbiAgICB0aGlzLnRvcCA9IHRvcDtcbiAgfVxuXG4gIHNldExlZnQobGVmdCkge1xuICAgIHRoaXMubGVmdCA9IGxlZnQ7XG4gIH1cblxuICBzZXRSaWdodChyaWdodCkge1xuICAgIHRoaXMucmlnaHQgPSByaWdodDtcbiAgfVxuXG4gIHNldEJvdHRvbShib3R0b20pIHtcbiAgICB0aGlzLmJvdHRvbSA9IGJvdHRvbTtcbiAgfVxuXG4gIGFyZU92ZXJsYXBwaW5nKGJvdW5kcykge1xuICAgIGNvbnN0IGJvdHRvbSA9IGJvdW5kcy5nZXRCb3R0b20oKSxcbiAgICAgICAgICByaWdodCA9IGJvdW5kcy5nZXRSaWdodCgpLFxuICAgICAgICAgIGxlZnQgPSBib3VuZHMuZ2V0TGVmdCgpLFxuICAgICAgICAgIHRvcCA9IGJvdW5kcy5nZXRUb3AoKSxcbiAgICAgICAgICBvdmVybGFwcGluZyA9ICgodGhpcy50b3AgPCBib3R0b20pXG4gICAgICAgICAgICAgICAgICAgICAgJiYgKHRoaXMubGVmdCA8IHJpZ2h0KVxuICAgICAgICAgICAgICAgICAgICAgICYmICh0aGlzLnJpZ2h0ID4gbGVmdClcbiAgICAgICAgICAgICAgICAgICAgICAmJiAodGhpcy5ib3R0b20gPiB0b3ApKTtcblxuICAgIHJldHVybiBvdmVybGFwcGluZztcbiAgfVxuXG4gIGFyZU92ZXJsYXBwaW5nQnlUb3BBbmRMZWZ0KHRvcCwgbGVmdCkge1xuICAgIGNvbnN0IG92ZXJsYXBwaW5nID0gKCh0aGlzLnRvcCA8PSB0b3ApXG4gICAgICAgICAgICAgICAgICAgICAgJiYgKHRoaXMubGVmdCA8PSBsZWZ0KVxuICAgICAgICAgICAgICAgICAgICAgICYmICh0aGlzLnJpZ2h0ID4gbGVmdClcbiAgICAgICAgICAgICAgICAgICAgICAmJiAodGhpcy5ib3R0b20gPiB0b3ApKTtcblxuICAgIHJldHVybiBvdmVybGFwcGluZztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tRE9NRWxlbWVudChkb21FbGVtZW50KSB7XG4gICAgY29uc3QgeyBwYWdlWE9mZnNldCwgcGFnZVlPZmZzZXQgfSA9IHdpbmRvdyxcbiAgICAgICAgICBib3VuZGluZ0NsaWVudFJlY3QgPSBkb21FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgICAgIHdpbmRvd1Njcm9sbFRvcCA9IHBhZ2VZT2Zmc2V0LCAvLy9cbiAgICAgICAgICB3aW5kb3dTY3JvbGxMZWZ0ID0gcGFnZVhPZmZzZXQsICAvLy9cbiAgICAgICAgICB0b3AgPSBib3VuZGluZ0NsaWVudFJlY3QudG9wICsgd2luZG93U2Nyb2xsVG9wLFxuICAgICAgICAgIGxlZnQgPSBib3VuZGluZ0NsaWVudFJlY3QubGVmdCArIHdpbmRvd1Njcm9sbExlZnQsXG4gICAgICAgICAgcmlnaHQgPSBib3VuZGluZ0NsaWVudFJlY3QucmlnaHQgKyB3aW5kb3dTY3JvbGxMZWZ0LFxuICAgICAgICAgIGJvdHRvbSA9IGJvdW5kaW5nQ2xpZW50UmVjdC5ib3R0b20gKyB3aW5kb3dTY3JvbGxUb3AsXG4gICAgICAgICAgYm91bmRzID0gbmV3IEJvdW5kcyh0b3AsIGxlZnQsIHJpZ2h0LCBib3R0b20pO1xuXG4gICAgcmV0dXJuIGJvdW5kcztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tVG9wTGVmdFdpZHRoQW5kSGVpZ2h0KHRvcCwgbGVmdCwgd2lkdGgsIGhlaWdodCkge1xuICAgIGNvbnN0IGJvdHRvbSA9IHRvcCArIGhlaWdodCxcbiAgICAgICAgICByaWdodCA9IGxlZnQgKyB3aWR0aCxcbiAgICAgICAgICBib3VuZHMgPSBuZXcgQm91bmRzKHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSk7XG5cbiAgICByZXR1cm4gYm91bmRzO1xuICB9XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXJzdChhcnJheSkgeyByZXR1cm4gYXJyYXlbMF07IH1cblxuZXhwb3J0IGZ1bmN0aW9uIHB1c2goYXJyYXkxLCBhcnJheTIpIHsgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoYXJyYXkxLCBhcnJheTIpOyB9XG5cbmV4cG9ydCBmdW5jdGlvbiBhdWdtZW50KGFycmF5MSwgYXJyYXkyLCB0ZXN0KSB7XG4gIGFycmF5MSA9IFsgLi4uYXJyYXkxIF07IC8vL1xuXG4gIGFycmF5Mi5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHBhc3NlZCA9IHRlc3QoZWxlbWVudCwgaW5kZXgpO1xuXG4gICAgaWYgKHBhc3NlZCkge1xuICAgICAgYXJyYXkxLnB1c2goZWxlbWVudCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gYXJyYXkxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbihhcnJheSkge1xuICByZXR1cm4gYXJyYXkucmVkdWNlKChhcnJheSwgZWxlbWVudCkgPT4ge1xuICAgIGFycmF5ID0gYXJyYXkuY29uY2F0KGVsZW1lbnQpOyAgLy8vXG5cbiAgICByZXR1cm4gYXJyYXk7XG4gIH0sIFtdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGd1YXJhbnRlZShhcnJheU9yRWxlbWVudCkge1xuICBhcnJheU9yRWxlbWVudCA9IGFycmF5T3JFbGVtZW50IHx8IFtdO1xuXG4gIHJldHVybiAoYXJyYXlPckVsZW1lbnQgaW5zdGFuY2VvZiBBcnJheSkgP1xuICAgICAgICAgICAgYXJyYXlPckVsZW1lbnQgOlxuICAgICAgICAgICAgICBbYXJyYXlPckVsZW1lbnRdO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnQgY29uc3QgRk9SID0gXCJmb3JcIjtcbmV4cG9ydCBjb25zdCBCT0RZID0gXCJib2R5XCI7XG5leHBvcnQgY29uc3QgTk9ORSA9IFwibm9uZVwiO1xuZXhwb3J0IGNvbnN0IFNQQUNFID0gXCIgXCI7XG5leHBvcnQgY29uc3QgQ0xBU1MgPSBcImNsYXNzXCI7XG5leHBvcnQgY29uc3QgV0lEVEggPSBcIndpZHRoXCI7XG5leHBvcnQgY29uc3QgQkxPQ0sgPSBcImJsb2NrXCI7XG5leHBvcnQgY29uc3QgSEVJR0hUID0gXCJoZWlnaHRcIjtcbmV4cG9ydCBjb25zdCBPQkpFQ1QgPSBcIm9iamVjdFwiO1xuZXhwb3J0IGNvbnN0IFNUUklORyA9IFwic3RyaW5nXCI7XG5leHBvcnQgY29uc3QgRElTUExBWSA9IFwiZGlzcGxheVwiO1xuZXhwb3J0IGNvbnN0IEJPT0xFQU4gPSBcImJvb2xlYW5cIjtcbmV4cG9ydCBjb25zdCBESVNBQkxFRCA9IFwiZGlzYWJsZWRcIjtcbmV4cG9ydCBjb25zdCBGVU5DVElPTiA9IFwiZnVuY3Rpb25cIjtcbmV4cG9ydCBjb25zdCBXSUxEQ0FSRCA9IFwiKlwiO1xuZXhwb3J0IGNvbnN0IEhUTUxfRk9SID0gXCJodG1sRm9yXCI7XG5leHBvcnQgY29uc3QgVU5ERUZJTkVEID0gJ3VuZGVmaW5lZCc7XG5leHBvcnQgY29uc3QgQ0xBU1NfTkFNRSA9IFwiY2xhc3NOYW1lXCI7XG5leHBvcnQgY29uc3QgRU1QVFlfU1RSSU5HID0gXCJcIjtcbmV4cG9ydCBjb25zdCBTVkdfTkFNRVNQQUNFX1VSSSA9IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIjtcbmV4cG9ydCBjb25zdCBERUZBVUxUX1BST1BFUlRJRVMgPSBcImRlZmF1bHRQcm9wZXJ0aWVzXCI7XG5leHBvcnQgY29uc3QgSUdOT1JFRF9QUk9QRVJUSUVTID0gXCJpZ25vcmVkUHJvcGVydGllc1wiO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBCT09MRUFOIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZSh0YXJnZXQsIHNvdXJjZSA9IHt9KSB7XG4gIHRhcmdldCA9IHsgIC8vL1xuICAgIC4uLnRhcmdldFxuICB9O1xuXG4gIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXMoc291cmNlKTsgIC8vL1xuXG4gIG5hbWVzLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICBjb25zdCB0YXJnZXRWYWx1ZSA9IHRhcmdldFtuYW1lXSxcbiAgICAgICAgICBzb3VyY2VWYWx1ZSA9IHNvdXJjZVtuYW1lXSxcbiAgICAgICAgICB0YXJnZXRIYXNPd25Qcm9wZXJ0eSA9IHRhcmdldC5oYXNPd25Qcm9wZXJ0eShuYW1lKTtcblxuICAgIHRhcmdldFtuYW1lXSA9IHRhcmdldEhhc093blByb3BlcnR5ID9cbiAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVWYWx1ZXModGFyZ2V0VmFsdWUsIHNvdXJjZVZhbHVlKSA6XG4gICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVZhbHVlOyAvLy9cbiAgfSk7XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBydW5lKHRhcmdldCwgbmFtZXMgPSBbXSkge1xuICB0YXJnZXQgPSB7ICAvLy9cbiAgICAuLi50YXJnZXRcbiAgfTtcblxuICBuYW1lcy5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0SGFzT3duUHJvcGVydHkgPSB0YXJnZXQuaGFzT3duUHJvcGVydHkobmFtZSk7XG5cbiAgICBpZiAodGFyZ2V0SGFzT3duUHJvcGVydHkpIHtcbiAgICAgIGRlbGV0ZSB0YXJnZXRbbmFtZV07XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBjb21iaW5lVmFsdWVzKHRhcmdldFZhbHVlLCBzb3VyY2VWYWx1ZSkge1xuICBjb25zdCB0YXJnZXRWYWx1ZUJvb2xlYW4gPSBpc1ZhbHVlQm9vbGVhbih0YXJnZXRWYWx1ZSksXG4gICAgICAgIHNvdXJjZVZhbHVlQm9vbGVhbiA9IGlzVmFsdWVCb29sZWFuKHNvdXJjZVZhbHVlKSxcbiAgICAgICAgY29tYmluZWRWYWx1ZSA9ICh0YXJnZXRWYWx1ZUJvb2xlYW4gJiYgc291cmNlVmFsdWVCb29sZWFuKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFZhbHVlIDogLy8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGFyZ2V0VmFsdWV9ICR7c291cmNlVmFsdWV9YDtcblxuICByZXR1cm4gY29tYmluZWRWYWx1ZTtcbn1cblxuZnVuY3Rpb24gaXNWYWx1ZUJvb2xlYW4odmFsdWUpIHtcbiAgY29uc3QgdmFsdWVCb29sZWFuID0gKHR5cGVvZiB2YWx1ZSA9PT0gQk9PTEVBTik7XG5cbiAgcmV0dXJuIHZhbHVlQm9vbGVhbjtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNhbWVsQ2FzZVRvU25ha2VDYXNlKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyhbQS1aXSspL2csIChtYXRjaCwgY2hhcmFjdGVycykgPT4ge1xuICAgIGNvbnN0IHVwcGVyQ2FzZUNoYXJhY3RlcnMgPSBjaGFyYWN0ZXJzLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgc25ha2VDYXNlQ2hhcmFjdGVycyA9IGAtJHt1cHBlckNhc2VDaGFyYWN0ZXJzfWA7XG5cbiAgICByZXR1cm4gc25ha2VDYXNlQ2hhcmFjdGVycztcbiAgfSk7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NWR1RhZ05hbWUodGFnTmFtZSkge1xuICByZXR1cm4gc3ZnVGFnTmFtZXMuaW5jbHVkZXModGFnTmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NWR0F0dHJpYnV0ZU5hbWUoYXR0cmlidXRlTmFtZSkge1xuICByZXR1cm4gc3ZnQXR0cmlidXRlTmFtZXMuaW5jbHVkZXMoYXR0cmlidXRlTmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hUTUxBdHRyaWJ1dGVOYW1lKGF0dHJpYnV0ZU5hbWUpIHtcbiAgcmV0dXJuIGh0bWxBdHRyaWJ1dGVOYW1lcy5pbmNsdWRlcyhhdHRyaWJ1dGVOYW1lKTtcbn1cblxuY29uc3Qgc3ZnVGFnTmFtZXMgPSBbXG4gICAgICAgIFwiYWx0R2x5cGhcIiwgXCJhbmltYXRlXCIsIFwiYW5pbWF0ZUNvbG9yXCIsIFwiYW5pbWF0ZU1vdGlvblwiLCBcImFuaW1hdGVUcmFuc2Zvcm1cIiwgXCJhbmltYXRpb25cIiwgXCJhdWRpb1wiLFxuICAgICAgICBcImNpcmNsZVwiLCBcImNsaXBQYXRoXCIsIFwiY29sb3ItcHJvZmlsZVwiLCBcImN1cnNvclwiLFxuICAgICAgICBcImRlZnNcIiwgXCJkZXNjXCIsIFwiZGlzY2FyZFwiLFxuICAgICAgICBcImVsbGlwc2VcIixcbiAgICAgICAgXCJmZUJsZW5kXCIsIFwiZmVDb2xvck1hdHJpeFwiLCBcImZlQ29tcG9uZW50VHJhbnNmZXJcIiwgXCJmZUNvbXBvc2l0ZVwiLCBcImZlQ29udm9sdmVNYXRyaXhcIiwgXCJmZURpZmZ1c2VMaWdodGluZ1wiLCBcImZlRGlzcGxhY2VtZW50TWFwXCIsIFwiZmVEaXN0YW50TGlnaHRcIiwgXCJmZURyb3BTaGFkb3dcIiwgXCJmZUZsb29kXCIsIFwiZmVGdW5jQVwiLCBcImZlRnVuY0JcIiwgXCJmZUZ1bmNHXCIsIFwiZmVGdW5jUlwiLCBcImZlR2F1c3NpYW5CbHVyXCIsIFwiZmVJbWFnZVwiLCBcImZlTWVyZ2VcIiwgXCJmZU1lcmdlTm9kZVwiLCBcImZlTW9ycGhvbG9neVwiLCBcImZlT2Zmc2V0XCIsIFwiZmVQb2ludExpZ2h0XCIsIFwiZmVTcGVjdWxhckxpZ2h0aW5nXCIsIFwiZmVTcG90TGlnaHRcIiwgXCJmZVRpbGVcIiwgXCJmZVR1cmJ1bGVuY2VcIiwgXCJmaWx0ZXJcIiwgXCJmb250XCIsIFwiZm9udC1mYWNlXCIsIFwiZm9udC1mYWNlLWZvcm1hdFwiLCBcImZvbnQtZmFjZS1uYW1lXCIsIFwiZm9udC1mYWNlLXVyaVwiLCBcImZvcmVpZ25PYmplY3RcIixcbiAgICAgICAgXCJnXCIsIFwiZ2x5cGhcIiwgXCJnbHlwaFJlZlwiLFxuICAgICAgICBcImhhbmRsZXJcIiwgXCJoYXRjaFwiLCBcImhhdGNocGF0aFwiLCBcImhrZXJuXCIsXG4gICAgICAgIFwiaW1hZ2VcIiwgXCJsaW5lXCIsIFwibGluZWFyR3JhZGllbnRcIixcbiAgICAgICAgXCJsaXN0ZW5lclwiLFxuICAgICAgICBcIm1hcmtlclwiLCBcIm1hc2tcIiwgXCJtZXNoXCIsIFwibWVzaGdyYWRpZW50XCIsIFwibWVzaHBhdGNoXCIsIFwibWVzaHJvd1wiLCBcIm1ldGFkYXRhXCIsIFwibWlzc2luZy1nbHlwaFwiLCBcIm1wYXRoXCIsXG4gICAgICAgIFwicGF0aFwiLCBcInBhdHRlcm5cIiwgXCJwb2x5Z29uXCIsIFwicG9seWxpbmVcIiwgXCJwcmVmZXRjaFwiLFxuICAgICAgICBcInJhZGlhbEdyYWRpZW50XCIsIFwicmVjdFwiLFxuICAgICAgICBcInNjcmlwdFwiLCBcInNldFwiLCBcInNvbGlkY29sb3JcIiwgXCJzdG9wXCIsIFwic3R5bGVcIiwgXCJzdmdcIiwgXCJzd2l0Y2hcIiwgXCJzeW1ib2xcIixcbiAgICAgICAgXCJ0YnJlYWtcIiwgXCJ0ZXh0XCIsIFwidGV4dEFyZWFcIiwgXCJ0ZXh0UGF0aFwiLCBcInRpdGxlXCIsIFwidHJlZlwiLCBcInRzcGFuXCIsXG4gICAgICAgIFwidW5rbm93blwiLCBcInVzZVwiLFxuICAgICAgICBcInZpZGVvXCIsIFwidmlld1wiLCBcInZrZXJuXCJcbiAgICAgIF0sXG4gICAgICBzdmdBdHRyaWJ1dGVOYW1lcyA9IFtcbiAgICAgICAgXCJhY2NlbnQtaGVpZ2h0XCIsIFwiYWNjdW11bGF0ZVwiLCBcImFkZGl0aXZlXCIsIFwiYWxpZ25tZW50LWJhc2VsaW5lXCIsIFwiYWxwaGFiZXRpY1wiLCBcImFtcGxpdHVkZVwiLCBcImFyYWJpYy1mb3JtXCIsIFwiYXNjZW50XCIsIFwiYXR0cmlidXRlTmFtZVwiLCBcImF0dHJpYnV0ZVR5cGVcIiwgXCJhemltdXRoXCIsXG4gICAgICAgIFwiYmFuZHdpZHRoXCIsIFwiYmFzZUZyZXF1ZW5jeVwiLCBcImJhc2VQcm9maWxlXCIsIFwiYmFzZWxpbmUtc2hpZnRcIiwgXCJiYm94XCIsIFwiYmVnaW5cIiwgXCJiaWFzXCIsIFwiYnlcIixcbiAgICAgICAgXCJjYWxjTW9kZVwiLCBcImNhcC1oZWlnaHRcIiwgXCJjbGlwXCIsIFwiY2xhc3NOYW1lXCIsIFwiY2xpcC1wYXRoXCIsIFwiY2xpcC1ydWxlXCIsIFwiY2xpcFBhdGhVbml0c1wiLCBcImNvbG9yXCIsIFwiY29sb3ItaW50ZXJwb2xhdGlvblwiLCBcImNvbG9yLWludGVycG9sYXRpb24tZmlsdGVyc1wiLCBcImNvbG9yLXByb2ZpbGVcIiwgXCJjb2xvci1yZW5kZXJpbmdcIiwgXCJjb250ZW50U2NyaXB0VHlwZVwiLCBcImNvbnRlbnRTdHlsZVR5cGVcIiwgXCJjcm9zc29yaWdpblwiLCBcImN1cnNvclwiLCBcImN4XCIsIFwiY3lcIixcbiAgICAgICAgXCJkXCIsIFwiZGVmYXVsdEFjdGlvblwiLCBcImRlc2NlbnRcIiwgXCJkaWZmdXNlQ29uc3RhbnRcIiwgXCJkaXJlY3Rpb25cIiwgXCJkaXNwbGF5XCIsIFwiZGl2aXNvclwiLCBcImRvbWluYW50LWJhc2VsaW5lXCIsIFwiZG93bmxvYWRcIiwgXCJkdXJcIiwgXCJkeFwiLCBcImR5XCIsXG4gICAgICAgIFwiZWRnZU1vZGVcIiwgXCJlZGl0YWJsZVwiLCBcImVsZXZhdGlvblwiLCBcImVuYWJsZS1iYWNrZ3JvdW5kXCIsIFwiZW5kXCIsIFwiZXZlbnRcIiwgXCJleHBvbmVudFwiLCBcImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcIixcbiAgICAgICAgXCJmaWxsXCIsIFwiZmlsbC1vcGFjaXR5XCIsIFwiZmlsbC1ydWxlXCIsIFwiZmlsdGVyXCIsIFwiZmlsdGVyUmVzXCIsIFwiZmlsdGVyVW5pdHNcIiwgXCJmbG9vZC1jb2xvclwiLCBcImZsb29kLW9wYWNpdHlcIiwgXCJmb2N1c0hpZ2hsaWdodFwiLCBcImZvY3VzYWJsZVwiLCBcImZvbnQtZmFtaWx5XCIsIFwiZm9udC1zaXplXCIsIFwiZm9udC1zaXplLWFkanVzdFwiLCBcImZvbnQtc3RyZXRjaFwiLCBcImZvbnQtc3R5bGVcIiwgXCJmb250LXZhcmlhbnRcIiwgXCJmb250LXdlaWdodFwiLCBcImZvcm1hdFwiLCBcImZyXCIsIFwiZnJvbVwiLCBcImZ4XCIsIFwiZnlcIixcbiAgICAgICAgXCJnMVwiLCBcImcyXCIsIFwiZ2x5cGgtbmFtZVwiLCBcImdseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWxcIiwgXCJnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbFwiLCBcImdseXBoUmVmXCIsIFwiZ3JhZGllbnRUcmFuc2Zvcm1cIiwgXCJncmFkaWVudFVuaXRzXCIsXG4gICAgICAgIFwiaGFuZGxlclwiLCBcImhhbmdpbmdcIiwgXCJoYXRjaENvbnRlbnRVbml0c1wiLCBcImhhdGNoVW5pdHNcIiwgXCJoZWlnaHRcIiwgXCJob3Jpei1hZHYteFwiLCBcImhvcml6LW9yaWdpbi14XCIsIFwiaG9yaXotb3JpZ2luLXlcIiwgXCJocmVmXCIsIFwiaHJlZmxhbmdcIixcbiAgICAgICAgXCJpZFwiLCBcImlkZW9ncmFwaGljXCIsIFwiaW1hZ2UtcmVuZGVyaW5nXCIsIFwiaW5cIiwgXCJpbjJcIiwgXCJpbml0aWFsVmlzaWJpbGl0eVwiLCBcImludGVyY2VwdFwiLFxuICAgICAgICBcImtcIiwgXCJrMVwiLCBcImsyXCIsIFwiazNcIiwgXCJrNFwiLCBcImtlcm5lbE1hdHJpeFwiLCBcImtlcm5lbFVuaXRMZW5ndGhcIiwgXCJrZXJuaW5nXCIsIFwia2V5UG9pbnRzXCIsIFwia2V5U3BsaW5lc1wiLCBcImtleVRpbWVzXCIsXG4gICAgICAgIFwibGVuZ3RoQWRqdXN0XCIsIFwibGV0dGVyLXNwYWNpbmdcIiwgXCJsaWdodGluZy1jb2xvclwiLCBcImxpbWl0aW5nQ29uZUFuZ2xlXCIsIFwibG9jYWxcIixcbiAgICAgICAgXCJtYXJrZXItZW5kXCIsIFwibWFya2VyLW1pZFwiLCBcIm1hcmtlci1zdGFydFwiLCBcIm1hcmtlckhlaWdodFwiLCBcIm1hcmtlclVuaXRzXCIsIFwibWFya2VyV2lkdGhcIiwgXCJtYXNrXCIsIFwibWFza0NvbnRlbnRVbml0c1wiLCBcIm1hc2tVbml0c1wiLCBcIm1hdGhlbWF0aWNhbFwiLCBcIm1heFwiLCBcIm1lZGlhXCIsIFwibWVkaWFDaGFyYWN0ZXJFbmNvZGluZ1wiLCBcIm1lZGlhQ29udGVudEVuY29kaW5nc1wiLCBcIm1lZGlhU2l6ZVwiLCBcIm1lZGlhVGltZVwiLCBcIm1ldGhvZFwiLCBcIm1pblwiLCBcIm1vZGVcIixcbiAgICAgICAgXCJuYW1lXCIsIFwibmF2LWRvd25cIiwgXCJuYXYtZG93bi1sZWZ0XCIsIFwibmF2LWRvd24tcmlnaHRcIiwgXCJuYXYtbGVmdFwiLCBcIm5hdi1uZXh0XCIsIFwibmF2LXByZXZcIiwgXCJuYXYtcmlnaHRcIiwgXCJuYXYtdXBcIiwgXCJuYXYtdXAtbGVmdFwiLCBcIm5hdi11cC1yaWdodFwiLCBcIm51bU9jdGF2ZXNcIixcbiAgICAgICAgXCJvYnNlcnZlclwiLCBcIm9mZnNldFwiLCBcIm9wYWNpdHlcIiwgXCJvcGVyYXRvclwiLCBcIm9yZGVyXCIsIFwib3JpZW50XCIsIFwib3JpZW50YXRpb25cIiwgXCJvcmlnaW5cIiwgXCJvdmVyZmxvd1wiLCBcIm92ZXJsYXlcIiwgXCJvdmVybGluZS1wb3NpdGlvblwiLCBcIm92ZXJsaW5lLXRoaWNrbmVzc1wiLFxuICAgICAgICBcInBhbm9zZS0xXCIsIFwicGF0aFwiLCBcInBhdGhMZW5ndGhcIiwgXCJwYXR0ZXJuQ29udGVudFVuaXRzXCIsIFwicGF0dGVyblRyYW5zZm9ybVwiLCBcInBhdHRlcm5Vbml0c1wiLCBcInBoYXNlXCIsIFwicGl0Y2hcIiwgXCJwbGF5YmFja09yZGVyXCIsIFwicGxheWJhY2tvcmRlclwiLCBcInBvaW50ZXItZXZlbnRzXCIsIFwicG9pbnRzXCIsIFwicG9pbnRzQXRYXCIsIFwicG9pbnRzQXRZXCIsIFwicG9pbnRzQXRaXCIsIFwicHJlc2VydmVBbHBoYVwiLCBcInByZXNlcnZlQXNwZWN0UmF0aW9cIiwgXCJwcmltaXRpdmVVbml0c1wiLCBcInByb3BhZ2F0ZVwiLFxuICAgICAgICBcInJcIiwgXCJyYWRpdXNcIiwgXCJyZWZYXCIsIFwicmVmWVwiLCBcInJlbmRlcmluZy1pbnRlbnRcIiwgXCJyZXBlYXRDb3VudFwiLCBcInJlcGVhdER1clwiLCBcInJlcXVpcmVkRXh0ZW5zaW9uc1wiLCBcInJlcXVpcmVkRmVhdHVyZXNcIiwgXCJyZXF1aXJlZEZvbnRzXCIsIFwicmVxdWlyZWRGb3JtYXRzXCIsIFwicmVzdGFydFwiLCBcInJlc3VsdFwiLCBcInJvdGF0ZVwiLCBcInJ4XCIsIFwicnlcIixcbiAgICAgICAgXCJzY2FsZVwiLCBcInNlZWRcIiwgXCJzaGFwZS1yZW5kZXJpbmdcIiwgXCJzaWRlXCIsIFwic2xvcGVcIiwgXCJzbmFwc2hvdFRpbWVcIiwgXCJzcGFjaW5nXCIsIFwic3BlY3VsYXJDb25zdGFudFwiLCBcInNwZWN1bGFyRXhwb25lbnRcIiwgXCJzcHJlYWRNZXRob2RcIiwgXCJzcmNcIiwgXCJzdGFydE9mZnNldFwiLCBcInN0ZERldmlhdGlvblwiLCBcInN0ZW1oXCIsIFwic3RlbXZcIiwgXCJzdGl0Y2hUaWxlc1wiLCBcInN0b3AtY29sb3JcIiwgXCJzdG9wLW9wYWNpdHlcIiwgXCJzdHJpa2V0aHJvdWdoLXBvc2l0aW9uXCIsIFwic3RyaWtldGhyb3VnaC10aGlja25lc3NcIiwgXCJzdHJpbmdcIiwgXCJzdHJva2VcIiwgXCJzdHJva2UtZGFzaGFycmF5XCIsIFwic3Ryb2tlLWRhc2hvZmZzZXRcIiwgXCJzdHJva2UtbGluZWNhcFwiLCBcInN0cm9rZS1saW5lam9pblwiLCBcInN0cm9rZS1taXRlcmxpbWl0XCIsIFwic3Ryb2tlLW9wYWNpdHlcIiwgXCJzdHJva2Utd2lkdGhcIiwgXCJzdHlsZVwiLCBcInN1cmZhY2VTY2FsZVwiLCBcInN5bmNCZWhhdmlvclwiLCBcInN5bmNCZWhhdmlvckRlZmF1bHRcIiwgXCJzeW5jTWFzdGVyXCIsIFwic3luY1RvbGVyYW5jZVwiLCBcInN5bmNUb2xlcmFuY2VEZWZhdWx0XCIsIFwic3lzdGVtTGFuZ3VhZ2VcIixcbiAgICAgICAgXCJ0YWJsZVZhbHVlc1wiLCBcInRhcmdldFwiLCBcInRhcmdldFhcIiwgXCJ0YXJnZXRZXCIsIFwidGV4dC1hbmNob3JcIiwgXCJ0ZXh0LWRlY29yYXRpb25cIiwgXCJ0ZXh0LXJlbmRlcmluZ1wiLCBcInRleHRMZW5ndGhcIiwgXCJ0aW1lbGluZUJlZ2luXCIsIFwidGltZWxpbmViZWdpblwiLCBcInRpdGxlXCIsIFwidG9cIiwgXCJ0cmFuc2Zvcm1cIiwgXCJ0cmFuc2Zvcm1CZWhhdmlvclwiLCBcInR5cGVcIixcbiAgICAgICAgXCJ1MVwiLCBcInUyXCIsIFwidW5kZXJsaW5lLXBvc2l0aW9uXCIsIFwidW5kZXJsaW5lLXRoaWNrbmVzc1wiLCBcInVuaWNvZGVcIiwgXCJ1bmljb2RlLWJpZGlcIiwgXCJ1bmljb2RlLXJhbmdlXCIsIFwidW5pdHMtcGVyLWVtXCIsXG4gICAgICAgIFwidi1hbHBoYWJldGljXCIsIFwidi1oYW5naW5nXCIsIFwidi1pZGVvZ3JhcGhpY1wiLCBcInYtbWF0aGVtYXRpY2FsXCIsIFwidmFsdWVzXCIsIFwidmVyc2lvblwiLCBcInZlcnQtYWR2LXlcIiwgXCJ2ZXJ0LW9yaWdpbi14XCIsIFwidmVydC1vcmlnaW4teVwiLCBcInZpZXdCb3hcIiwgXCJ2aWV3VGFyZ2V0XCIsIFwidmlzaWJpbGl0eVwiLFxuICAgICAgICBcIndpZHRoXCIsIFwid2lkdGhzXCIsIFwid29yZC1zcGFjaW5nXCIsIFwid3JpdGluZy1tb2RlXCIsXG4gICAgICAgIFwieFwiLCBcIngtaGVpZ2h0XCIsIFwieDFcIiwgXCJ4MlwiLCBcInhDaGFubmVsU2VsZWN0b3JcIixcbiAgICAgICAgXCJ5XCIsIFwieTFcIiwgXCJ5MlwiLCBcInlDaGFubmVsU2VsZWN0b3JcIixcbiAgICAgICAgXCJ6XCIsIFwiem9vbUFuZFBhblwiXG4gICAgICBdLFxuICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzID0gW1xuICAgICAgICBcImFjY2VwdFwiLCBcImFjY2VwdENoYXJzZXRcIiwgXCJhY2Nlc3NLZXlcIiwgXCJhY3Rpb25cIiwgXCJhbGxvd1wiLCBcImFsbG93RnVsbFNjcmVlblwiLCBcImFsbG93VHJhbnNwYXJlbmN5XCIsIFwiYWx0XCIsIFwiYXN5bmNcIiwgXCJhdXRvQ29tcGxldGVcIiwgXCJhdXRvRm9jdXNcIiwgXCJhdXRvUGxheVwiLFxuICAgICAgICBcImNhcHR1cmVcIiwgXCJjZWxsUGFkZGluZ1wiLCBcImNlbGxTcGFjaW5nXCIsIFwiY2hhbGxlbmdlXCIsIFwiY2hhclNldFwiLCBcImNoZWNrZWRcIiwgXCJjaXRlXCIsIFwiY2xhc3NJRFwiLCBcImNsYXNzTmFtZVwiLCBcImNvbFNwYW5cIiwgXCJjb2xzXCIsIFwiY29udGVudFwiLCBcImNvbnRlbnRFZGl0YWJsZVwiLCBcImNvbnRleHRNZW51XCIsIFwiY29udHJvbHNcIiwgXCJjb29yZHNcIiwgXCJjcm9zc09yaWdpblwiLFxuICAgICAgICBcImRhdGFcIiwgXCJkYXRlVGltZVwiLCBcImRlZmF1bHRcIiwgXCJkZWZlclwiLCBcImRpclwiLCBcImRpc2FibGVkXCIsIFwiZG93bmxvYWRcIiwgXCJkcmFnZ2FibGVcIixcbiAgICAgICAgXCJlbmNUeXBlXCIsXG4gICAgICAgIFwiZm9ybVwiLCBcImZvcm1BY3Rpb25cIiwgXCJmb3JtRW5jVHlwZVwiLCBcImZvcm1NZXRob2RcIiwgXCJmb3JtTm9WYWxpZGF0ZVwiLCBcImZvcm1UYXJnZXRcIiwgXCJmcmFtZUJvcmRlclwiLFxuICAgICAgICBcImhlYWRlcnNcIiwgXCJoZWlnaHRcIiwgXCJoaWRkZW5cIiwgXCJoaWdoXCIsIFwiaHJlZlwiLCBcImhyZWZMYW5nXCIsIFwiaHRtbEZvclwiLCBcImh0dHBFcXVpdlwiLFxuICAgICAgICBcImljb25cIiwgXCJpZFwiLCBcImlucHV0TW9kZVwiLCBcImludGVncml0eVwiLCBcImlzXCIsXG4gICAgICAgIFwia2V5UGFyYW1zXCIsIFwia2V5VHlwZVwiLCBcImtpbmRcIixcbiAgICAgICAgXCJsYWJlbFwiLCBcImxhbmdcIiwgXCJsaXN0XCIsIFwibG9vcFwiLCBcImxvd1wiLFxuICAgICAgICBcIm1hbmlmZXN0XCIsIFwibWFyZ2luSGVpZ2h0XCIsIFwibWFyZ2luV2lkdGhcIiwgXCJtYXhcIiwgXCJtYXhMZW5ndGhcIiwgXCJtZWRpYVwiLCBcIm1lZGlhR3JvdXBcIiwgXCJtZXRob2RcIiwgXCJtaW5cIiwgXCJtaW5MZW5ndGhcIiwgXCJtdWx0aXBsZVwiLCBcIm11dGVkXCIsXG4gICAgICAgIFwibmFtZVwiLCBcIm5vVmFsaWRhdGVcIiwgXCJub25jZVwiLFxuICAgICAgICBcIm9wZW5cIiwgXCJvcHRpbXVtXCIsXG4gICAgICAgIFwicGF0dGVyblwiLCBcInBsYWNlaG9sZGVyXCIsIFwicG9zdGVyXCIsIFwicHJlbG9hZFwiLCBcInByb2ZpbGVcIixcbiAgICAgICAgXCJyYWRpb0dyb3VwXCIsIFwicmVhZE9ubHlcIiwgXCJyZWxcIiwgXCJyZXF1aXJlZFwiLCBcInJldmVyc2VkXCIsIFwicm9sZVwiLCBcInJvd1NwYW5cIiwgXCJyb3dzXCIsXG4gICAgICAgIFwic2FuZGJveFwiLCBcInNjb3BlXCIsIFwic2NvcGVkXCIsIFwic2Nyb2xsaW5nXCIsIFwic2VhbWxlc3NcIiwgXCJzZWxlY3RlZFwiLCBcInNoYXBlXCIsIFwic2l6ZVwiLCBcInNpemVzXCIsIFwic3BhblwiLCBcInNwZWxsQ2hlY2tcIiwgXCJzcmNcIiwgXCJzcmNEb2NcIiwgXCJzcmNMYW5nXCIsIFwic3JjU2V0XCIsIFwic3RhcnRcIiwgXCJzdGVwXCIsIFwic3R5bGVcIiwgXCJzdW1tYXJ5XCIsXG4gICAgICAgIFwidGFiSW5kZXhcIiwgXCJ0YXJnZXRcIiwgXCJ0aXRsZVwiLCBcInR5cGVcIixcbiAgICAgICAgXCJ1c2VNYXBcIixcbiAgICAgICAgXCJ2YWx1ZVwiLFxuICAgICAgICBcIndpZHRoXCIsXG4gICAgICAgIFwid21vZGVcIixcbiAgICAgICAgXCJ3cmFwXCJcbiAgICAgIF07XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25zdHJ1Y3RFbGVtZW50KGVsZW1lbnQsIGRvbUVsZW1lbnQpIHtcbiAgZWxlbWVudC5kb21FbGVtZW50ID0gZG9tRWxlbWVudDtcblxuICBkb21FbGVtZW50Ll9fZWxlbWVudF9fID0gZWxlbWVudDsgLy8vXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXN0cm95RWxlbWVudChlbGVtZW50KSB7XG4gIGNvbnN0IGRlc2NlbmRhbnRFbGVtZW50cyA9IGVsZW1lbnQuZ2V0RGVzY2VuZGFudEVsZW1lbnRzKCksXG4gICAgICAgIGVsZW1lbnRzID0gW1xuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgLi4uZGVzY2VuZGFudEVsZW1lbnRzXG4gICAgICAgIF07XG5cbiAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGRvbUVsZW1lbnQgPSBlbGVtZW50LmdldERPTUVsZW1lbnQoKTtcblxuICAgIGRlbGV0ZSBlbGVtZW50LmRvbUVsZW1lbnQ7XG5cbiAgICBkZWxldGUgZG9tRWxlbWVudC5fX2VsZW1lbnRfXztcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb3VudEVsZW1lbnQoZWxlbWVudCkge1xuICBjb25zdCBkZXNjZW5kYW50RWxlbWVudHMgPSBlbGVtZW50LmdldERlc2NlbmRhbnRFbGVtZW50cygpLFxuICAgICAgICBlbGVtZW50cyA9IFtcbiAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgIC4uLmRlc2NlbmRhbnRFbGVtZW50c1xuICAgICAgICBdO1xuXG4gIGVsZW1lbnRzLnJldmVyc2UoKTsgLy8vXG5cbiAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIGVsZW1lbnQuZGlkTW91bnQgJiYgZWxlbWVudC5kaWRNb3VudCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVubW91bnRFbGVtZW50KGVsZW1lbnQpIHtcbiAgY29uc3QgZGVzY2VuZGFudEVsZW1lbnRzID0gZWxlbWVudC5nZXREZXNjZW5kYW50RWxlbWVudHMoKSxcbiAgICAgICAgZWxlbWVudHMgPSBbXG4gICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAuLi5kZXNjZW5kYW50RWxlbWVudHNcbiAgICAgICAgXTtcblxuICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgZWxlbWVudC53aWxsVW5tb3VudCAmJiBlbGVtZW50LndpbGxVbm1vdW50KCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNvbnN0cnVjdEVsZW1lbnQsXG4gIGRlc3Ryb3lFbGVtZW50LFxuICBtb3VudEVsZW1lbnQsXG4gIHVubW91bnRFbGVtZW50XG59O1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBwdXNoIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9hcnJheVwiO1xuaW1wb3J0IHsgV0lMRENBUkQgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBlbGVtZW50c0Zyb21ET01FbGVtZW50cyhkb21FbGVtZW50cykge1xuICBjb25zdCBkb21FbGVtZW50c1dpdGhFbGVtZW50cyA9IGZpbHRlckRPTU5vZGVzKGRvbUVsZW1lbnRzLCAoZG9tRWxlbWVudCkgPT4ge1xuICAgICAgICAgIGlmICgoZG9tRWxlbWVudC5fX2VsZW1lbnRfXykpIHsgLy8vXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBlbGVtZW50cyA9IGRvbUVsZW1lbnRzV2l0aEVsZW1lbnRzLm1hcCgoZG9tRWxlbWVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb21FbGVtZW50Ll9fZWxlbWVudF9fOyAvLy9cblxuICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9KTtcblxuICByZXR1cm4gZWxlbWVudHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc2NlbmRhbnRET01Ob2Rlc0Zyb21ET01Ob2RlKGRvbU5vZGUsIGhlaWdodCwgYXNjZW5kYW50RE9NTm9kZXMgPSBbXSkge1xuICBpZiAoaGVpZ2h0ID4gMCkge1xuICAgIGNvbnN0IHBhcmVudERPTU5vZGUgPSBkb21Ob2RlLnBhcmVudEVsZW1lbnQ7ICAvLy9cblxuICAgIGlmIChwYXJlbnRET01Ob2RlICE9PSBudWxsKSB7XG4gICAgICBhc2NlbmRhbnRET01Ob2Rlcy5wdXNoKHBhcmVudERPTU5vZGUpO1xuXG4gICAgICBoZWlnaHQtLTtcblxuICAgICAgYXNjZW5kYW50RE9NTm9kZXNGcm9tRE9NTm9kZShwYXJlbnRET01Ob2RlLCBoZWlnaHQsIGFzY2VuZGFudERPTU5vZGVzKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXNjZW5kYW50RE9NTm9kZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXNjZW5kYW50RE9NTm9kZXNGcm9tRE9NTm9kZShkb21Ob2RlLCBkZXB0aCwgZGVzY2VuZGFudERPTU5vZGVzID0gW10pIHtcbiAgaWYgKGRlcHRoID4gMCkge1xuICAgIGNvbnN0IGNoaWxkRE9NTm9kZXMgPSBkb21Ob2RlLmNoaWxkTm9kZXM7ICAvLy9cblxuICAgIHB1c2goZGVzY2VuZGFudERPTU5vZGVzLCBjaGlsZERPTU5vZGVzKTtcblxuICAgIGRlcHRoLS07XG5cbiAgICBjaGlsZERPTU5vZGVzLmZvckVhY2goKGNoaWxkRE9NTm9kZSkgPT4ge1xuICAgICAgZGVzY2VuZGFudERPTU5vZGVzRnJvbURPTU5vZGUoY2hpbGRET01Ob2RlLCBkZXB0aCwgZGVzY2VuZGFudERPTU5vZGVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBkZXNjZW5kYW50RE9NTm9kZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJET01Ob2Rlc0J5U2VsZWN0b3IoZG9tTm9kZXMsIHNlbGVjdG9yKSB7XG4gIGNvbnN0IGZpbHRlcmVkRE9NTm9kZXMgPSBmaWx0ZXJET01Ob2Rlcyhkb21Ob2RlcywgKGRvbU5vZGUpID0+IHtcbiAgICBpZiAoZG9tTm9kZU1hdGNoZXNTZWxlY3Rvcihkb21Ob2RlLCBzZWxlY3RvcikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGZpbHRlcmVkRE9NTm9kZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb21Ob2RlTWF0Y2hlc1NlbGVjdG9yKGRvbU5vZGUsIHNlbGVjdG9yKSB7XG4gIGNvbnN0IGRvbU5vZGVUeXBlID0gZG9tTm9kZS5ub2RlVHlwZTsgLy8vXG5cbiAgc3dpdGNoIChkb21Ob2RlVHlwZSkge1xuICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREU6IHtcbiAgICAgIGNvbnN0IGRvbUVsZW1lbnQgPSBkb21Ob2RlOyAvLy9cblxuICAgICAgcmV0dXJuIGRvbUVsZW1lbnQubWF0Y2hlcyhzZWxlY3Rvcik7XG4gICAgfVxuXG4gICAgY2FzZSBOb2RlLlRFWFRfTk9ERToge1xuICAgICAgaWYgKHNlbGVjdG9yID09PSBXSUxEQ0FSRCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJET01Ob2Rlcyhkb21Ob2RlcywgdGVzdCkge1xuICBjb25zdCBmaWx0ZXJlZERPTU5vZGVzID0gW10sXG4gICAgICAgIGRvbU5vZGVzTGVuZ3RoID0gZG9tTm9kZXMubGVuZ3RoO1xuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkb21Ob2Rlc0xlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGRvbU5vZGUgPSBkb21Ob2Rlc1tpbmRleF0sXG4gICAgICAgICAgcmVzdWx0ID0gdGVzdChkb21Ob2RlKTtcblxuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIGZpbHRlcmVkRE9NTm9kZXMucHVzaChkb21Ob2RlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmlsdGVyZWRET01Ob2Rlcztcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgZmlyc3QgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2FycmF5XCI7XG5pbXBvcnQgeyBXSUxEQ0FSRCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGRvbU5vZGVNYXRjaGVzU2VsZWN0b3IsIGVsZW1lbnRzRnJvbURPTUVsZW1lbnRzLCBmaWx0ZXJET01Ob2Rlc0J5U2VsZWN0b3IsIGFzY2VuZGFudERPTU5vZGVzRnJvbURPTU5vZGUsIGRlc2NlbmRhbnRET01Ob2Rlc0Zyb21ET01Ob2RlIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9kb21cIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudEVsZW1lbnQoc2VsZWN0b3IgPSBXSUxEQ0FSRCkge1xuICBsZXQgcGFyZW50RWxlbWVudCA9IG51bGw7XG5cbiAgY29uc3QgcGFyZW50RE9NRWxlbWVudCA9IHRoaXMuZG9tRWxlbWVudC5wYXJlbnRFbGVtZW50OyAvLy9cblxuICBpZiAocGFyZW50RE9NRWxlbWVudCAhPT0gbnVsbCkge1xuICAgIGlmIChwYXJlbnRET01FbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpKSB7XG4gICAgICBjb25zdCBwYXJlbnRET01FbGVtZW50cyA9IFtcbiAgICAgICAgICAgICAgcGFyZW50RE9NRWxlbWVudFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHBhcmVudEVsZW1lbnRzID0gZWxlbWVudHNGcm9tRE9NRWxlbWVudHMocGFyZW50RE9NRWxlbWVudHMpLFxuICAgICAgICAgICAgZmlyc3RQYXJlbnRFbGVtZW50ID0gZmlyc3QocGFyZW50RWxlbWVudHMpO1xuXG4gICAgICBwYXJlbnRFbGVtZW50ID0gZmlyc3RQYXJlbnRFbGVtZW50IHx8IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcmVudEVsZW1lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGlsZEVsZW1lbnRzKHNlbGVjdG9yID0gV0lMRENBUkQpIHtcbiAgY29uc3QgY2hpbGRET01Ob2RlcyA9IHRoaXMuZG9tRWxlbWVudC5jaGlsZE5vZGVzLCAvLy9cbiAgICAgICAgY2hpbGRET01FbGVtZW50cyA9IGZpbHRlckRPTU5vZGVzQnlTZWxlY3RvcihjaGlsZERPTU5vZGVzLCBzZWxlY3RvciksXG4gICAgICAgIGNoaWxkRWxlbWVudHMgPSBlbGVtZW50c0Zyb21ET01FbGVtZW50cyhjaGlsZERPTUVsZW1lbnRzKTtcblxuICByZXR1cm4gY2hpbGRFbGVtZW50cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFzY2VuZGFudEVsZW1lbnRzKHNlbGVjdG9yID0gV0lMRENBUkQsIG1heGltdW1IZWlnaHQgPSBJbmZpbml0eSkge1xuICBjb25zdCBoZWlnaHQgPSBtYXhpbXVtSGVpZ2h0LCAvLy9cbiAgICAgICAgZG9tTm9kZSA9IHRoaXMuZG9tRWxlbWVudCwgIC8vL1xuICAgICAgICBhc2NlbmRhbnRET01Ob2RlcyA9IGFzY2VuZGFudERPTU5vZGVzRnJvbURPTU5vZGUoZG9tTm9kZSwgaGVpZ2h0KSxcbiAgICAgICAgYXNjZW5kYW50RE9NRWxlbWVudHMgPSBmaWx0ZXJET01Ob2Rlc0J5U2VsZWN0b3IoYXNjZW5kYW50RE9NTm9kZXMsIHNlbGVjdG9yKSxcbiAgICAgICAgYXNjZW5kYW50RWxlbWVudHMgPSBlbGVtZW50c0Zyb21ET01FbGVtZW50cyhhc2NlbmRhbnRET01FbGVtZW50cyk7XG5cbiAgcmV0dXJuIGFzY2VuZGFudEVsZW1lbnRzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVzY2VuZGFudEVsZW1lbnRzKHNlbGVjdG9yID0gV0lMRENBUkQsIG1heGltdW1EZXB0aCA9IEluZmluaXR5KSB7XG4gIGNvbnN0IGRlcHRoID0gbWF4aW11bURlcHRoLCAvLy9cbiAgICAgICAgZG9tTm9kZSA9IHRoaXMuZG9tRWxlbWVudCwgIC8vL1xuICAgICAgICBkZXNjZW5kYW50RE9NTm9kZXMgPSBkZXNjZW5kYW50RE9NTm9kZXNGcm9tRE9NTm9kZShkb21Ob2RlLCBkZXB0aCksXG4gICAgICAgIGRlc2NlbmRhbnRET01FbGVtZW50cyA9IGZpbHRlckRPTU5vZGVzQnlTZWxlY3RvcihkZXNjZW5kYW50RE9NTm9kZXMsIHNlbGVjdG9yKSxcbiAgICAgICAgZGVzY2VuZGFudEVsZW1lbnRzID0gZWxlbWVudHNGcm9tRE9NRWxlbWVudHMoZGVzY2VuZGFudERPTUVsZW1lbnRzKTtcblxuICByZXR1cm4gZGVzY2VuZGFudEVsZW1lbnRzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHNlbGVjdG9yID0gV0lMRENBUkQpIHtcbiAgbGV0IG5leHRTaWJsaW5nRWxlbWVudCA9IG51bGw7XG5cbiAgY29uc3QgbmV4dFNpYmxpbmdET01Ob2RlID0gdGhpcy5kb21FbGVtZW50Lm5leHRTaWJsaW5nOyAvLy9cblxuICBpZiAoKG5leHRTaWJsaW5nRE9NTm9kZSAhPT0gbnVsbCkgJiYgZG9tTm9kZU1hdGNoZXNTZWxlY3RvcihuZXh0U2libGluZ0RPTU5vZGUsIHNlbGVjdG9yKSkge1xuICAgIG5leHRTaWJsaW5nRWxlbWVudCA9IG5leHRTaWJsaW5nRE9NTm9kZS5fX2VsZW1lbnRfXyB8fCBudWxsO1xuICB9XG5cbiAgcmV0dXJuIG5leHRTaWJsaW5nRWxlbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFByZXZpb3VzU2libGluZ0VsZW1lbnQoc2VsZWN0b3IgPSBXSUxEQ0FSRCkge1xuICBsZXQgcHJldmlvdXNTaWJsaW5nRWxlbWVudCA9IG51bGw7XG5cbiAgY29uc3QgcHJldmlvdXNTaWJsaW5nRE9NTm9kZSA9IHRoaXMuZG9tRWxlbWVudC5wcmV2aW91c1NpYmxpbmc7ICAvLy9cblxuICBpZiAoKHByZXZpb3VzU2libGluZ0RPTU5vZGUgIT09IG51bGwpICYmIGRvbU5vZGVNYXRjaGVzU2VsZWN0b3IocHJldmlvdXNTaWJsaW5nRE9NTm9kZSwgc2VsZWN0b3IpKSB7XG4gICAgcHJldmlvdXNTaWJsaW5nRWxlbWVudCA9IHByZXZpb3VzU2libGluZ0RPTU5vZGUuX19lbGVtZW50X18gfHwgbnVsbDtcbiAgfVxuXG4gIHJldHVybiBwcmV2aW91c1NpYmxpbmdFbGVtZW50O1xufVxuXG5jb25zdCBlbGVtZW50TWl4aW5zID0ge1xuICBnZXRQYXJlbnRFbGVtZW50LFxuICBnZXRDaGlsZEVsZW1lbnRzLFxuICBnZXRBc2NlbmRhbnRFbGVtZW50cyxcbiAgZ2V0RGVzY2VuZGFudEVsZW1lbnRzLFxuICBnZXROZXh0U2libGluZ0VsZW1lbnQsXG4gIGdldFByZXZpb3VzU2libGluZ0VsZW1lbnRcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGVsZW1lbnRNaXhpbnM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCBPZmZzZXQgZnJvbSBcIi4vb2Zmc2V0XCI7XG5pbXBvcnQgQm91bmRzIGZyb20gXCIuL2JvdW5kc1wiO1xuXG5pbXBvcnQgeyBjb25zdHJ1Y3RFbGVtZW50LCBkZXN0cm95RWxlbWVudCB9IGZyb20gXCIuL3V0aWxpdGllcy9lbGVtZW50XCI7XG5pbXBvcnQgeyBnZXRQYXJlbnRFbGVtZW50LCBnZXRBc2NlbmRhbnRFbGVtZW50cywgZ2V0TmV4dFNpYmxpbmdFbGVtZW50LCBnZXRQcmV2aW91c1NpYmxpbmdFbGVtZW50IH0gZnJvbSBcIi4vbWl4aW5zL2VsZW1lbnRcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGV4dEVsZW1lbnQge1xuICBjb25zdHJ1Y3Rvcih0ZXh0KSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMsIC8vL1xuICAgICAgICAgIGRvbUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTsgLy8vXG5cbiAgICBjb25zdHJ1Y3RFbGVtZW50KGVsZW1lbnQsIGRvbUVsZW1lbnQpO1xuICB9XG5cbiAgZ2V0RE9NRWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5kb21FbGVtZW50O1xuICB9XG5cbiAgZ2V0T2Zmc2V0KCkge1xuICAgIGNvbnN0IG9mZnNldCA9IE9mZnNldC5mcm9tRE9NRWxlbWVudCh0aGlzLmRvbUVsZW1lbnQpO1xuXG4gICAgcmV0dXJuIG9mZnNldDtcbiAgfVxuXG4gIGdldEJvdW5kcygpIHtcbiAgICBjb25zdCBib3VuZHMgPSBCb3VuZHMuZnJvbURPTUVsZW1lbnQodGhpcy5kb21FbGVtZW50KTtcblxuICAgIHJldHVybiBib3VuZHM7XG4gIH1cblxuICBnZXRXaWR0aCgpIHsgcmV0dXJuIHRoaXMuZG9tRWxlbWVudC5vZmZzZXRXaWR0aDsgfSAgLy8vXG5cbiAgZ2V0SGVpZ2h0KCkgeyByZXR1cm4gdGhpcy5kb21FbGVtZW50Lm9mZnNldEhlaWdodDsgfSAgLy8vXG5cbiAgZ2V0VGV4dCgpIHtcbiAgICBjb25zdCBub2RlVmFsdWUgPSB0aGlzLmRvbUVsZW1lbnQubm9kZVZhbHVlLFxuICAgICAgICAgIHRleHQgPSBub2RlVmFsdWU7IC8vL1xuXG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICBzZXRUZXh0KHRleHQpIHtcbiAgICBjb25zdCBub2RlVmFsdWUgPSB0ZXh0OyAvLy9cblxuICAgIHRoaXMuZG9tRWxlbWVudC5ub2RlVmFsdWUgPSBub2RlVmFsdWU7XG4gIH1cblxuICBwcmVwZW5kVG8ocGFyZW50RWxlbWVudCkgeyBwYXJlbnRFbGVtZW50LnByZXBlbmQodGhpcyk7IH1cblxuICBhcHBlbmRUbyhwYXJlbnRFbGVtZW50KSB7IHBhcmVudEVsZW1lbnQuYXBwZW5kKHRoaXMpOyB9XG5cbiAgYWRkVG8ocGFyZW50RWxlbWVudCkgeyBwYXJlbnRFbGVtZW50LmFkZCh0aGlzKTsgfVxuXG4gIHJlbW92ZUZyb20ocGFyZW50RWxlbWVudCkgeyBwYXJlbnRFbGVtZW50LnJlbW92ZSh0aGlzKTsgfVxuXG4gIGluc2VydEJlZm9yZShzaWJsaW5nRWxlbWVudCkge1xuICAgIGNvbnN0IHBhcmVudERPTU5vZGUgPSBzaWJsaW5nRWxlbWVudC5kb21FbGVtZW50LnBhcmVudE5vZGUsIC8vL1xuICAgICAgICAgIHNpYmxpbmdET01FbGVtZW50ID0gc2libGluZ0VsZW1lbnQuZG9tRWxlbWVudDsgIC8vL1xuXG4gICAgcGFyZW50RE9NTm9kZS5pbnNlcnRCZWZvcmUodGhpcy5kb21FbGVtZW50LCBzaWJsaW5nRE9NRWxlbWVudCk7XG4gIH1cblxuICBpbnNlcnRBZnRlcihzaWJsaW5nRWxlbWVudCkge1xuICAgIGNvbnN0IHBhcmVudERPTU5vZGUgPSBzaWJsaW5nRWxlbWVudC5kb21FbGVtZW50LnBhcmVudE5vZGUsIC8vL1xuICAgICAgICAgIHNpYmxpbmdET01FbGVtZW50ID0gc2libGluZ0VsZW1lbnQuZG9tRWxlbWVudDsgIC8vL1xuXG4gICAgcGFyZW50RE9NTm9kZS5pbnNlcnRCZWZvcmUodGhpcy5kb21FbGVtZW50LCBzaWJsaW5nRE9NRWxlbWVudC5uZXh0U2libGluZyk7ICAvLy9cbiAgfVxuXG4gIHJlbW92ZSgpIHtcbiAgICB0aGlzLmRvbUVsZW1lbnQucmVtb3ZlKCk7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzOyAvLy9cblxuICAgIGRlc3Ryb3lFbGVtZW50KGVsZW1lbnQpO1xuICB9XG59XG5cbk9iamVjdC5hc3NpZ24oVGV4dEVsZW1lbnQucHJvdG90eXBlLCB7XG4gIGdldFBhcmVudEVsZW1lbnQsXG4gIGdldEFzY2VuZGFudEVsZW1lbnRzLFxuICBnZXROZXh0U2libGluZ0VsZW1lbnQsXG4gIGdldFByZXZpb3VzU2libGluZ0VsZW1lbnRcbn0pO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgVGV4dEVsZW1lbnQgZnJvbSBcIi4uL3RleHRFbGVtZW50XCI7XG5cbmltcG9ydCB7IFNUUklORyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUZhbHNleUVsZW1lbnRzKGVsZW1lbnRzKSB7XG4gIGVsZW1lbnRzID0gZWxlbWVudHMucmVkdWNlKChlbGVtZW50cywgZWxlbWVudCkgPT4ge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICBlbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50cztcbiAgfSwgW10pO1xuXG4gIHJldHVybiBlbGVtZW50cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VTdHJpbmdzV2l0aFRleHRFbGVtZW50cyhlbGVtZW50cykge1xuICBlbGVtZW50cyA9IGVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4geyAgLy8vXG4gICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSBTVFJJTkcpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBlbGVtZW50LCAgLy8vXG4gICAgICAgICAgICB0ZXh0RWxlbWVudCA9IG5ldyBUZXh0RWxlbWVudCh0ZXh0KTtcblxuICAgICAgZWxlbWVudCA9IHRleHRFbGVtZW50OyAvLy9cbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfSk7XG5cbiAgcmV0dXJuIGVsZW1lbnRzO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnQgY29uc3QgQ1VUX0VWRU5UX1RZUEUgPSBcImN1dFwiO1xuZXhwb3J0IGNvbnN0IENPUFlfRVZFTlRfVFlQRSA9IFwiY29weVwiO1xuZXhwb3J0IGNvbnN0IEJMVVJfRVZFTlRfVFlQRSA9IFwiYmx1clwiO1xuZXhwb3J0IGNvbnN0IEVSUk9SX0VWRU5UX1RZUEUgPSBcImVycm9yXCI7XG5leHBvcnQgY29uc3QgUEFTVEVfRVZFTlRfVFlQRSA9IFwicGFzdGVcIjtcbmV4cG9ydCBjb25zdCBXSEVFTF9FVkVOVF9UWVBFID0gXCJ3aGVlbFwiO1xuZXhwb3J0IGNvbnN0IElOUFVUX0VWRU5UX1RZUEUgPSBcImlucHV0XCI7XG5leHBvcnQgY29uc3QgRk9DVVNfRVZFTlRfVFlQRSA9IFwiZm9jdXNcIjtcbmV4cG9ydCBjb25zdCBDTElDS19FVkVOVF9UWVBFID0gXCJjbGlja1wiO1xuZXhwb3J0IGNvbnN0IEtFWVVQX0VWRU5UX1RZUEUgPSBcImtleXVwXCI7XG5leHBvcnQgY29uc3QgU0VMRUNUX0VWRU5UX1RZUEUgPSBcInNlbGVjdFwiO1xuZXhwb3J0IGNvbnN0IENIQU5HRV9FVkVOVF9UWVBFID0gXCJjaGFuZ2VcIjtcbmV4cG9ydCBjb25zdCBSRVNJWkVfRVZFTlRfVFlQRSA9IFwicmVzaXplXCI7XG5leHBvcnQgY29uc3QgU0NST0xMX0VWRU5UX1RZUEUgPSBcInNjcm9sbFwiO1xuZXhwb3J0IGNvbnN0IEtFWURPV05fRVZFTlRfVFlQRSA9IFwia2V5ZG93blwiO1xuZXhwb3J0IGNvbnN0IE1PVVNFVVBfRVZFTlRfVFlQRSA9IFwibW91c2V1cFwiO1xuZXhwb3J0IGNvbnN0IEFVWENMSUNLX0VWRU5UX1RZUEUgPSBcImF1eGNsaWNrXCI7XG5leHBvcnQgY29uc3QgTU9VU0VPVVRfRVZFTlRfVFlQRSA9IFwibW91c2VvdXRcIjtcbmV4cG9ydCBjb25zdCBEQkxDTElDS19FVkVOVF9UWVBFID0gXCJkYmxjbGlja1wiO1xuZXhwb3J0IGNvbnN0IFRPVUNIRU5EX0VWRU5UX1RZUEUgPSBcInRvdWNoZW5kXCI7XG5leHBvcnQgY29uc3QgVE9VQ0hNT1ZFX0VWRU5UX1RZUEUgPSBcInRvdWNobW92ZVwiO1xuZXhwb3J0IGNvbnN0IE1PVVNFT1ZFUl9FVkVOVF9UWVBFID0gXCJtb3VzZW92ZXJcIjtcbmV4cG9ydCBjb25zdCBNT1VTRURPV05fRVZFTlRfVFlQRSA9IFwibW91c2Vkb3duXCI7XG5leHBvcnQgY29uc3QgTU9VU0VNT1ZFX0VWRU5UX1RZUEUgPSBcIm1vdXNlbW92ZVwiO1xuZXhwb3J0IGNvbnN0IFRPVUNIU1RBUlRfRVZFTlRfVFlQRSA9IFwidG91Y2hzdGFydFwiO1xuZXhwb3J0IGNvbnN0IENPTlRFWFRNRU5VX0VWRU5UX1RZUEUgPSBcImNvbnRleHRtZW51XCI7XG5leHBvcnQgY29uc3QgU0VMRUNUSU9OQ0hBTkdFX0VWRU5UX1RZUEUgPSBcInNlbGVjdGlvbmNoYW5nZVwiO1xuZXhwb3J0IGNvbnN0IEZVTExTQ1JFRU5DSEFOR0VfRVZFTlRfVFlQRSA9IFwiZnVsbHNjcmVlbmNoYW5nZVwiO1xuZXhwb3J0IGNvbnN0IFVOSEFORExFRFJFSkVDVElPTl9FVkVOVF9UWVBFID0gXCJ1bmhhbmRsZWRyZWplY3Rpb25cIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBDVVRfRVZFTlRfVFlQRSxcbiAgQ09QWV9FVkVOVF9UWVBFLFxuICBCTFVSX0VWRU5UX1RZUEUsXG4gIEVSUk9SX0VWRU5UX1RZUEUsXG4gIFBBU1RFX0VWRU5UX1RZUEUsXG4gIFdIRUVMX0VWRU5UX1RZUEUsXG4gIElOUFVUX0VWRU5UX1RZUEUsXG4gIEZPQ1VTX0VWRU5UX1RZUEUsXG4gIENMSUNLX0VWRU5UX1RZUEUsXG4gIEtFWVVQX0VWRU5UX1RZUEUsXG4gIFNFTEVDVF9FVkVOVF9UWVBFLFxuICBDSEFOR0VfRVZFTlRfVFlQRSxcbiAgUkVTSVpFX0VWRU5UX1RZUEUsXG4gIFNDUk9MTF9FVkVOVF9UWVBFLFxuICBLRVlET1dOX0VWRU5UX1RZUEUsXG4gIE1PVVNFVVBfRVZFTlRfVFlQRSxcbiAgQVVYQ0xJQ0tfRVZFTlRfVFlQRSxcbiAgTU9VU0VPVVRfRVZFTlRfVFlQRSxcbiAgREJMQ0xJQ0tfRVZFTlRfVFlQRSxcbiAgVE9VQ0hFTkRfRVZFTlRfVFlQRSxcbiAgVE9VQ0hNT1ZFX0VWRU5UX1RZUEUsXG4gIE1PVVNFT1ZFUl9FVkVOVF9UWVBFLFxuICBNT1VTRURPV05fRVZFTlRfVFlQRSxcbiAgTU9VU0VNT1ZFX0VWRU5UX1RZUEUsXG4gIFRPVUNIU1RBUlRfRVZFTlRfVFlQRSxcbiAgQ09OVEVYVE1FTlVfRVZFTlRfVFlQRSxcbiAgU0VMRUNUSU9OQ0hBTkdFX0VWRU5UX1RZUEUsXG4gIEZVTExTQ1JFRU5DSEFOR0VfRVZFTlRfVFlQRSxcbiAgVU5IQU5ETEVEUkVKRUNUSU9OX0VWRU5UX1RZUEVcbn07XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IGd1YXJhbnRlZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvYXJyYXlcIjtcbmltcG9ydCB7IGNvbWJpbmUsIHBydW5lIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9vYmplY3RcIjtcbmltcG9ydCB7IGNhbWVsQ2FzZVRvU25ha2VDYXNlIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9zdHJpbmdcIjtcbmltcG9ydCB7IGlzSFRNTEF0dHJpYnV0ZU5hbWUsIGlzU1ZHQXR0cmlidXRlTmFtZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvbmFtZVwiO1xuaW1wb3J0IHsgcmVtb3ZlRmFsc2V5RWxlbWVudHMsIHJlcGxhY2VTdHJpbmdzV2l0aFRleHRFbGVtZW50cyB9IGZyb20gXCIuLi91dGlsaXRpZXMvZWxlbWVudHNcIjtcbmltcG9ydCB7IERCTENMSUNLX0VWRU5UX1RZUEUsIFNFTEVDVElPTkNIQU5HRV9FVkVOVF9UWVBFLCBGVUxMU0NSRUVOQ0hBTkdFX0VWRU5UX1RZUEUgfSBmcm9tIFwiLi4vZXZlbnRUeXBlc1wiO1xuaW1wb3J0IHsgRk9SLCBDTEFTUywgT0JKRUNULCBIVE1MX0ZPUiwgQ0xBU1NfTkFNRSwgQk9PTEVBTiwgRlVOQ1RJT04sIFNWR19OQU1FU1BBQ0VfVVJJIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG5jb25zdCBET1VCTEVfQ0xJQ0tfRVZFTlRfVFlQRSA9IFwiZG91YmxlY2xpY2tcIixcbiAgICAgIFNFTEVDVElPTl9DSEFOR0VfRVZFTlRfVFlQRSA9IFwic2VsZWN0aW9uQ2hhbmdlXCIsXG4gICAgICBGVUxMX1NDUkVFTl9DSEFOR0VfRVZFTlRfVFlQRSA9IFwiZnVsbFNjcmVlbkNoYW5nZVwiO1xuXG5mdW5jdGlvbiBhcHBseVByb3BlcnRpZXMocHJvcGVydGllcywgZGVmYXVsdFByb3BlcnRpZXMsIGlnbm9yZWRQcm9wZXJ0aWVzKSB7XG4gIHRoaXMucHJvcGVydGllcyA9IGNvbWJpbmUocHJvcGVydGllcywgZGVmYXVsdFByb3BlcnRpZXMpO1xuXG4gIHByb3BlcnRpZXMgPSBwcnVuZSh0aGlzLnByb3BlcnRpZXMsIGlnbm9yZWRQcm9wZXJ0aWVzKTsgLy8vXG5cbiAgY29uc3QgbmFtZXNwYWNlVVJJID0gdGhpcy5kb21FbGVtZW50Lm5hbWVzcGFjZVVSSSxcbiAgICAgICAgc3ZnID0gKG5hbWVzcGFjZVVSSSA9PT0gU1ZHX05BTUVTUEFDRV9VUkkpLCAvLy9cbiAgICAgICAgcHJvcGVydGllc0tleXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKSxcbiAgICAgICAgbmFtZXMgPSBwcm9wZXJ0aWVzS2V5czsgIC8vLz1cblxuICBuYW1lcy5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBwcm9wZXJ0aWVzW25hbWVdLFxuICAgICAgICAgIG5hbWVIYW5kbGVyTmFtZSA9IGlzTmFtZUhhbmRsZXJOYW1lKG5hbWUpLFxuICAgICAgICAgIG5hbWVDdXN0b21IYW5kbGVyTmFtZSA9IGlzTmFtZUN1c3RvbUhhbmRsZXJOYW1lKG5hbWUpO1xuXG4gICAgaWYgKGZhbHNlKSB7XG4gICAgICAvLy9cbiAgICB9IGVsc2UgaWYgKG5hbWVIYW5kbGVyTmFtZSkge1xuICAgICAgYWRkSGFuZGxlcih0aGlzLCBuYW1lLCB2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChuYW1lQ3VzdG9tSGFuZGxlck5hbWUpIHtcbiAgICAgIGFkZEN1c3RvbUhhbmRsZXIodGhpcywgbmFtZSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuYW1lQXR0cmlidXRlTmFtZSA9IGlzTmFtZUF0dHJpYnV0ZU5hbWUobmFtZSwgc3ZnKTtcblxuICAgICAgaWYgKG5hbWVBdHRyaWJ1dGVOYW1lKSB7XG4gICAgICAgIGFkZEF0dHJpYnV0ZSh0aGlzLCBuYW1lLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBjaGlsZEVsZW1lbnRzID0gY2hpbGRFbGVtZW50c0Zyb21FbGVtZW50KHRoaXMpIHx8IHByb3BlcnRpZXMuY2hpbGRFbGVtZW50cywgIC8vL1xuICAgICAgICBjb250ZXh0ID0ge307XG5cbiAgY2hpbGRFbGVtZW50cy5mb3JFYWNoKChjaGlsZEVsZW1lbnQpID0+IHtcbiAgICB1cGRhdGVDb250ZXh0KGNoaWxkRWxlbWVudCwgY29udGV4dCk7XG5cbiAgICB0aGlzLmFkZChjaGlsZEVsZW1lbnQpO1xuICB9KTtcblxuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xufVxuXG5mdW5jdGlvbiBnZXRQcm9wZXJ0aWVzKCkge1xuICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzO1xufVxuXG5mdW5jdGlvbiBnZXRDb250ZXh0KCkge1xuICByZXR1cm4gdGhpcy5jb250ZXh0O1xufVxuXG5mdW5jdGlvbiBhc3NpZ25Db250ZXh0KG5hbWVzKSB7XG4gIGlmIChuYW1lcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmNvbnRleHQpXG4gIH1cblxuICBuYW1lcy5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmNvbnRleHRbbmFtZV0sXG4gICAgICAgICAgcHJvcGVydHlOYW1lID0gbmFtZSwgIC8vL1xuICAgICAgICAgIGRlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgICB9O1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3BlcnR5TmFtZSwgZGVzY3JpcHRvcik7XG5cbiAgICBkZWxldGUgdGhpcy5jb250ZXh0W25hbWVdO1xuICB9KTtcbn1cblxuY29uc3QganN4TWl4aW5zID0ge1xuICBhcHBseVByb3BlcnRpZXMsXG4gIGdldFByb3BlcnRpZXMsXG4gIGdldENvbnRleHQsXG4gIGFzc2lnbkNvbnRleHRcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGpzeE1peGlucztcblxuZnVuY3Rpb24gY2hpbGRFbGVtZW50c0Zyb21FbGVtZW50KGVsZW1lbnQpIHtcbiAgbGV0IGNoaWxkRWxlbWVudHMgPSBudWxsO1xuXG4gIGlmICh0eXBlb2YgZWxlbWVudC5jaGlsZEVsZW1lbnRzID09PSBGVU5DVElPTikge1xuICAgIGNoaWxkRWxlbWVudHMgPSBlbGVtZW50LmNoaWxkRWxlbWVudHMuY2FsbChlbGVtZW50KTtcblxuICAgIGNoaWxkRWxlbWVudHMgPSBndWFyYW50ZWUoY2hpbGRFbGVtZW50cyk7XG5cbiAgICBjaGlsZEVsZW1lbnRzID0gcmVtb3ZlRmFsc2V5RWxlbWVudHMoY2hpbGRFbGVtZW50cyk7XG5cbiAgICBjaGlsZEVsZW1lbnRzID0gcmVwbGFjZVN0cmluZ3NXaXRoVGV4dEVsZW1lbnRzKGNoaWxkRWxlbWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkRWxlbWVudHM7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRleHQoY2hpbGRFbGVtZW50LCBjb250ZXh0KSB7XG4gIGNvbnN0IHBhcmVudENvbnRleHQgPSAodHlwZW9mIGNoaWxkRWxlbWVudC5wYXJlbnRDb250ZXh0ID09PSBGVU5DVElPTikgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEVsZW1lbnQucGFyZW50Q29udGV4dCgpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEVsZW1lbnQuY29udGV4dDsgLy8vXG5cbiAgT2JqZWN0LmFzc2lnbihjb250ZXh0LCBwYXJlbnRDb250ZXh0KTtcbn1cblxuZnVuY3Rpb24gYWRkSGFuZGxlcihlbGVtZW50LCBuYW1lLCB2YWx1ZSkge1xuICBsZXQgZXZlbnRUeXBlID0gbmFtZS5zdWJzdHJpbmcoMikudG9Mb3dlckNhc2UoKTsgLy8vXG5cbiAgc3dpdGNoIChldmVudFR5cGUpIHtcbiAgICBjYXNlIERPVUJMRV9DTElDS19FVkVOVF9UWVBFOiB7XG4gICAgICBldmVudFR5cGUgPSBEQkxDTElDS19FVkVOVF9UWVBFO1xuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjYXNlIFNFTEVDVElPTl9DSEFOR0VfRVZFTlRfVFlQRToge1xuICAgICAgZXZlbnRUeXBlID0gU0VMRUNUSU9OQ0hBTkdFX0VWRU5UX1RZUEU7XG5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgRlVMTF9TQ1JFRU5fQ0hBTkdFX0VWRU5UX1RZUEU6IHtcbiAgICAgIGV2ZW50VHlwZSA9IEZVTExTQ1JFRU5DSEFOR0VfRVZFTlRfVFlQRTtcblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gIH1cblxuICBjb25zdCBoYW5kbGVyID0gdmFsdWU7ICAvLy9cblxuICBlbGVtZW50Lm9uRXZlbnQoZXZlbnRUeXBlLCBoYW5kbGVyKTtcbn1cblxuZnVuY3Rpb24gYWRkQ3VzdG9tSGFuZGxlcihlbGVtZW50LCBuYW1lLCB2YWx1ZSkge1xuICBjb25zdCBjdXN0b21FdmVudFR5cGUgPSBjYW1lbENhc2VUb1NuYWtlQ2FzZShuYW1lKS5yZXBsYWNlKC9vbi1jdXN0b20tLywgXCJcIiksXG4gICAgICAgIGN1c3RvbUhhbmRsZXIgPSB2YWx1ZTsgIC8vL1xuXG4gIGVsZW1lbnQub25DdXN0b21FdmVudChjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIpO1xufVxuXG5mdW5jdGlvbiBhZGRBdHRyaWJ1dGUoZWxlbWVudCwgbmFtZSwgdmFsdWUpIHtcbiAgaWYgKG5hbWUgPT09IENMQVNTX05BTUUpIHtcbiAgICBuYW1lID0gQ0xBU1M7XG4gIH1cblxuICBpZiAobmFtZSA9PT0gSFRNTF9GT1IpIHtcbiAgICBuYW1lID0gRk9SO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gT0JKRUNUKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcblxuICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBlbGVtZW50LmRvbUVsZW1lbnRbbmFtZV1ba2V5XSA9IHZhbHVlW2tleV07XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBCT09MRUFOKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB2YWx1ZSA9IG5hbWU7IC8vL1xuXG4gICAgICBlbGVtZW50LmFkZEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGVsZW1lbnQuYWRkQXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05hbWVIYW5kbGVyTmFtZShuYW1lKSB7XG4gIGNvbnN0IG5hbWVIYW5kbGVyTmFtZSA9ICAvXm9uKD8hQ3VzdG9tKS8udGVzdChuYW1lKTsgIC8vL1xuXG4gIHJldHVybiBuYW1lSGFuZGxlck5hbWU7XG59XG5cbmZ1bmN0aW9uIGlzTmFtZUF0dHJpYnV0ZU5hbWUobmFtZSwgc3ZnKSB7XG4gIGNvbnN0IG5hbWVBdHRyaWJ1dGVOYW1lID0gc3ZnID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTVkdBdHRyaWJ1dGVOYW1lKG5hbWUpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0hUTUxBdHRyaWJ1dGVOYW1lKG5hbWUpO1xuXG4gIHJldHVybiBuYW1lQXR0cmlidXRlTmFtZTtcbn1cblxuZnVuY3Rpb24gaXNOYW1lQ3VzdG9tSGFuZGxlck5hbWUobmFtZSkge1xuICBjb25zdCBuYW1lQ3VzdG9tSGFuZGxlck5hbWUgPSAvXm9uQ3VzdG9tLy50ZXN0KG5hbWUpO1xuXG4gIHJldHVybiBuYW1lQ3VzdG9tSGFuZGxlck5hbWU7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IEtFWVVQX0VWRU5UX1RZUEUsIEtFWURPV05fRVZFTlRfVFlQRSB9IGZyb20gXCIuLi9ldmVudFR5cGVzXCI7XG5cbmZ1bmN0aW9uIG9uS2V5VXAoa2V5VXBIYW5kbGVyLCBlbGVtZW50KSB7IHRoaXMub25FdmVudChLRVlVUF9FVkVOVF9UWVBFLCBrZXlVcEhhbmRsZXIsIGVsZW1lbnQpOyB9XG5cbmZ1bmN0aW9uIG9mZktleVVwKGtleVVwSGFuZGxlciwgZWxlbWVudCkgeyB0aGlzLm9mZkV2ZW50KEtFWVVQX0VWRU5UX1RZUEUsIGtleVVwSGFuZGxlciwgZWxlbWVudCk7IH1cblxuZnVuY3Rpb24gb25LZXlEb3duKGtleURvd25IYW5kbGVyLCBlbGVtZW50KSB7IHRoaXMub25FdmVudChLRVlET1dOX0VWRU5UX1RZUEUsIGtleURvd25IYW5kbGVyLCBlbGVtZW50KTsgfVxuXG5mdW5jdGlvbiBvZmZLZXlEb3duKGtleURvd25IYW5kbGVyLCBlbGVtZW50KSB7IHRoaXMub2ZmRXZlbnQoS0VZRE9XTl9FVkVOVF9UWVBFLCBrZXlEb3duSGFuZGxlciwgZWxlbWVudCk7IH1cblxuY29uc3Qga2V5TWl4aW5zID0ge1xuICBvbktleVVwLFxuICBvZmZLZXlVcCxcbiAgb25LZXlEb3duLFxuICBvZmZLZXlEb3duXG59O1xuXG5leHBvcnQgZGVmYXVsdCBrZXlNaXhpbnM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIGdldFN0YXRlKCkge1xuICByZXR1cm4gdGhpcy5zdGF0ZTtcbn1cblxuZnVuY3Rpb24gc2V0U3RhdGUoc3RhdGUpIHtcbiAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdGF0ZShzdGF0ZSkge1xuICAodGhpcy5zdGF0ZSA9PT0gdW5kZWZpbmVkKSA/XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlIDpcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5zdGF0ZSwgc3RhdGUpO1xufVxuXG5jb25zdCBzdGF0ZU1peGlucyA9IHtcbiAgZ2V0U3RhdGUsXG4gIHNldFN0YXRlLFxuICB1cGRhdGVTdGF0ZVxufTtcblxuZXhwb3J0IGRlZmF1bHQgc3RhdGVNaXhpbnM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IFNQQUNFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUkVTSVpFX0VWRU5UX1RZUEUgfSBmcm9tIFwiLi4vZXZlbnRUeXBlc1wiO1xuXG5mdW5jdGlvbiBvbkV2ZW50KGV2ZW50VHlwZXMsIGhhbmRsZXIsIGVsZW1lbnQgPSB0aGlzKSB7XG4gIGV2ZW50VHlwZXMgPSBldmVudFR5cGVzLnNwbGl0KFNQQUNFKTsgLy8vXG5cbiAgZXZlbnRUeXBlcy5mb3JFYWNoKChldmVudFR5cGUpID0+IHtcbiAgICBpZiAoZXZlbnRUeXBlID09PSBSRVNJWkVfRVZFTlRfVFlQRSkge1xuICAgICAgY29uc3QgcmVzaXplRXZlbnRMaXN0ZW5lcnMgPSB0aGlzLmZpbmRFdmVudExpc3RlbmVycyhSRVNJWkVfRVZFTlRfVFlQRSksXG4gICAgICAgICAgICByZXNpemVFdmVudExpc3RlbmVyc0xlbmd0aCA9IHJlc2l6ZUV2ZW50TGlzdGVuZXJzLmxlbmd0aDtcblxuICAgICAgaWYgKHJlc2l6ZUV2ZW50TGlzdGVuZXJzTGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICAgICAgICBjb25zdCByZXNpemVFdmVudExpc3RlbmVycyA9IHRoaXMuZmluZEV2ZW50TGlzdGVuZXJzKFJFU0laRV9FVkVOVF9UWVBFKTtcblxuICAgICAgICAgIHJlc2l6ZUV2ZW50TGlzdGVuZXJzLmZvckVhY2goKHJlc2l6ZUV2ZW50TGlzdGVuZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbnVsbDtcblxuICAgICAgICAgICAgcmVzaXplRXZlbnRMaXN0ZW5lcihldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmRvbUVsZW1lbnQpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGhhbmRsZXIsIGVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBldmVudExpc3RlbmVyID0gdGhpcy5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgZWxlbWVudCk7XG5cbiAgICAgIHRoaXMuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgZXZlbnRMaXN0ZW5lcik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gb2ZmRXZlbnQoZXZlbnRUeXBlcywgaGFuZGxlciwgZWxlbWVudCA9IHRoaXMpIHtcbiAgZXZlbnRUeXBlcyA9IGV2ZW50VHlwZXMuc3BsaXQoU1BBQ0UpOyAvLy9cblxuICBldmVudFR5cGVzLmZvckVhY2goKGV2ZW50VHlwZSkgPT4ge1xuICAgIGlmIChldmVudFR5cGUgPT09IFJFU0laRV9FVkVOVF9UWVBFKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBoYW5kbGVyLCBlbGVtZW50KTtcblxuICAgICAgY29uc3QgcmVzaXplRXZlbnRMaXN0ZW5lcnMgPSB0aGlzLmZpbmRFdmVudExpc3RlbmVycyhSRVNJWkVfRVZFTlRfVFlQRSksXG4gICAgICAgICAgICByZXNpemVFdmVudExpc3RlbmVyc0xlbmd0aCA9IHJlc2l6ZUV2ZW50TGlzdGVuZXJzLmxlbmd0aDtcblxuICAgICAgaWYgKHJlc2l6ZUV2ZW50TGlzdGVuZXJzTGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIudW5vYnNlcnZlKHRoaXMuZG9tRWxlbWVudCk7XG5cbiAgICAgICAgZGVsZXRlIHRoaXMucmVzaXplT2JzZXJ2ZXI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXIgPSB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBoYW5kbGVyLCBlbGVtZW50KTtcblxuICAgICAgdGhpcy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBldmVudExpc3RlbmVyKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgZWxlbWVudCkge1xuICBjb25zdCBldmVudExpc3RlbmVyID0gdGhpcy5jcmVhdGVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgZWxlbWVudCk7XG5cbiAgaWYgKCF0aGlzLmV2ZW50TGlzdGVuZXJzKSB7XG4gICAgdGhpcy5ldmVudExpc3RlbmVycyA9IFtdO1xuICB9XG5cbiAgdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKGV2ZW50TGlzdGVuZXIpO1xuXG4gIHJldHVybiBldmVudExpc3RlbmVyO1xufVxuXG5mdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgZWxlbWVudCkge1xuICBjb25zdCBldmVudExpc3RlbmVyID0gdGhpcy5maW5kRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGhhbmRsZXIsIGVsZW1lbnQpLFxuICAgICAgICBpbmRleCA9IHRoaXMuZXZlbnRMaXN0ZW5lcnMuaW5kZXhPZihldmVudExpc3RlbmVyKSxcbiAgICAgICAgc3RhcnQgPSBpbmRleCwgIC8vL1xuICAgICAgICBkZWxldGVDb3VudCA9IDE7XG5cbiAgdGhpcy5ldmVudExpc3RlbmVycy5zcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50KTtcblxuICBpZiAodGhpcy5ldmVudExpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUgdGhpcy5ldmVudExpc3RlbmVycztcbiAgfVxuXG4gIHJldHVybiBldmVudExpc3RlbmVyO1xufVxuXG5mdW5jdGlvbiBmaW5kRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgY29uc3QgZXZlbnRMaXN0ZW5lciA9IHRoaXMuZXZlbnRMaXN0ZW5lcnMuZmluZCgoZXZlbnRMaXN0ZW5lcikgPT4ge1xuICAgIGlmICgoZXZlbnRMaXN0ZW5lci5lbGVtZW50ID09PSBlbGVtZW50KSAmJiAoZXZlbnRMaXN0ZW5lci5oYW5kbGVyID09PSBoYW5kbGVyKSAmJiAoZXZlbnRMaXN0ZW5lci5ldmVudFR5cGUgPT09IGV2ZW50VHlwZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGV2ZW50TGlzdGVuZXI7XG59XG5cbmZ1bmN0aW9uIGZpbmRFdmVudExpc3RlbmVycyhldmVudFR5cGUpIHtcbiAgY29uc3QgZXZlbnRMaXN0ZW5lcnMgPSBbXTtcblxuICBpZiAodGhpcy5ldmVudExpc3RlbmVycykge1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMuZm9yRWFjaCgoZXZlbnRMaXN0ZW5lcikgPT4ge1xuICAgICAgY29uc3QgZm91bmQgPSAoZXZlbnRMaXN0ZW5lci5ldmVudFR5cGUgPT09IGV2ZW50VHlwZSk7XG5cbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICBldmVudExpc3RlbmVycy5wdXNoKGV2ZW50TGlzdGVuZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGV2ZW50TGlzdGVuZXJzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgZWxlbWVudCkge1xuICBsZXQgZXZlbnRMaXN0ZW5lcjtcblxuICBjb25zdCBoYW5kbGVyRWxlbWVudCA9IGVsZW1lbnQ7IC8vL1xuXG4gIGV2ZW50TGlzdGVuZXIgPSAoZXZlbnQpID0+IHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpczsgLy8vXG5cbiAgICBoYW5kbGVyLmNhbGwoaGFuZGxlckVsZW1lbnQsIGV2ZW50LCBlbGVtZW50KTtcbiAgfTtcblxuICBPYmplY3QuYXNzaWduKGV2ZW50TGlzdGVuZXIsIHtcbiAgICBlbGVtZW50LFxuICAgIGhhbmRsZXIsXG4gICAgZXZlbnRUeXBlXG4gIH0pO1xuXG4gIHJldHVybiBldmVudExpc3RlbmVyO1xufVxuXG5jb25zdCBldmVudE1peGlucyA9IHtcbiAgb25FdmVudCxcbiAgb2ZmRXZlbnQsXG4gIGFkZEV2ZW50TGlzdGVuZXIsXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXIsXG4gIGZpbmRFdmVudExpc3RlbmVyLFxuICBmaW5kRXZlbnRMaXN0ZW5lcnMsXG4gIGNyZWF0ZUV2ZW50TGlzdGVuZXJcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGV2ZW50TWl4aW5zO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBNT1VTRVVQX0VWRU5UX1RZUEUsIE1PVVNFT1VUX0VWRU5UX1RZUEUsIE1PVVNFRE9XTl9FVkVOVF9UWVBFLCBNT1VTRU9WRVJfRVZFTlRfVFlQRSwgTU9VU0VNT1ZFX0VWRU5UX1RZUEUgfSBmcm9tIFwiLi4vZXZlbnRUeXBlc1wiO1xuXG5mdW5jdGlvbiBvbk1vdXNlVXAobW91c2VVcEhhbmRsZXIsIGVsZW1lbnQpIHsgdGhpcy5vbkV2ZW50KE1PVVNFVVBfRVZFTlRfVFlQRSwgbW91c2VVcEhhbmRsZXIsIGVsZW1lbnQpOyB9XG5cbmZ1bmN0aW9uIG9mZk1vdXNlVXAobW91c2VVcEhhbmRsZXIsIGVsZW1lbnQpIHsgdGhpcy5vZmZFdmVudChNT1VTRVVQX0VWRU5UX1RZUEUsIG1vdXNlVXBIYW5kbGVyLCBlbGVtZW50KTsgfVxuXG5mdW5jdGlvbiBvbk1vdXNlT3V0KG1vdXNlT3V0SGFuZGxlciwgZWxlbWVudCkgeyB0aGlzLm9uRXZlbnQoTU9VU0VPVVRfRVZFTlRfVFlQRSwgbW91c2VPdXRIYW5kbGVyLCBlbGVtZW50KTsgfVxuXG5mdW5jdGlvbiBvZmZNb3VzZU91dChtb3VzZU91dEhhbmRsZXIsIGVsZW1lbnQpIHsgdGhpcy5vZmZFdmVudChNT1VTRU9VVF9FVkVOVF9UWVBFLCBtb3VzZU91dEhhbmRsZXIsIGVsZW1lbnQpOyB9XG5cbmZ1bmN0aW9uIG9uTW91c2VEb3duKG1vdXNlRG93bkhhbmRsZXIsIGVsZW1lbnQpIHsgdGhpcy5vbkV2ZW50KE1PVVNFRE9XTl9FVkVOVF9UWVBFLCBtb3VzZURvd25IYW5kbGVyLCBlbGVtZW50KTsgfVxuXG5mdW5jdGlvbiBvZmZNb3VzZURvd24obW91c2VEb3duSGFuZGxlciwgZWxlbWVudCkgeyB0aGlzLm9mZkV2ZW50KE1PVVNFRE9XTl9FVkVOVF9UWVBFLCBtb3VzZURvd25IYW5kbGVyLCBlbGVtZW50KTsgfVxuXG5mdW5jdGlvbiBvbk1vdXNlT3Zlcihtb3VzZU92ZXJIYW5kbGVyLCBlbGVtZW50KSB7IHRoaXMub25FdmVudChNT1VTRU9WRVJfRVZFTlRfVFlQRSwgbW91c2VPdmVySGFuZGxlciwgZWxlbWVudCk7IH1cblxuZnVuY3Rpb24gb2ZmTW91c2VPdmVyKG1vdXNlT3ZlckhhbmRsZXIsIGVsZW1lbnQpIHsgdGhpcy5vZmZFdmVudChNT1VTRU9WRVJfRVZFTlRfVFlQRSwgbW91c2VPdmVySGFuZGxlciwgZWxlbWVudCk7IH1cblxuZnVuY3Rpb24gb25Nb3VzZU1vdmUobW91c2VNb3ZlSGFuZGxlciwgZWxlbWVudCkgeyB0aGlzLm9uRXZlbnQoTU9VU0VNT1ZFX0VWRU5UX1RZUEUsIG1vdXNlTW92ZUhhbmRsZXIsIGVsZW1lbnQpOyB9XG5cbmZ1bmN0aW9uIG9mZk1vdXNlTW92ZShtb3VzZU1vdmVIYW5kbGVyLCBlbGVtZW50KSB7IHRoaXMub2ZmRXZlbnQoTU9VU0VNT1ZFX0VWRU5UX1RZUEUsIG1vdXNlTW92ZUhhbmRsZXIsIGVsZW1lbnQpOyB9XG5cbmNvbnN0IG1vdXNlTWl4aW5zID0ge1xuICBvbk1vdXNlVXAsXG4gIG9mZk1vdXNlVXAsXG4gIG9uTW91c2VPdXQsXG4gIG9mZk1vdXNlT3V0LFxuICBvbk1vdXNlRG93bixcbiAgb2ZmTW91c2VEb3duLFxuICBvbk1vdXNlT3ZlcixcbiAgb2ZmTW91c2VPdmVyLFxuICBvbk1vdXNlTW92ZSxcbiAgb2ZmTW91c2VNb3ZlXG59O1xuXG5leHBvcnQgZGVmYXVsdCBtb3VzZU1peGlucztcbiIsICJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgQ0xJQ0tfRVZFTlRfVFlQRSwgREJMQ0xJQ0tfRVZFTlRfVFlQRSwgQVVYQ0xJQ0tfRVZFTlRfVFlQRSB9IGZyb20gXCIuLi9ldmVudFR5cGVzXCI7XG5cbmZ1bmN0aW9uIG9uQ2xpY2soY2xpY2tIYW5kbGVyLCBlbGVtZW50KSB7IHRoaXMub25FdmVudChDTElDS19FVkVOVF9UWVBFLCBjbGlja0hhbmRsZXIsIGVsZW1lbnQpOyB9XG5cbmZ1bmN0aW9uIG9mZkNsaWNrKGNsaWNrSGFuZGxlciwgZWxlbWVudCkgeyB0aGlzLm9mZkV2ZW50KENMSUNLX0VWRU5UX1RZUEUsIGNsaWNrSGFuZGxlciwgZWxlbWVudCk7IH1cblxuZnVuY3Rpb24gb25BdXhDbGljayhhdXhDbGlja0hhbmRsZXIsIGVsZW1lbnQpIHsgdGhpcy5vbkV2ZW50KEFVWENMSUNLX0VWRU5UX1RZUEUsIGF1eENsaWNrSGFuZGxlciwgZWxlbWVudCk7IH1cblxuZnVuY3Rpb24gb2ZmQXV4Q2xpY2soYXV4Q2xpY2tIYW5kbGVyLCBlbGVtZW50KSB7IHRoaXMub2ZmRXZlbnQoQVVYQ0xJQ0tfRVZFTlRfVFlQRSwgYXV4Q2xpY2tIYW5kbGVyLCBlbGVtZW50KTsgfVxuXG5mdW5jdGlvbiBvbkRvdWJsZUNsaWNrKGRvdWJsZUNsaWNrSGFuZGxlciwgZWxlbWVudCkgeyB0aGlzLm9uRXZlbnQoREJMQ0xJQ0tfRVZFTlRfVFlQRSwgZG91YmxlQ2xpY2tIYW5kbGVyLCBlbGVtZW50KTsgfSAvLy9cblxuZnVuY3Rpb24gb2ZmRG91YmxlQ2xpY2soZG91YmxlQ2xpY2tIYW5kbGVyLCBlbGVtZW50KSB7IHRoaXMub2ZmRXZlbnQoREJMQ0xJQ0tfRVZFTlRfVFlQRSwgZG91YmxlQ2xpY2tIYW5kbGVyLCBlbGVtZW50KTsgfSAvLy9cblxuY29uc3QgY2xpY2tNaXhpbnMgPSB7XG4gIG9uQ2xpY2ssXG4gIG9mZkNsaWNrLFxuICBvbkF1eENsaWNrLFxuICBvZmZBdXhDbGljayxcbiAgb25Eb3VibGVDbGljayxcbiAgb2ZmRG91YmxlQ2xpY2tcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsaWNrTWl4aW5zO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBUT1VDSFNUQVJUX0VWRU5UX1RZUEUsIFRPVUNITU9WRV9FVkVOVF9UWVBFLCBUT1VDSEVORF9FVkVOVF9UWVBFIH0gZnJvbSBcIi4uL2V2ZW50VHlwZXNcIjtcblxuZnVuY3Rpb24gb25Ub3VjaFN0YXJ0KHRvdWNoU3RhcnRIYW5kbGVyKSB7IHRoaXMub25FdmVudChUT1VDSFNUQVJUX0VWRU5UX1RZUEUsIHRvdWNoU3RhcnRIYW5kbGVyKTsgfVxuXG5mdW5jdGlvbiBvZmZUb3VjaFN0YXJ0KHRvdWNoU3RhcnRIYW5kbGVyKSB7IHRoaXMub2ZmRXZlbnQoVE9VQ0hTVEFSVF9FVkVOVF9UWVBFLCB0b3VjaFN0YXJ0SGFuZGxlcik7IH1cblxuZnVuY3Rpb24gb25Ub3VjaE1vdmUodG91Y2hTdGFydEhhbmRsZXIpIHsgdGhpcy5vbkV2ZW50KFRPVUNITU9WRV9FVkVOVF9UWVBFLCB0b3VjaFN0YXJ0SGFuZGxlcik7IH1cblxuZnVuY3Rpb24gb2ZmVG91Y2hNb3ZlKHRvdWNoU3RhcnRIYW5kbGVyKSB7IHRoaXMub2ZmRXZlbnQoVE9VQ0hNT1ZFX0VWRU5UX1RZUEUsIHRvdWNoU3RhcnRIYW5kbGVyKTsgfVxuXG5mdW5jdGlvbiBvblRvdWNoRW5kKHRvdWNoU3RhcnRIYW5kbGVyKSB7IHRoaXMub25FdmVudChUT1VDSEVORF9FVkVOVF9UWVBFLCB0b3VjaFN0YXJ0SGFuZGxlcik7IH1cblxuZnVuY3Rpb24gb2ZmVG91Y2hFbmQodG91Y2hTdGFydEhhbmRsZXIpIHsgdGhpcy5vZmZFdmVudChUT1VDSEVORF9FVkVOVF9UWVBFLCB0b3VjaFN0YXJ0SGFuZGxlcik7IH1cblxuY29uc3QgY2xpY2tNaXhpbnMgPSB7XG4gIG9uVG91Y2hTdGFydCxcbiAgb2ZmVG91Y2hTdGFydCxcbiAgb25Ub3VjaE1vdmUsXG4gIG9mZlRvdWNoTW92ZSxcbiAgb25Ub3VjaEVuZCxcbiAgb2ZmVG91Y2hFbmRcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsaWNrTWl4aW5zO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBTQ1JPTExfRVZFTlRfVFlQRSB9IGZyb20gXCIuLi9ldmVudFR5cGVzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBvblNjcm9sbChzY3JvbGxIYW5kbGVyLCBlbGVtZW50KSB7IHRoaXMub25FdmVudChTQ1JPTExfRVZFTlRfVFlQRSwgc2Nyb2xsSGFuZGxlciwgZWxlbWVudCk7IH1cblxuZXhwb3J0IGZ1bmN0aW9uIG9mZlNjcm9sbChzY3JvbGxIYW5kbGVyLCBlbGVtZW50KSB7IHRoaXMub2ZmRXZlbnQoU0NST0xMX0VWRU5UX1RZUEUsIHNjcm9sbEhhbmRsZXIsIGVsZW1lbnQpOyB9XG5cbmZ1bmN0aW9uIHNjcm9sbFRvKHNjcm9sbFRvcCwgc2Nyb2xsTGVmdCkgeyB0aGlzLmRvbUVsZW1lbnQuc2Nyb2xsVG8oc2Nyb2xsTGVmdCwgc2Nyb2xsVG9wKTsgfSAvLy9cblxuZnVuY3Rpb24gZ2V0U2Nyb2xsVG9wKCkgeyByZXR1cm4gdGhpcy5kb21FbGVtZW50LnNjcm9sbFRvcDsgfVxuXG5mdW5jdGlvbiBnZXRTY3JvbGxMZWZ0KCkgeyByZXR1cm4gdGhpcy5kb21FbGVtZW50LnNjcm9sbExlZnQ7IH1cblxuZnVuY3Rpb24gZ2V0U2Nyb2xsV2lkdGgoKSB7IHJldHVybiB0aGlzLmRvbUVsZW1lbnQuc2Nyb2xsV2lkdGg7IH1cblxuZnVuY3Rpb24gZ2V0U2Nyb2xsSGVpZ2h0KCkgeyByZXR1cm4gdGhpcy5kb21FbGVtZW50LnNjcm9sbEhlaWdodDsgfVxuXG5mdW5jdGlvbiBzZXRTY3JvbGxUb3Aoc2Nyb2xsVG9wKSB7IHRoaXMuZG9tRWxlbWVudC5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7IH1cblxuZnVuY3Rpb24gc2V0U2Nyb2xsTGVmdChzY3JvbGxMZWZ0KSB7IHRoaXMuZG9tRWxlbWVudC5zY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdDsgfVxuXG5jb25zdCBzY3JvbGxNaXhpbnMgPSB7XG4gIG9uU2Nyb2xsLFxuICBvZmZTY3JvbGwsXG4gIHNjcm9sbFRvLFxuICBnZXRTY3JvbGxUb3AsXG4gIGdldFNjcm9sbExlZnQsXG4gIGdldFNjcm9sbFdpZHRoLFxuICBnZXRTY3JvbGxIZWlnaHQsXG4gIHNldFNjcm9sbFRvcCxcbiAgc2V0U2Nyb2xsTGVmdFxufTtcblxuZXhwb3J0IGRlZmF1bHQgc2Nyb2xsTWl4aW5zO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBSRVNJWkVfRVZFTlRfVFlQRSB9IGZyb20gXCIuLi9ldmVudFR5cGVzXCI7XG5cbmZ1bmN0aW9uIG9uUmVzaXplKHJlc2l6ZUhhbmRsZXIsIGVsZW1lbnQpIHsgdGhpcy5vbkV2ZW50KFJFU0laRV9FVkVOVF9UWVBFLCByZXNpemVIYW5kbGVyLCBlbGVtZW50KTsgfVxuXG5mdW5jdGlvbiBvZmZSZXNpemUocmVzaXplSGFuZGxlciwgZWxlbWVudCkgeyB0aGlzLm9mZkV2ZW50KFJFU0laRV9FVkVOVF9UWVBFLCByZXNpemVIYW5kbGVyLCBlbGVtZW50KTsgfVxuXG5jb25zdCByZXNpemVNaXhpbnMgPSB7XG4gIG9uUmVzaXplLFxuICBvZmZSZXNpemVcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlc2l6ZU1peGlucztcbiIsICJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgRlVMTFNDUkVFTkNIQU5HRV9FVkVOVF9UWVBFIH0gZnJvbSBcIi4uL2V2ZW50VHlwZXNcIjtcblxuZnVuY3Rpb24gb25GdWxsU2NyZWVuQ2hhbmdlKGZ1bGxTY3JlZW5DaGFuZ2VIYW5kbGVyLCBlbGVtZW50KSB7IHRoaXMub25FdmVudChGVUxMU0NSRUVOQ0hBTkdFX0VWRU5UX1RZUEUsIGZ1bGxTY3JlZW5DaGFuZ2VIYW5kbGVyLCBlbGVtZW50KTsgfSAgLy8vXG5cbmZ1bmN0aW9uIG9mZkZ1bGxTY3JlZW5DaGFuZ2UoZnVsbFNjcmVlbkNoYW5nZUhhbmRsZXIsIGVsZW1lbnQpIHsgdGhpcy5vZmZFdmVudChGVUxMU0NSRUVOQ0hBTkdFX0VWRU5UX1RZUEUsIGZ1bGxTY3JlZW5DaGFuZ2VIYW5kbGVyLCBlbGVtZW50KTsgfSAgLy8vXG5cbmZ1bmN0aW9uIHJlcXVlc3RGdWxsU2NyZWVuKGVycm9ySGFuZGxlcikge1xuICBjb25zdCBkb21FbGVtZW50ID0gdGhpcy5nZXRET01FbGVtZW50KCk7XG5cbiAgZG9tRWxlbWVudC5yZXF1ZXN0RnVsbHNjcmVlbigpXG4gICAgLmNhdGNoKGVycm9ySGFuZGxlcik7XG59XG5cbmZ1bmN0aW9uIGV4aXRGdWxsU2NyZWVuKCkge1xuICBkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpO1xufVxuXG5mdW5jdGlvbiBpc0Z1bGxTY3JlZW4oKSB7XG4gIGNvbnN0IHsgZnVsbHNjcmVlbkVsZW1lbnQgfSA9IGRvY3VtZW50LFxuICAgICAgICBmdWxsU2NyZWVuID0gKGZ1bGxzY3JlZW5FbGVtZW50ICE9PSBudWxsKTtcblxuICByZXR1cm4gZnVsbFNjcmVlbjtcbn1cblxuY29uc3QgZnVsbHNjcmVlbk1peGlucyA9IHtcbiAgb25GdWxsU2NyZWVuQ2hhbmdlLFxuICBvZmZGdWxsU2NyZWVuQ2hhbmdlLFxuICByZXF1ZXN0RnVsbFNjcmVlbixcbiAgZXhpdEZ1bGxTY3JlZW4sXG4gIGlzRnVsbFNjcmVlblxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVsbHNjcmVlbk1peGlucztcbiIsICJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2goYXJyYXksIG9wZXJhdGlvbiwgZG9uZSwgY29udGV4dCkge1xuICBjb25zdCBsZW5ndGggPSBhcnJheS5sZW5ndGg7ICAvLy9cblxuICBsZXQgY291bnQgPSAtMTtcblxuICBmdW5jdGlvbiBuZXh0KCkge1xuICAgIGNvdW50Kys7XG5cbiAgICBjb25zdCB0ZXJtaW5hdGUgPSAoY291bnQgPT09IGxlbmd0aCk7XG5cbiAgICBpZiAodGVybWluYXRlKSB7XG4gICAgICBkb25lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gY291bnQsICAvLy9cbiAgICAgICAgICAgIGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICAgIG9wZXJhdGlvbihlbGVtZW50LCBuZXh0LCBkb25lLCBjb250ZXh0LCBpbmRleCk7XG4gICAgfVxuICB9XG5cbiAgbmV4dCgpO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBTUEFDRSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGZvckVhY2ggfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2FzeW5jXCI7XG5cbmZ1bmN0aW9uIG9uQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlcywgY3VzdG9tSGFuZGxlciwgZWxlbWVudCA9IHRoaXMpIHtcbiAgY3VzdG9tRXZlbnRUeXBlcyA9IGN1c3RvbUV2ZW50VHlwZXMuc3BsaXQoU1BBQ0UpOyAvLy9cblxuICBjdXN0b21FdmVudFR5cGVzLmZvckVhY2goKGN1c3RvbUV2ZW50VHlwZSkgPT4ge1xuICAgIHRoaXMuYWRkQ3VzdG9tRXZlbnRMaXN0ZW5lcihjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gb2ZmQ3VzdG9tRXZlbnQoY3VzdG9tRXZlbnRUeXBlcywgY3VzdG9tSGFuZGxlciwgZWxlbWVudCA9IHRoaXMpIHtcbiAgY3VzdG9tRXZlbnRUeXBlcyA9IGN1c3RvbUV2ZW50VHlwZXMuc3BsaXQoU1BBQ0UpOyAvLy9cblxuICBjdXN0b21FdmVudFR5cGVzLmZvckVhY2goKGN1c3RvbUV2ZW50VHlwZSkgPT4ge1xuICAgIHRoaXMucmVtb3ZlQ3VzdG9tRXZlbnRMaXN0ZW5lcihjdXN0b21FdmVudFR5cGUsIGN1c3RvbUhhbmRsZXIsIGVsZW1lbnQpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY2FsbEN1c3RvbUhhbmRsZXJzKGN1c3RvbUV2ZW50VHlwZSwgLi4ucmVtYWluaW5nQXJndW1lbnRzKSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50TGlzdGVuZXJzID0gdGhpcy5maW5kQ3VzdG9tRXZlbnRMaXN0ZW5lcnMoY3VzdG9tRXZlbnRUeXBlKTtcblxuICBjdXN0b21FdmVudExpc3RlbmVycy5mb3JFYWNoKChjdXN0b21FdmVudExpc3RlbmVyKSA9PiB7XG4gICAgY29uc3QgeyBjdXN0b21IYW5kbGVyLCBlbGVtZW50OiBjdXN0b21IYW5kbGVyRWxlbWVudCB9ID0gY3VzdG9tRXZlbnRMaXN0ZW5lcjsgLy8vXG5cbiAgICBjdXN0b21IYW5kbGVyLmNhbGwoY3VzdG9tSGFuZGxlckVsZW1lbnQsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjYWxsQ3VzdG9tSGFuZGxlcnNBc3luYyhjdXN0b21FdmVudFR5cGUsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cykge1xuICBjb25zdCBjdXN0b21FdmVudExpc3RlbmVycyA9IHRoaXMuZmluZEN1c3RvbUV2ZW50TGlzdGVuZXJzKGN1c3RvbUV2ZW50VHlwZSksXG4gICAgICAgIGRvbmUgPSByZW1haW5pbmdBcmd1bWVudHMucG9wKCk7ICAvLy9cblxuICBmb3JFYWNoKGN1c3RvbUV2ZW50TGlzdGVuZXJzLCAoY3VzdG9tRXZlbnRMaXN0ZW5lciwgbmV4dCkgPT4ge1xuICAgIGNvbnN0IHsgY3VzdG9tSGFuZGxlciwgZWxlbWVudDogY3VzdG9tSGFuZGxlckVsZW1lbnQgfSA9IGN1c3RvbUV2ZW50TGlzdGVuZXIsXG4gICAgICAgICAgZG9uZSA9IG5leHQ7ICAvLy9cblxuICAgIGN1c3RvbUhhbmRsZXIuY2FsbChjdXN0b21IYW5kbGVyRWxlbWVudCwgLi4ucmVtYWluaW5nQXJndW1lbnRzLCBkb25lKTtcbiAgfSwgZG9uZSk7XG59XG5cbmZ1bmN0aW9uIGFkZEN1c3RvbUV2ZW50TGlzdGVuZXIoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50TGlzdGVuZXIgPSB0aGlzLmNyZWF0ZUN1c3RvbUV2ZW50TGlzdGVuZXIoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KTtcblxuICBpZiAoIXRoaXMuY3VzdG9tRXZlbnRMaXN0ZW5lcnMpIHtcbiAgICB0aGlzLmN1c3RvbUV2ZW50TGlzdGVuZXJzID0gW107XG4gIH1cblxuICB0aGlzLmN1c3RvbUV2ZW50TGlzdGVuZXJzLnB1c2goY3VzdG9tRXZlbnRMaXN0ZW5lcik7XG5cbiAgcmV0dXJuIGN1c3RvbUV2ZW50TGlzdGVuZXI7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUN1c3RvbUV2ZW50TGlzdGVuZXIoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGNvbnN0IGN1c3RvbUV2ZW50TGlzdGVuZXIgPSB0aGlzLmZpbmRDdXN0b21FdmVudExpc3RlbmVyKGN1c3RvbUV2ZW50VHlwZSwgY3VzdG9tSGFuZGxlciwgZWxlbWVudCksXG4gICAgICAgIGluZGV4ID0gdGhpcy5jdXN0b21FdmVudExpc3RlbmVycy5pbmRleE9mKGN1c3RvbUV2ZW50TGlzdGVuZXIpLFxuICAgICAgICBzdGFydCA9IGluZGV4LCAgLy8vXG4gICAgICAgIGRlbGV0ZUNvdW50ID0gMTtcblxuICB0aGlzLmN1c3RvbUV2ZW50TGlzdGVuZXJzLnNwbGljZShzdGFydCwgZGVsZXRlQ291bnQpO1xuXG4gIGlmICh0aGlzLmN1c3RvbUV2ZW50TGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSB0aGlzLmN1c3RvbUV2ZW50TGlzdGVuZXJzO1xuICB9XG5cbiAgcmV0dXJuIGN1c3RvbUV2ZW50TGlzdGVuZXI7XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXN0b21FdmVudExpc3RlbmVyKGN1c3RvbUV2ZW50VHlwZSwgY3VzdG9tSGFuZGxlciwgZWxlbWVudCkge1xuICBjb25zdCBjdXN0b21FdmVudExpc3RlbmVyID0gdGhpcy5jdXN0b21FdmVudExpc3RlbmVycy5maW5kKChjdXN0b21FdmVudExpc3RlbmVyKSA9PiB7XG4gICAgaWYgKChjdXN0b21FdmVudExpc3RlbmVyLmVsZW1lbnQgPT09IGVsZW1lbnQpICYmIChjdXN0b21FdmVudExpc3RlbmVyLmN1c3RvbUhhbmRsZXIgPT09IGN1c3RvbUhhbmRsZXIpICYmIChjdXN0b21FdmVudExpc3RlbmVyLmN1c3RvbUV2ZW50VHlwZSA9PT0gY3VzdG9tRXZlbnRUeXBlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY3VzdG9tRXZlbnRMaXN0ZW5lcjtcbn1cblxuZnVuY3Rpb24gZmluZEN1c3RvbUV2ZW50TGlzdGVuZXJzKGN1c3RvbUV2ZW50VHlwZSkge1xuICBjb25zdCBjdXN0b21FdmVudExpc3RlbmVycyA9IFtdO1xuXG4gIGlmICh0aGlzLmN1c3RvbUV2ZW50TGlzdGVuZXJzKSB7XG4gICAgdGhpcy5jdXN0b21FdmVudExpc3RlbmVycy5mb3JFYWNoKChjdXN0b21FdmVudExpc3RlbmVyKSA9PiB7XG4gICAgICBjb25zdCBmb3VuZCA9IChjdXN0b21FdmVudExpc3RlbmVyLmN1c3RvbUV2ZW50VHlwZSA9PT0gY3VzdG9tRXZlbnRUeXBlKTtcblxuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIGN1c3RvbUV2ZW50TGlzdGVuZXJzLnB1c2goY3VzdG9tRXZlbnRMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gY3VzdG9tRXZlbnRMaXN0ZW5lcnM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUN1c3RvbUV2ZW50TGlzdGVuZXIoY3VzdG9tRXZlbnRUeXBlLCBjdXN0b21IYW5kbGVyLCBlbGVtZW50KSB7XG4gIGxldCBjdXN0b21FdmVudExpc3RlbmVyO1xuXG4gIGN1c3RvbUV2ZW50TGlzdGVuZXIgPSAoKSA9PiB7fTsgLy8vXG5cbiAgT2JqZWN0LmFzc2lnbihjdXN0b21FdmVudExpc3RlbmVyLCB7XG4gICAgZWxlbWVudCxcbiAgICBjdXN0b21IYW5kbGVyLFxuICAgIGN1c3RvbUV2ZW50VHlwZVxuICB9KTtcblxuICByZXR1cm4gY3VzdG9tRXZlbnRMaXN0ZW5lcjtcbn1cblxuY29uc3QgY3VzdG9tRXZlbnRNaXhpbnMgPSB7XG4gIG9uQ3VzdG9tRXZlbnQsXG4gIG9mZkN1c3RvbUV2ZW50LFxuICBjYWxsQ3VzdG9tSGFuZGxlcnMsXG4gIGNhbGxDdXN0b21IYW5kbGVyc0FzeW5jLFxuICBhZGRDdXN0b21FdmVudExpc3RlbmVyLFxuICByZW1vdmVDdXN0b21FdmVudExpc3RlbmVyLFxuICBmaW5kQ3VzdG9tRXZlbnRMaXN0ZW5lcixcbiAgZmluZEN1c3RvbUV2ZW50TGlzdGVuZXJzLFxuICBjcmVhdGVDdXN0b21FdmVudExpc3RlbmVyXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjdXN0b21FdmVudE1peGlucztcbiIsICJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IE9mZnNldCBmcm9tIFwiLi9vZmZzZXRcIjtcbmltcG9ydCBCb3VuZHMgZnJvbSBcIi4vYm91bmRzXCI7XG5pbXBvcnQganN4TWl4aW5zIGZyb20gXCIuL21peGlucy9qc3hcIjtcbmltcG9ydCBrZXlNaXhpbnMgZnJvbSBcIi4vbWl4aW5zL2tleVwiO1xuaW1wb3J0IHN0YXRlTWl4aW5zIGZyb20gXCIuL21peGlucy9zdGF0ZVwiO1xuaW1wb3J0IGV2ZW50TWl4aW5zIGZyb20gXCIuL21peGlucy9ldmVudFwiO1xuaW1wb3J0IG1vdXNlTWl4aW5zIGZyb20gXCIuL21peGlucy9tb3VzZVwiO1xuaW1wb3J0IGNsaWNrTWl4aW5zIGZyb20gXCIuL21peGlucy9jbGlja1wiO1xuaW1wb3J0IHRvdWNoTWl4aW5zIGZyb20gXCIuL21peGlucy90b3VjaFwiO1xuaW1wb3J0IHNjcm9sbE1peGlucyBmcm9tIFwiLi9taXhpbnMvc2Nyb2xsXCI7XG5pbXBvcnQgcmVzaXplTWl4aW5zIGZyb20gXCIuL21peGlucy9yZXNpemVcIjtcbmltcG9ydCBlbGVtZW50TWl4aW5zIGZyb20gXCIuL21peGlucy9lbGVtZW50XCI7XG5pbXBvcnQgZnVsbFNjcmVlbk1peGlucyBmcm9tIFwiLi9taXhpbnMvZnVsbFNjcmVlblwiO1xuaW1wb3J0IGN1c3RvbUV2ZW50TWl4aW5zIGZyb20gXCIuL21peGlucy9jdXN0b21FdmVudFwiO1xuXG5pbXBvcnQgeyBhdWdtZW50IH0gZnJvbSBcIi4vdXRpbGl0aWVzL2FycmF5XCI7XG5pbXBvcnQgeyBjb21iaW5lIH0gZnJvbSBcIi4vdXRpbGl0aWVzL29iamVjdFwiO1xuaW1wb3J0IHsgaXNTVkdUYWdOYW1lIH0gZnJvbSBcIi4vdXRpbGl0aWVzL25hbWVcIjtcbmltcG9ydCB7IGNvbnN0cnVjdEVsZW1lbnQsIGRlc3Ryb3lFbGVtZW50LCBtb3VudEVsZW1lbnQsIHVubW91bnRFbGVtZW50IH0gZnJvbSBcIi4vdXRpbGl0aWVzL2VsZW1lbnRcIjtcbmltcG9ydCB7IE5PTkUsXG4gICAgICAgICBCTE9DSyxcbiAgICAgICAgIFdJRFRILFxuICAgICAgICAgU1RSSU5HLFxuICAgICAgICAgSEVJR0hULFxuICAgICAgICAgRElTUExBWSxcbiAgICAgICAgIERJU0FCTEVELFxuICAgICAgICAgRU1QVFlfU1RSSU5HLFxuICAgICAgICAgU1ZHX05BTUVTUEFDRV9VUkksXG4gICAgICAgICBERUZBVUxUX1BST1BFUlRJRVMsXG4gICAgICAgICBJR05PUkVEX1BST1BFUlRJRVMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHNlbGVjdG9yKSB7XG4gICAgaWYgKHNlbGVjdG9yICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID10aGlzLCAgLy8vXG4gICAgICAgICAgICBkb21FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG5cbiAgICAgIGNvbnN0cnVjdEVsZW1lbnQoZWxlbWVudCwgZG9tRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RE9NRWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5kb21FbGVtZW50O1xuICB9XG5cbiAgZ2V0T2Zmc2V0KCkge1xuICAgIGNvbnN0IG9mZnNldCA9IE9mZnNldC5mcm9tRE9NRWxlbWVudCh0aGlzLmRvbUVsZW1lbnQpO1xuXG4gICAgcmV0dXJuIG9mZnNldDtcbiAgfVxuXG4gIGdldEJvdW5kcygpIHtcbiAgICBjb25zdCBib3VuZHMgPSBCb3VuZHMuZnJvbURPTUVsZW1lbnQodGhpcy5kb21FbGVtZW50KTtcblxuICAgIHJldHVybiBib3VuZHM7XG4gIH1cblxuICBnZXRXaWR0aCgpIHsgcmV0dXJuIHRoaXMuZG9tRWxlbWVudC5vZmZzZXRXaWR0aDsgfSAgLy8vXG5cbiAgZ2V0SGVpZ2h0KCkgeyByZXR1cm4gdGhpcy5kb21FbGVtZW50Lm9mZnNldEhlaWdodDsgfSAgLy8vXG5cbiAgZ2V0SW5uZXJXaWR0aCgpIHsgcmV0dXJuIHRoaXMuZG9tRWxlbWVudC5jbGllbnRXaWR0aDsgfSAvLy9cblxuICBnZXRJbm5lckhlaWdodCgpIHsgcmV0dXJuIHRoaXMuZG9tRWxlbWVudC5jbGllbnRIZWlnaHQ7IH0gLy8vXG5cbiAgc2V0V2lkdGgod2lkdGgpIHtcbiAgICB3aWR0aCA9IGAke3dpZHRofXB4YDsgLy8vXG5cbiAgICB0aGlzLnN0eWxlKFdJRFRILCB3aWR0aCk7XG4gIH1cblxuICBzZXRIZWlnaHQoaGVpZ2h0KSB7XG4gICAgaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDsgLy8vXG5cbiAgICB0aGlzLnN0eWxlKEhFSUdIVCwgaGVpZ2h0KTtcbiAgfVxuXG4gIGhhc0F0dHJpYnV0ZShuYW1lKSB7IHJldHVybiB0aGlzLmRvbUVsZW1lbnQuaGFzQXR0cmlidXRlKG5hbWUpOyB9XG5cbiAgZ2V0QXR0cmlidXRlKG5hbWUpIHsgcmV0dXJuIHRoaXMuZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUobmFtZSk7IH1cblxuICBzZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpIHsgdGhpcy5kb21FbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7IH1cblxuICBjbGVhckF0dHJpYnV0ZShuYW1lKSB7IHRoaXMuZG9tRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7IH1cblxuICBhZGRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpIHsgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOyB9XG5cbiAgcmVtb3ZlQXR0cmlidXRlKG5hbWUpIHsgdGhpcy5jbGVhckF0dHJpYnV0ZShuYW1lKTsgfVxuXG4gIGhhc0NsYXNzKGNsYXNzTmFtZSkgeyByZXR1cm4gdGhpcy5kb21FbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpOyB9XG5cbiAgc2V0Q2xhc3MoY2xhc3NOYW1lKSB7IHRoaXMuZG9tRWxlbWVudC5jbGFzc05hbWUgPSBjbGFzc05hbWU7IH1cblxuICBhZGRDbGFzcyhjbGFzc05hbWUpIHsgdGhpcy5kb21FbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTsgfVxuXG4gIHJlbW92ZUNsYXNzKGNsYXNzTmFtZSkgeyB0aGlzLmRvbUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpOyB9XG5cbiAgdG9nZ2xlQ2xhc3MoY2xhc3NOYW1lKSB7IHRoaXMuZG9tRWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKGNsYXNzTmFtZSk7IH1cblxuICByZW1vdmVBbGxDbGFzc2VzKCkgeyB0aGlzLmRvbUVsZW1lbnQuY2xhc3NOYW1lID0gRU1QVFlfU1RSSU5HOyB9XG5cbiAgYWRkVG8ocGFyZW50RWxlbWVudCkgeyBwYXJlbnRFbGVtZW50LmFkZCh0aGlzKTsgfVxuXG4gIGFwcGVuZFRvKHBhcmVudEVsZW1lbnQpIHsgcGFyZW50RWxlbWVudC5hcHBlbmQodGhpcyk7IH1cblxuICBwcmVwZW5kVG8ocGFyZW50RWxlbWVudCkgeyBwYXJlbnRFbGVtZW50LnByZXBlbmQodGhpcyk7IH1cblxuICByZW1vdmVGcm9tKHBhcmVudEVsZW1lbnQpIHsgcGFyZW50RWxlbWVudC5yZW1vdmUodGhpcyk7IH1cblxuICBpbnNlcnQoZWxlbWVudCkgeyB0aGlzLmFwcGVuZChlbGVtZW50KTsgfVxuXG4gIGFkZChlbGVtZW50KSB7IHRoaXMuYXBwZW5kKGVsZW1lbnQpOyB9XG5cbiAgcmVtb3ZlKGVsZW1lbnQpIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgZWxlbWVudC5yZW1vdmUoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZG9tRWxlbWVudC5yZW1vdmUoKTtcbiAgfVxuXG4gIHByZXBlbmQoZWxlbWVudCkge1xuICAgIGNvbnN0IGRvbUVsZW1lbnQgPSBlbGVtZW50LmRvbUVsZW1lbnQsXG4gICAgICAgICAgcmVmZXJlbmNlRE9NRWxlbWVudCA9IHRoaXMuZG9tRWxlbWVudC5maXJzdENoaWxkOyAgLy8vXG5cbiAgICB0aGlzLmRvbUVsZW1lbnQuaW5zZXJ0QmVmb3JlKGRvbUVsZW1lbnQsIHJlZmVyZW5jZURPTUVsZW1lbnQpO1xuICB9XG5cbiAgYXBwZW5kKGVsZW1lbnQpIHtcbiAgICBjb25zdCBkb21FbGVtZW50ID0gZWxlbWVudC5kb21FbGVtZW50LFxuICAgICAgICAgIHJlZmVyZW5jZURPTUVsZW1lbnQgPSBudWxsOyAvLy9cblxuICAgIHRoaXMuZG9tRWxlbWVudC5pbnNlcnRCZWZvcmUoZG9tRWxlbWVudCwgcmVmZXJlbmNlRE9NRWxlbWVudCk7XG4gIH1cblxuICBpbnNlcnRCZWZvcmUoc2libGluZ0VsZW1lbnQpIHtcbiAgICBjb25zdCBwYXJlbnRET01Ob2RlID0gc2libGluZ0VsZW1lbnQuZG9tRWxlbWVudC5wYXJlbnROb2RlLCAvLy9cbiAgICAgICAgICByZWZlcmVuY2VET01FbGVtZW50ID0gc2libGluZ0VsZW1lbnQuZG9tRWxlbWVudDsgIC8vL1xuXG4gICAgcGFyZW50RE9NTm9kZS5pbnNlcnRCZWZvcmUodGhpcy5kb21FbGVtZW50LCByZWZlcmVuY2VET01FbGVtZW50KTtcbiAgfVxuXG4gIGluc2VydEFmdGVyKHNpYmxpbmdFbGVtZW50KSB7XG4gICAgY29uc3QgcGFyZW50RE9NTm9kZSA9IHNpYmxpbmdFbGVtZW50LmRvbUVsZW1lbnQucGFyZW50Tm9kZSwgLy8vXG4gICAgICAgICAgcmVmZXJlbmNlRE9NRWxlbWVudCA9IHNpYmxpbmdFbGVtZW50LmRvbUVsZW1lbnQubmV4dFNpYmxpbmc7ICAvLy9cblxuICAgIHBhcmVudERPTU5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuZG9tRWxlbWVudCwgcmVmZXJlbmNlRE9NRWxlbWVudCk7XG4gIH1cblxuICBtb3VudChlbGVtZW50KSB7XG4gICAgdGhpcy5hZGQoZWxlbWVudCk7XG5cbiAgICBtb3VudEVsZW1lbnQoZWxlbWVudCk7XG4gIH1cblxuICB1bm1vdW50KGVsZW1lbnQpIHtcbiAgICB1bm1vdW50RWxlbWVudChlbGVtZW50KTtcblxuICAgIHRoaXMucmVtb3ZlKGVsZW1lbnQpO1xuICB9XG5cbiAgbW91bnRCZWZvcmUoc2libGluZ0VsZW1lbnQpIHtcbiAgICB0aGlzLmluc2VydEJlZm9yZShzaWJsaW5nRWxlbWVudCk7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpczsgLy8vXG5cbiAgICBtb3VudEVsZW1lbnQoZWxlbWVudCk7XG4gIH1cblxuICBtb3VudEFmdGVyKHNpYmxpbmdFbGVtZW50KSB7XG4gICAgdGhpcy5pbnNlcnRBZnRlcihzaWJsaW5nRWxlbWVudCk7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpczsgLy8vXG5cbiAgICBtb3VudEVsZW1lbnQoZWxlbWVudCk7XG4gIH1cblxuICBzaG93KGRpc3BsYXlTdHlsZSA9IEJMT0NLKSB7IHRoaXMuZGlzcGxheShkaXNwbGF5U3R5bGUpOyB9XG5cbiAgaGlkZSgpIHsgdGhpcy5zdHlsZShESVNQTEFZLCBOT05FKTsgfVxuXG4gIGRpc3BsYXkoZGlzcGxheSkgeyB0aGlzLnN0eWxlKERJU1BMQVksIGRpc3BsYXkpOyB9XG5cbiAgZW5hYmxlKCkgeyB0aGlzLmNsZWFyQXR0cmlidXRlKERJU0FCTEVEKTsgfVxuXG4gIGRpc2FibGUoKSB7IHRoaXMuc2V0QXR0cmlidXRlKERJU0FCTEVELCBESVNBQkxFRCk7IH1cblxuICBpc0VuYWJsZWQoKSB7XG4gICAgY29uc3QgZGlzYWJsZWQgPSB0aGlzLmlzRGlzYWJsZWQoKSxcbiAgICAgICAgICBlbmFibGVkID0gIWRpc2FibGVkO1xuXG4gICAgcmV0dXJuIGVuYWJsZWQ7XG4gIH1cblxuICBpc0Rpc2FibGVkKCkge1xuICAgIGNvbnN0IGRpc2FibGVkID0gdGhpcy5oYXNBdHRyaWJ1dGUoRElTQUJMRUQpO1xuXG4gICAgcmV0dXJuIGRpc2FibGVkO1xuICB9XG4gIFxuICBpc0Rpc3BsYXllZCgpIHtcbiAgICBjb25zdCBkaXNwbGF5ID0gdGhpcy5jc3MoRElTUExBWSksXG4gICAgICAgICAgZGlzcGxheWVkID0gKGRpc3BsYXkgIT09IE5PTkUpO1xuICAgIFxuICAgIHJldHVybiBkaXNwbGF5ZWQ7XG4gIH1cblxuICBpc1Nob3dpbmcoKSB7XG4gICAgY29uc3QgZGlzcGxheWVkID0gdGhpcy5pc0Rpc3BsYXllZCgpLFxuICAgICAgICAgIHNob3dpbmcgPSBkaXNwbGF5ZWQ7ICAvLy9cblxuICAgIHJldHVybiBzaG93aW5nO1xuICB9XG5cbiAgaXNIaWRkZW4oKSB7XG4gICAgY29uc3QgZGlzcGxheWVkID0gdGhpcy5pc0Rpc3BsYXllZCgpLFxuICAgICAgICAgIGhpZGRlbiA9ICFkaXNwbGF5ZWQ7XG5cbiAgICByZXR1cm4gaGlkZGVuO1xuICB9XG5cbiAgc3R5bGUobmFtZSwgdmFsdWUgPSBudWxsKSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0aGlzLmRvbUVsZW1lbnQuc3R5bGVbbmFtZV0gPSB2YWx1ZTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0eWxlID0gdGhpcy5kb21FbGVtZW50LnN0eWxlW25hbWVdO1xuXG4gICAgcmV0dXJuIHN0eWxlO1xuICB9XG5cbiAgaHRtbChodG1sID0gbnVsbCkge1xuICAgIGlmIChodG1sICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBpbm5lckhUTUwgPSBodG1sOyAvLy9cblxuICAgICAgdGhpcy5kb21FbGVtZW50LmlubmVySFRNTCA9IGlubmVySFRNTFxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW5uZXJIVE1MID0gdGhpcy5kb21FbGVtZW50LmlubmVySFRNTDtcblxuICAgIGh0bWwgPSBpbm5lckhUTUw7IC8vL1xuXG4gICAgcmV0dXJuIGh0bWw7XG4gIH1cblxuICBjc3MoY3NzID0gbnVsbCkge1xuICAgIGlmIChjc3MgPT09IG51bGwpIHtcbiAgICAgIGNzcyA9IHt9O1xuXG4gICAgICBjb25zdCBjb21wdXRlZFN0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUodGhpcy5kb21FbGVtZW50KTsgLy8vXG5cbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb21wdXRlZFN0eWxlcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IGNvbXB1dGVkU3R5bGVzW2luZGV4XSxcbiAgICAgICAgICAgICAgbmFtZSA9IGNvbXB1dGVkU3R5bGUsICAvLy9cbiAgICAgICAgICAgICAgdmFsdWUgPSBjb21wdXRlZFN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpOyAvLy9cblxuICAgICAgICBjc3NbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjc3MgPT09IFNUUklORykge1xuICAgICAgbGV0IG5hbWUgPSBjc3M7IC8vL1xuXG4gICAgICBjb25zdCBjb21wdXRlZFN0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUodGhpcy5kb21FbGVtZW50KSwgLy8vXG4gICAgICAgICAgICB2YWx1ZSA9IGNvbXB1dGVkU3R5bGVzLmdldFByb3BlcnR5VmFsdWUobmFtZSk7IC8vL1xuXG4gICAgICBjc3MgPSB2YWx1ZTsgIC8vL1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKGNzcyk7IC8vL1xuXG4gICAgICBuYW1lcy5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY3NzW25hbWVdO1xuXG4gICAgICAgIHRoaXMuc3R5bGUobmFtZSwgdmFsdWUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNzcztcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXM7IC8vL1xuXG4gICAgZGVzdHJveUVsZW1lbnQoZWxlbWVudCk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNsYXNzKENsYXNzLCBwcm9wZXJ0aWVzLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpIHtcbiAgICBjb25zdCB7IHRhZ05hbWUgfSA9IENsYXNzLFxuICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50RnJvbVRhZ05hbWUoQ2xhc3MsIHRhZ05hbWUsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cyksXG4gICAgICAgICAgZGVmYXVsdFByb3BlcnRpZXMgPSBkZWZhdWx0UHJvcGVydGllc0Zyb21DbGFzcyhDbGFzcyksXG4gICAgICAgICAgaWdub3JlZFByb3BlcnRpZXMgPSBpZ25vcmVkUHJvcGVydGllc0Zyb21DbGFzcyhDbGFzcyk7XG5cbiAgICBlbGVtZW50LmFwcGx5UHJvcGVydGllcyhwcm9wZXJ0aWVzLCBkZWZhdWx0UHJvcGVydGllcywgaWdub3JlZFByb3BlcnRpZXMpO1xuXG4gICAgZWxlbWVudC5pbml0aWFsaXNlICYmIGVsZW1lbnQuaW5pdGlhbGlzZSgpOyAvLy9cblxuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgc3RhdGljIGZyb21UYWdOYW1lKHRhZ05hbWUsIHByb3BlcnRpZXMsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cykge1xuICAgIGNvbnN0IENsYXNzID0gRWxlbWVudCwgIC8vL1xuICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50RnJvbVRhZ05hbWUoQ2xhc3MsIHRhZ05hbWUsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cyksXG4gICAgICAgICAgZGVmYXVsdFByb3BlcnRpZXMgPSB7fSwgLy8vXG4gICAgICAgICAgaWdub3JlZFByb3BlcnRpZXMgPSBbXTsgLy8vXG5cbiAgICBlbGVtZW50LmFwcGx5UHJvcGVydGllcyhwcm9wZXJ0aWVzLCBkZWZhdWx0UHJvcGVydGllcywgaWdub3JlZFByb3BlcnRpZXMpO1xuXG4gICAgZWxlbWVudC5pbml0aWFsaXNlICYmIGVsZW1lbnQuaW5pdGlhbGlzZSgpOyAvLy9cblxuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG59XG5cbk9iamVjdC5hc3NpZ24oRWxlbWVudC5wcm90b3R5cGUsIGpzeE1peGlucyk7XG5PYmplY3QuYXNzaWduKEVsZW1lbnQucHJvdG90eXBlLCBrZXlNaXhpbnMpO1xuT2JqZWN0LmFzc2lnbihFbGVtZW50LnByb3RvdHlwZSwgbW91c2VNaXhpbnMpO1xuT2JqZWN0LmFzc2lnbihFbGVtZW50LnByb3RvdHlwZSwgY2xpY2tNaXhpbnMpO1xuT2JqZWN0LmFzc2lnbihFbGVtZW50LnByb3RvdHlwZSwgc3RhdGVNaXhpbnMpO1xuT2JqZWN0LmFzc2lnbihFbGVtZW50LnByb3RvdHlwZSwgZXZlbnRNaXhpbnMpO1xuT2JqZWN0LmFzc2lnbihFbGVtZW50LnByb3RvdHlwZSwgdG91Y2hNaXhpbnMpO1xuT2JqZWN0LmFzc2lnbihFbGVtZW50LnByb3RvdHlwZSwgc2Nyb2xsTWl4aW5zKTtcbk9iamVjdC5hc3NpZ24oRWxlbWVudC5wcm90b3R5cGUsIHJlc2l6ZU1peGlucyk7XG5PYmplY3QuYXNzaWduKEVsZW1lbnQucHJvdG90eXBlLCBlbGVtZW50TWl4aW5zKTtcbk9iamVjdC5hc3NpZ24oRWxlbWVudC5wcm90b3R5cGUsIGZ1bGxTY3JlZW5NaXhpbnMpO1xuT2JqZWN0LmFzc2lnbihFbGVtZW50LnByb3RvdHlwZSwgY3VzdG9tRXZlbnRNaXhpbnMpO1xuXG5mdW5jdGlvbiBlbGVtZW50RnJvbVRhZ05hbWUoQ2xhc3MsIHRhZ05hbWUsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cykge1xuICBjb25zdCBzZWxlY3RvciA9IG51bGwsXG4gICAgICAgIGVsZW1lbnQgPSBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwoQ2xhc3MsIG51bGwsIHNlbGVjdG9yLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpKSxcbiAgICAgICAgZG9tRWxlbWVudCA9IGlzU1ZHVGFnTmFtZSh0YWdOYW1lKSA/XG4gICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTkFNRVNQQUNFX1VSSSwgdGFnTmFtZSkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XG5cbiAgY29uc3RydWN0RWxlbWVudChlbGVtZW50LCBkb21FbGVtZW50KTtcblxuICByZXR1cm4gZWxlbWVudDtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFByb3BlcnRpZXNGcm9tQ2xhc3MoQ2xhc3MsIGRlZmF1bHRQcm9wZXJ0aWVzID0ge30pIHtcbiAgaWYgKENsYXNzLmhhc093blByb3BlcnR5KERFRkFVTFRfUFJPUEVSVElFUykpIHtcbiAgICBkZWZhdWx0UHJvcGVydGllcyA9IGNvbWJpbmUoZGVmYXVsdFByb3BlcnRpZXMsIENsYXNzW0RFRkFVTFRfUFJPUEVSVElFU10pO1xuICB9XG5cbiAgY29uc3Qgc3VwZXJDbGFzcyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihDbGFzcyk7ICAvLy9cblxuICBpZiAoc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIGRlZmF1bHRQcm9wZXJ0aWVzID0gZGVmYXVsdFByb3BlcnRpZXNGcm9tQ2xhc3Moc3VwZXJDbGFzcywgZGVmYXVsdFByb3BlcnRpZXMpO1xuICB9XG5cbiAgcmV0dXJuIGRlZmF1bHRQcm9wZXJ0aWVzO1xufVxuXG5mdW5jdGlvbiBpZ25vcmVkUHJvcGVydGllc0Zyb21DbGFzcyhDbGFzcywgaWdub3JlZFByb3BlcnRpZXMgPSBbXSkge1xuICBpZiAoQ2xhc3MuaGFzT3duUHJvcGVydHkoSUdOT1JFRF9QUk9QRVJUSUVTKSkge1xuICAgIGlnbm9yZWRQcm9wZXJ0aWVzID0gYXVnbWVudChpZ25vcmVkUHJvcGVydGllcywgQ2xhc3NbSUdOT1JFRF9QUk9QRVJUSUVTXSwgKGlnbm9yZWRQcm9wZXJ0eSkgPT4ge1xuICAgICAgaWYgKCFpZ25vcmVkUHJvcGVydGllcy5pbmNsdWRlcyhpZ25vcmVkUHJvcGVydHkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY29uc3Qgc3VwZXJDbGFzcyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihDbGFzcyk7XG5cbiAgaWYgKHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICBpZ25vcmVkUHJvcGVydGllcyA9IGlnbm9yZWRQcm9wZXJ0aWVzRnJvbUNsYXNzKHN1cGVyQ2xhc3MsIGlnbm9yZWRQcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIHJldHVybiBpZ25vcmVkUHJvcGVydGllcztcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IEVsZW1lbnQgZnJvbSBcIi4vZWxlbWVudFwiO1xuXG5pbXBvcnQgeyBmbGF0dGVuIH0gZnJvbSBcIi4vdXRpbGl0aWVzL2FycmF5XCI7XG5pbXBvcnQgeyBTVFJJTkcsIEZVTkNUSU9OIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyByZW1vdmVGYWxzZXlFbGVtZW50cywgcmVwbGFjZVN0cmluZ3NXaXRoVGV4dEVsZW1lbnRzIH0gZnJvbSBcIi4vdXRpbGl0aWVzL2VsZW1lbnRzXCI7XG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoZmlyc3RBcmd1bWVudCwgcHJvcGVydGllcywgLi4uY2hpbGRFbGVtZW50cykge1xuICBsZXQgZWxlbWVudCA9IG51bGw7XG5cbiAgaWYgKGZpcnN0QXJndW1lbnQpIHtcbiAgICBjaGlsZEVsZW1lbnRzID0gc2FuaXRpc2VDaGlsZEVsZW1lbnRzKGNoaWxkRWxlbWVudHMpO1xuXG4gICAgcHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgY2hpbGRFbGVtZW50c1xuICAgIH0sIHByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGZhbHNlKSB7XG4gICAgICAvLy9cbiAgICB9IGVsc2UgaWYgKGlzU3ViY2xhc3NPZihmaXJzdEFyZ3VtZW50LCBFbGVtZW50KSkge1xuICAgICAgY29uc3QgQ2xhc3MgPSBmaXJzdEFyZ3VtZW50OyAgLy8vXG5cbiAgICAgIGVsZW1lbnQgPSBDbGFzcy5mcm9tQ2xhc3MoQ2xhc3MsIHByb3BlcnRpZXMpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpcnN0QXJndW1lbnQgPT09IFNUUklORykge1xuICAgICAgY29uc3QgdGFnTmFtZSA9IGZpcnN0QXJndW1lbnQ7IC8vL1xuXG4gICAgICBlbGVtZW50ID0gRWxlbWVudC5mcm9tVGFnTmFtZSh0YWdOYW1lLCBwcm9wZXJ0aWVzKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBmaXJzdEFyZ3VtZW50ID09PSBGVU5DVElPTikge1xuICAgICAgY29uc3QgZWxlbWVudEZ1bmN0aW9uID0gZmlyc3RBcmd1bWVudDsgIC8vL1xuXG4gICAgICBlbGVtZW50ID0gZWxlbWVudEZ1bmN0aW9uKHByb3BlcnRpZXMpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxuXG5jb25zdCBSZWFjdCA9IHtcbiAgY3JlYXRlRWxlbWVudFxufTtcblxuZXhwb3J0IGRlZmF1bHQgUmVhY3Q7XG5cbmZ1bmN0aW9uIHNhbml0aXNlQ2hpbGRFbGVtZW50cyhjaGlsZEVsZW1lbnRzKSB7XG4gIGNoaWxkRWxlbWVudHMgPSBmbGF0dGVuKGNoaWxkRWxlbWVudHMpOyAvLy9cblxuICBjaGlsZEVsZW1lbnRzID0gcmVtb3ZlRmFsc2V5RWxlbWVudHMoY2hpbGRFbGVtZW50cyk7ICAvLy9cblxuICBjaGlsZEVsZW1lbnRzID0gcmVwbGFjZVN0cmluZ3NXaXRoVGV4dEVsZW1lbnRzKGNoaWxkRWxlbWVudHMpOyAgLy8vXG5cbiAgcmV0dXJuIGNoaWxkRWxlbWVudHM7XG59XG5cblxuZnVuY3Rpb24gaXNTdWJjbGFzc09mKGFyZ3VtZW50LCBDbGFzcykge1xuICBjb25zdCBzdWJjbGFzc09mID0gKGFyZ3VtZW50LnByb3RvdHlwZSBpbnN0YW5jZW9mIENsYXNzKTtcblxuICByZXR1cm4gc3ViY2xhc3NPZjtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0IGNvbnN0IExFRlRfTU9VU0VfQlVUVE9OID0gMDtcbmV4cG9ydCBjb25zdCBSSUdIVF9NT1VTRV9CVVRUT04gPSAyO1xuZXhwb3J0IGNvbnN0IE1JRERMRV9NT1VTRV9CVVRUT04gPSAxO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIExFRlRfTU9VU0VfQlVUVE9OLFxuICBSSUdIVF9NT1VTRV9CVVRUT04sXG4gIE1JRERMRV9NT1VTRV9CVVRUT05cbn07XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IElOUFVUX0VWRU5UX1RZUEUsIENIQU5HRV9FVkVOVF9UWVBFIH0gZnJvbSBcIi4uL2V2ZW50VHlwZXNcIjtcblxuZnVuY3Rpb24gb25JbnB1dChpbnB1dEhhbmRsZXIsIGVsZW1lbnQpIHsgdGhpcy5vbkV2ZW50KElOUFVUX0VWRU5UX1RZUEUsIGlucHV0SGFuZGxlciwgZWxlbWVudCk7IH1cblxuZnVuY3Rpb24gb2ZmSW5wdXQoaW5wdXRIYW5kbGVyLCBlbGVtZW50KSB7IHRoaXMub2ZmRXZlbnQoSU5QVVRfRVZFTlRfVFlQRSwgaW5wdXRIYW5kbGVyLCBlbGVtZW50KTsgfVxuXG5mdW5jdGlvbiBvbkNoYW5nZShjaGFuZ2VIYW5kbGVyLCBlbGVtZW50KSB7IHRoaXMub25FdmVudChDSEFOR0VfRVZFTlRfVFlQRSwgY2hhbmdlSGFuZGxlciwgZWxlbWVudCk7IH1cblxuZnVuY3Rpb24gb2ZmQ2hhbmdlKGNoYW5nZUhhbmRsZXIsIGVsZW1lbnQpIHsgdGhpcy5vZmZFdmVudChDSEFOR0VfRVZFTlRfVFlQRSwgY2hhbmdlSGFuZGxlciwgZWxlbWVudCk7IH1cblxuZnVuY3Rpb24gZ2V0VmFsdWUoKSB7IHJldHVybiB0aGlzLmRvbUVsZW1lbnQudmFsdWU7IH1cblxuZnVuY3Rpb24gc2V0VmFsdWUodmFsdWUpIHsgdGhpcy5kb21FbGVtZW50LnZhbHVlID0gdmFsdWU7IH1cblxuZnVuY3Rpb24gaXNSZWFkT25seSgpIHsgcmV0dXJuIHRoaXMuZG9tRWxlbWVudC5yZWFkT25seTsgfVxuXG5mdW5jdGlvbiBzZXRSZWFkT25seShyZWFkT25seSkgeyB0aGlzLmRvbUVsZW1lbnQucmVhZE9ubHkgPSByZWFkT25seTsgfVxuXG5jb25zdCBpbnB1dE1peGlucyA9IHtcbiAgb25JbnB1dCxcbiAgb2ZmSW5wdXQsXG4gIG9uQ2hhbmdlLFxuICBvZmZDaGFuZ2UsXG4gIGdldFZhbHVlLFxuICBzZXRWYWx1ZSxcbiAgaXNSZWFkT25seSxcbiAgc2V0UmVhZE9ubHlcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGlucHV0TWl4aW5zO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBCTFVSX0VWRU5UX1RZUEUsIEZPQ1VTX0VWRU5UX1RZUEUgfSBmcm9tIFwiLi4vZXZlbnRUeXBlc1wiO1xuXG5mdW5jdGlvbiBvbkJsdXIoYmx1ckhhbmRsZXIsIGVsZW1lbnQpIHsgdGhpcy5vbkV2ZW50KEJMVVJfRVZFTlRfVFlQRSwgYmx1ckhhbmRsZXIsIGVsZW1lbnQpOyB9XG5cbmZ1bmN0aW9uIG9mZkJsdXIoYmx1ckhhbmRsZXIsIGVsZW1lbnQpIHsgdGhpcy5vZmZFdmVudChCTFVSX0VWRU5UX1RZUEUsIGJsdXJIYW5kbGVyLCBlbGVtZW50KTsgfVxuXG5mdW5jdGlvbiBvbkZvY3VzKGZvY3VzSGFuZGxlciwgZWxlbWVudCkgeyB0aGlzLm9uRXZlbnQoRk9DVVNfRVZFTlRfVFlQRSwgZm9jdXNIYW5kbGVyLCBlbGVtZW50KTsgfVxuXG5mdW5jdGlvbiBvZmZGb2N1cyhmb2N1c0hhbmRsZXIsIGVsZW1lbnQpIHsgdGhpcy5vZmZFdmVudChGT0NVU19FVkVOVF9UWVBFLCBmb2N1c0hhbmRsZXIsIGVsZW1lbnQpOyB9XG5cbmZ1bmN0aW9uIGJsdXIoKSB7IHRoaXMuZG9tRWxlbWVudC5ibHVyKCk7IH1cblxuZnVuY3Rpb24gZm9jdXMoKSB7IHRoaXMuZG9tRWxlbWVudC5mb2N1cygpOyB9XG5cbmZ1bmN0aW9uIGhhc0ZvY3VzKCkge1xuICBjb25zdCBmb2N1cyA9IChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLmRvbUVsZW1lbnQpOyAgLy8vXG5cbiAgcmV0dXJuIGZvY3VzO1xufVxuXG5jb25zdCBmb2N1c01peGlucyA9IHtcbiAgb25CbHVyLFxuICBvZmZCbHVyLFxuICBvbkZvY3VzLFxuICBvZmZGb2N1cyxcbiAgYmx1cixcbiAgZm9jdXMsXG4gIGhhc0ZvY3VzXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmb2N1c01peGlucztcbiIsICJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgQ1VUX0VWRU5UX1RZUEUsIENPUFlfRVZFTlRfVFlQRSwgUEFTVEVfRVZFTlRfVFlQRSB9IGZyb20gXCIuLi9ldmVudFR5cGVzXCI7XG5cbmZ1bmN0aW9uIG9uQ3V0KGN1dEhhbmRsZXIsIGVsZW1lbnQpIHsgdGhpcy5vbkV2ZW50KENVVF9FVkVOVF9UWVBFLCBjdXRIYW5kbGVyLCBlbGVtZW50KTsgfVxuXG5mdW5jdGlvbiBvZmZDdXQoY3V0SGFuZGxlciwgZWxlbWVudCkgeyB0aGlzLm9mZkV2ZW50KENVVF9FVkVOVF9UWVBFLCBjdXRIYW5kbGVyLCBlbGVtZW50KTsgfVxuXG5mdW5jdGlvbiBvbkNvcHkoY29weUhhbmRsZXIsIGVsZW1lbnQpIHsgdGhpcy5vbkV2ZW50KENPUFlfRVZFTlRfVFlQRSwgY29weUhhbmRsZXIsIGVsZW1lbnQpOyB9XG5cbmZ1bmN0aW9uIG9mZkNvcHkoY29weUhhbmRsZXIsIGVsZW1lbnQpIHsgdGhpcy5vZmZFdmVudChDT1BZX0VWRU5UX1RZUEUsIGNvcHlIYW5kbGVyLCBlbGVtZW50KTsgfVxuXG5mdW5jdGlvbiBvblBhc3RlKHBhc3RlSGFuZGxlciwgZWxlbWVudCkgeyB0aGlzLm9uRXZlbnQoUEFTVEVfRVZFTlRfVFlQRSwgcGFzdGVIYW5kbGVyLCBlbGVtZW50KTsgfVxuXG5mdW5jdGlvbiBvZmZQYXN0ZShwYXN0ZUhhbmRsZXIsIGVsZW1lbnQpIHsgdGhpcy5vZmZFdmVudChQQVNURV9FVkVOVF9UWVBFLCBwYXN0ZUhhbmRsZXIsIGVsZW1lbnQpOyB9XG5cbmZ1bmN0aW9uIGdldFNlbGVjdGlvblN0YXJ0KCkgeyByZXR1cm4gdGhpcy5kb21FbGVtZW50LnNlbGVjdGlvblN0YXJ0OyB9XG5cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbkVuZCgpIHsgcmV0dXJuIHRoaXMuZG9tRWxlbWVudC5zZWxlY3Rpb25FbmQ7IH1cblxuZnVuY3Rpb24gc2V0U2VsZWN0aW9uU3RhcnQoc2VsZWN0aW9uU3RhcnQpIHsgdGhpcy5kb21FbGVtZW50LnNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQ7IH1cblxuZnVuY3Rpb24gc2V0U2VsZWN0aW9uRW5kKHNlbGVjdGlvbkVuZCkgeyB0aGlzLmRvbUVsZW1lbnQuc2VsZWN0aW9uRW5kID0gc2VsZWN0aW9uRW5kOyB9XG5cbmZ1bmN0aW9uIHNlbGVjdCgpIHsgdGhpcy5kb21FbGVtZW50LnNlbGVjdCgpOyB9XG5cbmNvbnN0IHNlbGVjdGlvbk1peGlucyA9IHtcbiAgb25DdXQsXG4gIG9mZkN1dCxcbiAgb25Db3B5LFxuICBvZmZDb3B5LFxuICBvblBhc3RlLFxuICBvZmZQYXN0ZSxcbiAgZ2V0U2VsZWN0aW9uU3RhcnQsXG4gIGdldFNlbGVjdGlvbkVuZCxcbiAgc2V0U2VsZWN0aW9uU3RhcnQsXG4gIHNldFNlbGVjdGlvbkVuZCxcbiAgc2VsZWN0XG59O1xuXG5leHBvcnQgZGVmYXVsdCBzZWxlY3Rpb25NaXhpbnM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCBrZXlNaXhpbnMgZnJvbSBcIi4vbWl4aW5zL2tleVwiO1xuaW1wb3J0IGV2ZW50TWl4aW5zIGZyb20gXCIuL21peGlucy9ldmVudFwiO1xuaW1wb3J0IG1vdXNlTWl4aW5zIGZyb20gXCIuL21peGlucy9tb3VzZVwiO1xuaW1wb3J0IGNsaWNrTWl4aW5zIGZyb20gXCIuL21peGlucy9jbGlja1wiO1xuXG5pbXBvcnQgeyBVTkRFRklORUQgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFNFTEVDVElPTkNIQU5HRV9FVkVOVF9UWVBFIH0gZnJvbSBcIi4vZXZlbnRUeXBlc1wiO1xuXG5jbGFzcyBEb2N1bWVudCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuZG9tRWxlbWVudCA9IGRvY3VtZW50OyAvLy9cbiAgfVxuXG4gIGdldERPTUVsZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZG9tRWxlbWVudDtcbiAgfVxuXG4gIGdldFNlbGVjdGlvbigpIHsgcmV0dXJuIHRoaXMuZG9tRWxlbWVudC5nZXRTZWxlY3Rpb24oKTsgfVxuXG4gIGNyZWF0ZVJhbmdlKCkgeyByZXR1cm4gdGhpcy5kb21FbGVtZW50LmNyZWF0ZVJhbmdlKCk7IH1cblxuICBjcmVhdGVUZXh0Tm9kZShkYXRhKSB7IHJldHVybiB0aGlzLmRvbUVsZW1lbnQuY3JlYXRlVGV4dE5vZGUoZGF0YSk7IH1cblxuICBvblNlbGVjdGlvbkNoYW5nZShzZWxlY3Rpb25DaGFuZ2VIYW5kbGVyLCBlbGVtZW50KSB7IHRoaXMub25FdmVudChTRUxFQ1RJT05DSEFOR0VfRVZFTlRfVFlQRSwgc2VsZWN0aW9uQ2hhbmdlSGFuZGxlciwgZWxlbWVudCk7IH0gLy8vXG5cbiAgb2ZmU2VsZWN0aW9uQ2hhbmdlKHNlbGVjdGlvbkNoYW5nZUhhbmRsZXIsIGVsZW1lbnQpIHsgdGhpcy5vZmZFdmVudChTRUxFQ1RJT05DSEFOR0VfRVZFTlRfVFlQRSwgc2VsZWN0aW9uQ2hhbmdlSGFuZGxlciwgZWxlbWVudCk7IH0gLy8vXG5cbiAgY3JlYXRlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGhhbmRsZXIsIGVsZW1lbnQpIHtcbiAgICBsZXQgZXZlbnRMaXN0ZW5lcjtcblxuICAgIGNvbnN0IGhhbmRsZXJFbGVtZW50ID0gZWxlbWVudDsgLy8vXG5cbiAgICBldmVudExpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnRUeXBlID09PSBTRUxFQ1RJT05DSEFOR0VfRVZFTlRfVFlQRSkge1xuICAgICAgICBjb25zdCB7IGRvbUVsZW1lbnQgfSA9IGhhbmRsZXJFbGVtZW50LFxuICAgICAgICAgICAgICB7IGN1cnJlbnRUYXJnZXQgfSA9IGV2ZW50LFxuICAgICAgICAgICAgICB7IGFjdGl2ZUVsZW1lbnQgfSA9IGN1cnJlbnRUYXJnZXQ7XG5cbiAgICAgICAgaWYgKGRvbUVsZW1lbnQgIT09IGFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXM7IC8vL1xuXG4gICAgICBoYW5kbGVyLmNhbGwoaGFuZGxlckVsZW1lbnQsIGV2ZW50LCBlbGVtZW50KTtcbiAgICB9O1xuXG4gICAgT2JqZWN0LmFzc2lnbihldmVudExpc3RlbmVyLCB7XG4gICAgICBlbGVtZW50LFxuICAgICAgaGFuZGxlcixcbiAgICAgIGV2ZW50VHlwZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGV2ZW50TGlzdGVuZXI7XG4gIH1cbn1cblxuT2JqZWN0LmFzc2lnbihEb2N1bWVudC5wcm90b3R5cGUsIGtleU1peGlucyk7XG5PYmplY3QuYXNzaWduKERvY3VtZW50LnByb3RvdHlwZSwgZXZlbnRNaXhpbnMpO1xuT2JqZWN0LmFzc2lnbihEb2N1bWVudC5wcm90b3R5cGUsIG1vdXNlTWl4aW5zKTtcbk9iamVjdC5hc3NpZ24oRG9jdW1lbnQucHJvdG90eXBlLCBjbGlja01peGlucyk7XG5cbmV4cG9ydCBkZWZhdWx0ICh0eXBlb2YgZG9jdW1lbnQgPT09IFVOREVGSU5FRCkgPyB1bmRlZmluZWQgOiBuZXcgRG9jdW1lbnQoKTsgIC8vL1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQga2V5TWl4aW5zIGZyb20gXCIuL21peGlucy9rZXlcIjtcbmltcG9ydCBldmVudE1peGlucyBmcm9tIFwiLi9taXhpbnMvZXZlbnRcIjtcbmltcG9ydCBtb3VzZU1peGlucyBmcm9tIFwiLi9taXhpbnMvbW91c2VcIjtcbmltcG9ydCBjbGlja01peGlucyBmcm9tIFwiLi9taXhpbnMvY2xpY2tcIjtcbmltcG9ydCBmb2N1c01peGlucyBmcm9tIFwiLi9taXhpbnMvZm9jdXNcIjtcblxuaW1wb3J0IHsgVU5ERUZJTkVEIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBSRVNJWkVfRVZFTlRfVFlQRSB9IGZyb20gXCIuL2V2ZW50VHlwZXNcIjtcbmltcG9ydCB7IG9uU2Nyb2xsLCBvZmZTY3JvbGwgfSBmcm9tIFwiLi9taXhpbnMvc2Nyb2xsXCI7XG5cbmNsYXNzIFdpbmRvdyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuZG9tRWxlbWVudCA9IHdpbmRvdzsgLy8vXG4gIH1cblxuICBnZXRET01FbGVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLmRvbUVsZW1lbnQ7XG4gIH1cblxuICBhc3NpZ24oLi4uc291cmNlcykge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuZG9tRWxlbWVudDsgLy8vXG5cbiAgICBPYmplY3QuYXNzaWduKHRhcmdldCwgLi4uc291cmNlcyk7XG4gIH1cblxuICByZWxvYWQoKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOyAvLy9cbiAgfVxuXG4gIGdldFdpZHRoKCkgeyByZXR1cm4gdGhpcy5kb21FbGVtZW50LmlubmVyV2lkdGg7IH0gLy8vXG4gIFxuICBnZXRIZWlnaHQoKSB7IHJldHVybiB0aGlzLmRvbUVsZW1lbnQuaW5uZXJIZWlnaHQ7IH0gLy8vXG5cbiAgZ2V0U2Nyb2xsVG9wKCkgeyByZXR1cm4gdGhpcy5kb21FbGVtZW50LnBhZ2VZT2Zmc2V0OyB9ICAvLy9cblxuICBnZXRTY3JvbGxMZWZ0KCkgeyByZXR1cm4gdGhpcy5kb21FbGVtZW50LnBhZ2VYT2Zmc2V0OyB9IC8vL1xuXG4gIGdldFNlbGVjdGlvbigpIHsgcmV0dXJuIHRoaXMuZG9tRWxlbWVudC5nZXRTZWxlY3Rpb24oKTsgfVxuXG4gIGdldFNjcmVlbldpZHRoKCkgeyByZXR1cm4gdGhpcy5kb21FbGVtZW50LnNjcmVlbi53aWR0aDsgfVxuXG4gIGdldFNjcmVlbkhlaWdodCgpIHsgcmV0dXJuIHRoaXMuZG9tRWxlbWVudC5zY3JlZW4uaGVpZ2h0OyB9XG5cbiAgc2Nyb2xsVG8oc2Nyb2xsVG9wLCBzY3JvbGxMZWZ0KSB7IHRoaXMuZG9tRWxlbWVudC5zY3JvbGxUbyhzY3JvbGxMZWZ0LCBzY3JvbGxUb3ApOyB9XG5cbiAgb25SZXNpemUocmVzaXplSGFuZGxlciwgZWxlbWVudCkge1xuICAgIGNvbnN0IGV2ZW50VHlwZSA9IFJFU0laRV9FVkVOVF9UWVBFLFxuICAgICAgICAgIGV2ZW50TGlzdGVuZXIgPSB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCByZXNpemVIYW5kbGVyLCBlbGVtZW50KTtcblxuICAgIHRoaXMuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgZXZlbnRMaXN0ZW5lcik7XG4gIH1cblxuICBvZmZSZXNpemUocmVzaXplSGFuZGxlciwgZWxlbWVudCkge1xuICAgIGNvbnN0IGV2ZW50VHlwZSA9IFJFU0laRV9FVkVOVF9UWVBFLFxuICAgICAgICAgIGV2ZW50TGlzdGVuZXIgPSB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCByZXNpemVIYW5kbGVyLCBlbGVtZW50KTtcblxuICAgIHRoaXMuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgZXZlbnRMaXN0ZW5lcik7XG4gIH1cbn1cblxuT2JqZWN0LmFzc2lnbihXaW5kb3cucHJvdG90eXBlLCBrZXlNaXhpbnMpO1xuT2JqZWN0LmFzc2lnbihXaW5kb3cucHJvdG90eXBlLCBldmVudE1peGlucyk7XG5PYmplY3QuYXNzaWduKFdpbmRvdy5wcm90b3R5cGUsIG1vdXNlTWl4aW5zKTtcbk9iamVjdC5hc3NpZ24oV2luZG93LnByb3RvdHlwZSwgY2xpY2tNaXhpbnMpO1xuT2JqZWN0LmFzc2lnbihXaW5kb3cucHJvdG90eXBlLCBmb2N1c01peGlucyk7XG5PYmplY3QuYXNzaWduKFdpbmRvdy5wcm90b3R5cGUsIHtcbiAgb25TY3JvbGwsXG4gIG9mZlNjcm9sbFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0ICh0eXBlb2Ygd2luZG93ID09PSBVTkRFRklORUQpID8gdW5kZWZpbmVkIDogbmV3IFdpbmRvdygpOyAgLy8vXG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCBFbGVtZW50IGZyb20gXCIuLi9lbGVtZW50XCI7XG5cbmltcG9ydCB7IEJPRFkgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvZHkgZXh0ZW5kcyBFbGVtZW50IHtcbiAgY29uc3RydWN0b3Ioc2VsZWN0b3IgPSBCT0RZKSB7XG4gICAgc3VwZXIoc2VsZWN0b3IpO1xuICB9XG5cbiAgc3RhdGljIHRhZ05hbWUgPSBcImJvZHlcIjtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IEVsZW1lbnQgZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCBmb2N1c01peGlucyBmcm9tIFwiLi4vbWl4aW5zL2ZvY3VzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpbmsgZXh0ZW5kcyBFbGVtZW50IHtcbiAgZ2V0SFJlZigpIHsgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTsgfVxuXG4gIHNldEhSZWYoaHJlZikgeyByZXR1cm4gdGhpcy5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIGhyZWYpOyB9XG5cbiAgc3RhdGljIHRhZ05hbWUgPSBcImFcIjtcbn1cblxuT2JqZWN0LmFzc2lnbihMaW5rLnByb3RvdHlwZSwgZm9jdXNNaXhpbnMpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgRWxlbWVudCBmcm9tIFwiLi4vZWxlbWVudFwiO1xuaW1wb3J0IGlucHV0TWl4aW5zIGZyb20gXCIuLi9taXhpbnMvaW5wdXRcIjtcbmltcG9ydCBmb2N1c01peGlucyBmcm9tIFwiLi4vbWl4aW5zL2ZvY3VzXCI7XG5pbXBvcnQgc2VsZWN0aW9uTWl4aW5zIGZyb20gXCIuLi9taXhpbnMvc2VsZWN0aW9uXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIElucHV0IGV4dGVuZHMgRWxlbWVudCB7XG4gIHN0YXRpYyB0YWdOYW1lID0gXCJpbnB1dFwiO1xufVxuXG5PYmplY3QuYXNzaWduKElucHV0LnByb3RvdHlwZSwgaW5wdXRNaXhpbnMpO1xuT2JqZWN0LmFzc2lnbihJbnB1dC5wcm90b3R5cGUsIGZvY3VzTWl4aW5zKTtcbk9iamVjdC5hc3NpZ24oSW5wdXQucHJvdG90eXBlLCBzZWxlY3Rpb25NaXhpbnMpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgRWxlbWVudCBmcm9tIFwiLi4vZWxlbWVudFwiO1xuaW1wb3J0IGZvY3VzTWl4aW5zIGZyb20gXCIuLi9taXhpbnMvZm9jdXNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnV0dG9uIGV4dGVuZHMgRWxlbWVudCB7XG4gIHN0YXRpYyB0YWdOYW1lID0gXCJidXR0b25cIjtcbn1cblxuT2JqZWN0LmFzc2lnbihCdXR0b24ucHJvdG90eXBlLCBmb2N1c01peGlucyk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCBFbGVtZW50IGZyb20gXCIuLi9lbGVtZW50XCI7XG5pbXBvcnQgaW5wdXRNaXhpbnMgZnJvbSBcIi4uL21peGlucy9pbnB1dFwiO1xuaW1wb3J0IGZvY3VzTWl4aW5zIGZyb20gXCIuLi9taXhpbnMvZm9jdXNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VsZWN0IGV4dGVuZHMgRWxlbWVudCB7XG4gIHN0YXRpYyB0YWdOYW1lID0gXCJzZWxlY3RcIjtcbn1cblxuT2JqZWN0LmFzc2lnbihTZWxlY3QucHJvdG90eXBlLCBpbnB1dE1peGlucyk7XG5PYmplY3QuYXNzaWduKFNlbGVjdC5wcm90b3R5cGUsIGZvY3VzTWl4aW5zKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IEVsZW1lbnQgZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCBpbnB1dE1peGlucyBmcm9tIFwiLi4vbWl4aW5zL2lucHV0XCI7XG5pbXBvcnQgZm9jdXNNaXhpbnMgZnJvbSBcIi4uL21peGlucy9mb2N1c1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDaGVja2JveCBleHRlbmRzIEVsZW1lbnQge1xuICBpc0NoZWNrZWQoKSB7IHJldHVybiB0aGlzLmRvbUVsZW1lbnQuY2hlY2tlZDsgfVxuXG4gIGNoZWNrKGNoZWNrZWQgPSB0cnVlKSB7IHRoaXMuZG9tRWxlbWVudC5jaGVja2VkID0gY2hlY2tlZDsgfVxuXG4gIHN0YXRpYyB0YWdOYW1lID0gXCJpbnB1dFwiO1xuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcGVydGllcyA9IHtcbiAgICB0eXBlOiBcImNoZWNrYm94XCJcbiAgfTtcbn1cblxuT2JqZWN0LmFzc2lnbihDaGVja2JveC5wcm90b3R5cGUsIGlucHV0TWl4aW5zKTtcbk9iamVjdC5hc3NpZ24oQ2hlY2tib3gucHJvdG90eXBlLCBmb2N1c01peGlucyk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCBFbGVtZW50IGZyb20gXCIuLi9lbGVtZW50XCI7XG5pbXBvcnQgaW5wdXRNaXhpbnMgZnJvbSBcIi4uL21peGlucy9pbnB1dFwiO1xuaW1wb3J0IGZvY3VzTWl4aW5zIGZyb20gXCIuLi9taXhpbnMvZm9jdXNcIjtcbmltcG9ydCBzZWxlY3Rpb25NaXhpbnMgZnJvbSBcIi4uL21peGlucy9zZWxlY3Rpb25cIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGV4dGFyZWEgZXh0ZW5kcyBFbGVtZW50IHtcbiAgc3RhdGljIHRhZ05hbWUgPSBcInRleHRhcmVhXCI7XG59XG5cbk9iamVjdC5hc3NpZ24oVGV4dGFyZWEucHJvdG90eXBlLCBpbnB1dE1peGlucyk7XG5PYmplY3QuYXNzaWduKFRleHRhcmVhLnByb3RvdHlwZSwgZm9jdXNNaXhpbnMpO1xuT2JqZWN0LmFzc2lnbihUZXh0YXJlYS5wcm90b3R5cGUsIHNlbGVjdGlvbk1peGlucyk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydCB7IGRlZmF1bHQgYXMgUmVhY3QgfSBmcm9tIFwiLi9yZWFjdFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBCb3VuZHMgfSBmcm9tIFwiLi9ib3VuZHNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgT2Zmc2V0IH0gZnJvbSBcIi4vb2Zmc2V0XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGV2ZW50VHlwZXMgfSBmcm9tIFwiLi9ldmVudFR5cGVzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG1vdXNlQnV0dG9ucyB9IGZyb20gXCIuL21vdXNlQnV0dG9uc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBlbGVtZW50VXRpbGl0aWVzIH0gZnJvbSBcIi4vdXRpbGl0aWVzL2VsZW1lbnRcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaW5wdXRNaXhpbnMgfSBmcm9tIFwiLi9taXhpbnMvaW5wdXRcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZm9jdXNNaXhpbnMgfSBmcm9tIFwiLi9taXhpbnMvZm9jdXNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc2VsZWN0aW9uTWl4aW5zIH0gZnJvbSBcIi4vbWl4aW5zL3NlbGVjdGlvblwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjdXN0b21FdmVudE1peGlucyB9IGZyb20gXCIuL21peGlucy9jdXN0b21FdmVudFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBFbGVtZW50IH0gZnJvbSBcIi4vZWxlbWVudFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUZXh0RWxlbWVudCB9IGZyb20gXCIuL3RleHRFbGVtZW50XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGRvY3VtZW50IH0gZnJvbSBcIi4vZG9jdW1lbnRcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgd2luZG93IH0gZnJvbSBcIi4vd2luZG93XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEJvZHkgfSBmcm9tIFwiLi9lbGVtZW50L2JvZHlcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTGluayB9IGZyb20gXCIuL2VsZW1lbnQvbGlua1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBJbnB1dCB9IGZyb20gXCIuL2VsZW1lbnQvaW5wdXRcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQnV0dG9uIH0gZnJvbSBcIi4vZWxlbWVudC9idXR0b25cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU2VsZWN0IH0gZnJvbSBcIi4vZWxlbWVudC9zZWxlY3RcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2hlY2tib3ggfSBmcm9tIFwiLi9lbGVtZW50L2NoZWNrYm94XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFRleHRhcmVhIH0gZnJvbSBcIi4vZWxlbWVudC90ZXh0YXJlYVwiO1xuXG5cbiIsICJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgUmVhY3QgfSBmcm9tIFwiLi4vaW5kZXhcIjsgIC8vL1xuXG5PYmplY3QuYXNzaWduKGdsb2JhbFRoaXMsIHtcbiAgUmVhY3Rcbn0pO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBFbGVtZW50IH0gZnJvbSBcIi4uLy4uL2luZGV4XCI7ICAvLy9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGl2IGV4dGVuZHMgRWxlbWVudCB7XG4gIG1vdXNlTW92ZUhhbmRsZXIgPSAoZXZlbnQsIGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCB7IHBhZ2VYLCBwYWdlWSB9ID0gZXZlbnQ7XG5cbiAgICBjb25zb2xlLmxvZyhwYWdlWCwgcGFnZVkpXG4gIH1cblxuICByZXNpemVIYW5kbGVyID0gKGV2ZW50LCBlbGVtZW50KSA9PiB7XG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLmdldFdpZHRoKCksXG4gICAgICAgICAgaGVpZ2h0ID0gdGhpcy5nZXRIZWlnaHQoKTtcblxuICAgIGNvbnNvbGUubG9nKHdpZHRoLCBoZWlnaHQpXG4gIH1cblxuICBkaWRNb3VudCgpIHtcbiAgICB0aGlzLm9uUmVzaXplKHRoaXMucmVzaXplSGFuZGxlciwgdGhpcyk7XG4gICAgdGhpcy5vbk1vdXNlTW92ZSh0aGlzLm1vdXNlTW92ZUhhbmRsZXIsIHRoaXMpO1xuICB9XG5cbiAgd2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5vZmZNb3VzZU1vdmUodGhpcy5tb3VzZU1vdmVIYW5kbGVyLCB0aGlzKTtcbiAgICB0aGlzLm9mZlJlc2l6ZSh0aGlzLnJlc2l6ZUhhbmRsZXIsIHRoaXMpO1xuICB9XG5cbiAgY2hpbGRFbGVtZW50cygpIHtcbiAgICByZXR1cm4gKFxuXG4gICAgICA8cD5cbiAgICAgICAgQSBwYXJhZ3JhcGggY29udGFpbmVkIGluIGEgZGl2IHdpdGggcmVzaXplIGFuZCBtb3VzZSBtb3ZlIGhhbmRsZXJzLlxuICAgICAgPC9wPlxuXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyB0YWdOYW1lID0gXCJkaXZcIjtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgRWxlbWVudCB9IGZyb20gXCIuLi9pbmRleFwiOyAgLy8vXG5cbmltcG9ydCBEaXYgZnJvbSBcIi4vdmlldy9kaXZcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlldyBleHRlbmRzIEVsZW1lbnQge1xuICBjaGlsZEVsZW1lbnRzKCkge1xuICAgIHJldHVybiAoXG5cbiAgICAgIDxEaXYvPlxuXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyB0YWdOYW1lID0gXCJkaXZcIjtcblxuICBzdGF0aWMgZGVmYXVsdFByb3BlcnRpZXMgPSB7XG4gICAgY2xhc3NOYW1lOiBcInZpZXdcIlxuICB9O1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgXCIuL2V4YW1wbGUvcHJlYW1ibGVcIjtcblxuaW1wb3J0IHsgQm9keSB9IGZyb20gXCIuL2luZGV4XCI7ICAvLy9cblxuaW1wb3J0IFZpZXcgZnJvbSBcIi4vZXhhbXBsZS92aWV3XCJcblxuY29uc3QgYm9keSA9IG5ldyBCb2R5KCk7XG5cbmJvZHkubW91bnQoXG5cbiAgPFZpZXcvPlxuXG4pO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7OztBQUFBOzs7OzttQ0FFQSxXQUFBOzs7ZUFBcUI7OztBQUFOLHVCQUFN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