@chocbite/ts-lib-form 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import './style.css';
2
2
  import { AccessTypes, Base, define_element } from "@chocbite/ts-lib-base";
3
- import { IPAddress, IPVersion, get_cursor_position, set_cursor_end, set_cursor_position, set_selection_all, sleep, sync_resolve } from "@chocbite/ts-lib-common";
3
+ import { IPAddress, IPVersion, get_cursor_position, node_clone, set_cursor_end, set_cursor_position, set_selection_all, sleep, sync_resolve } from "@chocbite/ts-lib-common";
4
4
  import { err, none, ok, some } from "@chocbite/ts-lib-result";
5
5
  import { BLUE, GREEN, GREY, ORANGE, RED, YELLOW } from "@chocbite/ts-lib-colors";
6
6
  import { ANIMATION_LEVEL, ANIMATION_SPEED, AnimationLevels, theme_init_variable_root } from "@chocbite/ts-lib-theme";
@@ -40,16 +40,16 @@ colors_basic.make_variable("red", "Basic Red Color", "Commonly used red color in
40
40
  colors_basic.make_variable("blue", "Basic Blue Color", "Commonly used blue color in form elements", BLUE["300"], BLUE["900"], "Color", void 0);
41
41
  colors_basic.make_variable("yellow", "Basic Yellow Color", "Commonly used yellow color in form elements", YELLOW["300"], ORANGE["900"], "Color", void 0);
42
42
  const sizes = theme_root.make_sub_group("size", "Size", "Sizes used in all form elements");
43
- sizes.make_variable("height", "Height", "Default height used in all form elements", "1.6rem", "1.6rem", "Length", {
43
+ sizes.make_variable("height", "Height", "Default height used in all form elements", "1.3rem", "1.3rem", "Length", {
44
44
  min: .1,
45
45
  max: 10
46
46
  });
47
- sizes.make_variable("touchHeight", "Touch Height", "Minimum height for touch devices used in all form elements", "2.6rem", "2.6rem", "Length", {
47
+ sizes.make_variable("touchHeight", "Touch Height", "Minimum height for touch devices used in all form elements", "2.0rem", "2.0rem", "Length", {
48
48
  min: .1,
49
49
  max: 10
50
50
  });
51
51
  const font = theme_root.make_sub_group("font", "Font", "Font settings used in all form elements");
52
- font.make_variable("size", "Font Size", "Default font size used in all form elements", "1rem", "1rem", "Length", {
52
+ font.make_variable("size", "Font Size", "Default font size used in all form elements", "0.9rem", "0.9rem", "Length", {
53
53
  min: .1,
54
54
  max: 10
55
55
  });
@@ -76,6 +76,7 @@ var FormElement = class extends Base {
76
76
  static element_name_space() {
77
77
  return "form";
78
78
  }
79
+ static apply_options(_element, _options) {}
79
80
  };
80
81
  /**Shared class for all components with values*/
81
82
  var FormValue = class extends FormElement {
@@ -86,6 +87,7 @@ var FormValue = class extends FormElement {
86
87
  if (options.description) element.description = options.description;
87
88
  if (options.value_by_state) element.value_by_state = options.value_by_state;
88
89
  else if (options.value !== void 0) element.value = options.value;
90
+ super.apply_options(element, options);
89
91
  }
90
92
  form_id;
91
93
  constructor(id) {
@@ -331,6 +333,14 @@ var FormButton = class extends FormValueWrite {
331
333
  if (color === FormColors.None) this.removeAttribute("color");
332
334
  else this.setAttribute("color", color);
333
335
  }
336
+ /**Centers text and icon */
337
+ set center(center) {
338
+ if (center) this.classList.add("center");
339
+ else this.classList.remove("center");
340
+ }
341
+ get center() {
342
+ return this.classList.contains("center");
343
+ }
334
344
  /**Called when value is changed */
335
345
  new_value(value) {
336
346
  if (value) this.classList.add("active");
@@ -362,6 +372,7 @@ function form_button(options) {
362
372
  if (options.on_click) butt.on_click = options.on_click;
363
373
  if (options.toggle) butt.toggle = options.toggle;
364
374
  if (options.color) butt.color = options.color;
375
+ if (options.center) butt.center = options.center;
365
376
  FormValue.apply_options(butt, options);
366
377
  }
367
378
  return butt;
@@ -398,6 +409,14 @@ var FormLamp = class extends FormValue {
398
409
  this.#colors = colors;
399
410
  this.new_value(this.buffer);
400
411
  }
412
+ /**Centers text and icon */
413
+ set center(center) {
414
+ if (center) this.classList.add("center");
415
+ else this.classList.remove("center");
416
+ }
417
+ get center() {
418
+ return this.classList.contains("center");
419
+ }
401
420
  /**Called when value is changed */
402
421
  new_value(value) {
403
422
  const color = this.#colors[Number(value)];
@@ -420,6 +439,7 @@ function from(options) {
420
439
  lamp.colors = options.colors;
421
440
  if (options.text) lamp.text = options.text;
422
441
  if (options.icon) lamp.icon = options.icon;
442
+ if (options.center) lamp.center = options.center;
423
443
  FormValue.apply_options(lamp, options);
424
444
  }
425
445
  return lamp;
@@ -544,7 +564,7 @@ function form_switch(options) {
544
564
  return swit;
545
565
  }
546
566
  //#endregion
547
- //#region src/group/group.ts
567
+ //#region src/group/group_base.ts
548
568
  /**Different border styles for the component group*/
549
569
  const FormGroupBorderStyle = {
550
570
  None: "none",
@@ -552,109 +572,19 @@ const FormGroupBorderStyle = {
552
572
  Outset: "outset",
553
573
  Line: "line"
554
574
  };
555
- /**Component group class which allows to add elements and controls the flow of the elements*/
556
- var FormGroup = class extends FormValue {
575
+ var FormGroupBase = class extends FormValue {
557
576
  static element_name() {
558
- return "group";
577
+ return "@abstract@";
559
578
  }
560
579
  static element_name_space() {
561
580
  return "form";
562
581
  }
563
- #collapsible;
564
- #collapsed = false;
565
- #collapse_button;
566
- #value_elements = /* @__PURE__ */ new Map();
567
- set elements(elements) {
568
- for (let i = 0, n = elements.length; i < n; i++) {
569
- const comp = elements[i];
570
- if (comp instanceof FormValue && comp.form_id) {
571
- if (this.#value_elements.has(comp.form_id)) {
572
- console.error("Form element with form id " + comp.form_id + " already exists in group");
573
- continue;
574
- }
575
- this.#value_elements.set(comp.form_id, comp);
576
- }
577
- if (this.#collapsible) this.#collapsible.appendChild(comp);
578
- else this.appendChild(comp);
579
- }
580
- }
581
- get elements() {
582
- return [...this.#value_elements.values()];
583
- }
582
+ value_elements = /* @__PURE__ */ new Map();
584
583
  /**This places the group at an absolute position in one of the corners of the container*/
585
584
  set border(border) {
586
585
  this.classList.remove(FormGroupBorderStyle.Inset, FormGroupBorderStyle.Outset);
587
586
  if (border && border !== FormGroupBorderStyle.None) this.classList.add(border);
588
587
  }
589
- set collapsible(collapsible) {
590
- if (collapsible && !this.#collapsible) {
591
- this.#collapsible = document.createElement("div");
592
- if (this.children.length > 1) this.#collapsible.replaceChildren(...this.children);
593
- this.appendChild(this.#collapsible);
594
- this.classList.add("collapsible");
595
- this.appendChild(this.#collapse_button || (this.collapse_text = "") || this.#collapse_button);
596
- this.collapsed = true;
597
- } else if (!collapsible && this.#collapsible) {
598
- this.collapsed = false;
599
- this.replaceChildren(...this.#collapsible.children);
600
- this.#collapsible = void 0;
601
- this.classList.remove("collapsible");
602
- }
603
- }
604
- get collapsible() {
605
- return this.#collapsible !== void 0;
606
- }
607
- set collapsed(collapsed) {
608
- if (this.#collapsible) {
609
- if (collapsed && !this.#collapsed) if (ANIMATION_LEVEL.get().value === AnimationLevels.All) {
610
- this.#collapsible.style.overflowY = "hidden";
611
- const full_height = this.#collapsible.getBoundingClientRect().height + "px";
612
- const animation = this.#collapsible.animate([{ height: full_height }, { height: "0" }], {
613
- duration: ANIMATION_SPEED.get().value,
614
- easing: "ease-in"
615
- });
616
- animation.onfinish = () => {
617
- this.classList.add("collapsed");
618
- if (this.#collapsible) this.#collapsible.style.overflowY = "";
619
- };
620
- } else this.classList.add("collapsed");
621
- else if (!collapsed && this.#collapsed) {
622
- this.classList.remove("collapsed");
623
- if (ANIMATION_LEVEL.get().value === AnimationLevels.All) {
624
- this.#collapsible.style.overflowY = "hidden";
625
- const full_height = this.#collapsible.getBoundingClientRect().height + "px";
626
- const animation = this.#collapsible.animate([{ height: "0" }, { height: full_height }], {
627
- duration: ANIMATION_SPEED.get().value,
628
- easing: "ease-out"
629
- });
630
- animation.onfinish = () => {
631
- if (this.#collapsible) this.#collapsible.style.overflowY = "";
632
- };
633
- }
634
- }
635
- this.#collapsed = collapsed;
636
- }
637
- }
638
- get collapsed() {
639
- return this.#collapsed;
640
- }
641
- set collapse_text(text) {
642
- if (!this.#collapse_button) {
643
- this.#collapse_button = document.createElement("span");
644
- this.#collapse_button.tabIndex = 0;
645
- this.#collapse_button.appendChild(document.createElement("span"));
646
- this.#collapse_button.appendChild(material_unfold_less_rounded());
647
- this.#collapse_button.appendChild(material_unfold_more_rounded());
648
- this.#collapse_button.onclick = () => this.collapsed = !this.collapsed;
649
- this.#collapse_button.onkeydown = (e) => {
650
- if (e.key === "Enter" || e.key === " ") {
651
- e.preventDefault();
652
- this.collapsed = !this.collapsed;
653
- }
654
- };
655
- }
656
- this.#collapse_button.firstChild.textContent = text;
657
- }
658
588
  set max_height(height) {
659
589
  this.style.setProperty("--max_height", height ? height + "rem" : "none");
660
590
  if (height) this.classList.add("max_height");
@@ -671,7 +601,7 @@ var FormGroup = class extends FormValue {
671
601
  get value() {
672
602
  if (this._state) return err("State based component");
673
603
  const result = {};
674
- for (const [key, comp] of this.#value_elements) {
604
+ for (const [key, comp] of this.value_elements) {
675
605
  const val = comp.value;
676
606
  if (val.err) return err("Component with id " + key + " has no value");
677
607
  result[key] = val.value;
@@ -679,10 +609,10 @@ var FormGroup = class extends FormValue {
679
609
  return ok(result);
680
610
  }
681
611
  new_value(val) {
682
- for (const key in val) if (this.#value_elements.has(key)) this.#value_elements.get(key).value = val[key];
612
+ for (const key in val) if (this.value_elements.has(key)) this.value_elements.get(key).value = val[key];
683
613
  }
684
614
  clear_value() {
685
- for (const comp of this.#value_elements.values()) comp.clear();
615
+ for (const comp of this.value_elements.values()) comp.clear();
686
616
  }
687
617
  new_error(err) {
688
618
  console.error(err);
@@ -704,23 +634,173 @@ var FormGroup = class extends FormValue {
704
634
  }
705
635
  }
706
636
  };
637
+ //#endregion
638
+ //#region src/group/group.ts
639
+ /**Component group class which allows to add elements and controls the flow of the elements*/
640
+ var FormGroup = class extends FormGroupBase {
641
+ static element_name() {
642
+ return "group";
643
+ }
644
+ static element_name_space() {
645
+ return "form";
646
+ }
647
+ constructor(id) {
648
+ super(id);
649
+ this.classList.add("flex-col");
650
+ }
651
+ set column(column) {
652
+ this.classList.remove("grid-row", "grid-col", "flex-row", "flex-col");
653
+ if (column === true) this.classList.add("flex-col");
654
+ else {
655
+ this.classList.add("grid-col");
656
+ if (typeof column === "string") this.style.gridTemplateColumns = "repeat(auto-fit, minmax(" + column + ", 1fr))";
657
+ else this.style.gridTemplateColumns = column.map((col) => "minmax(" + col + ", 1fr)").join(" ");
658
+ }
659
+ }
660
+ set row(row) {
661
+ this.classList.remove("grid-row", "grid-col", "flex-row", "flex-col");
662
+ if (row === true) this.classList.add("flex-row");
663
+ else {
664
+ this.classList.add("grid-row");
665
+ if (typeof row === "string") this.style.gridTemplateRows = "repeat(auto-fit, minmax(" + row + ", 1fr))";
666
+ else this.style.gridTemplateRows = row.map((col) => "minmax(" + col + ", 1fr)").join(" ");
667
+ }
668
+ }
669
+ set elements(elements) {
670
+ for (let i = 0, n = elements.length; i < n; i++) {
671
+ const comp = elements[i];
672
+ if (comp instanceof FormValue && comp.form_id) {
673
+ if (this.value_elements.has(comp.form_id)) {
674
+ console.error("Form element with form id " + comp.form_id + " already exists in group");
675
+ continue;
676
+ }
677
+ this.value_elements.set(comp.form_id, comp);
678
+ }
679
+ this.appendChild(comp);
680
+ }
681
+ }
682
+ get elements() {
683
+ return [...this.value_elements.values()];
684
+ }
685
+ };
707
686
  define_element(FormGroup);
708
- /**Creates a dropdown form element */
709
- function form_group(options) {
687
+ /**Creates a form group with elements in a column */
688
+ function form_group_col(options) {
710
689
  const slide = new FormGroup(options?.id);
711
690
  if (options) {
712
691
  if (options.border) slide.border = options.border;
713
692
  if (options.elements) slide.elements = options.elements;
714
- if (options.collapse_text) slide.collapse_text = options.collapse_text;
715
- if (options.collapsible) slide.collapsible = options.collapsible;
716
- if (options.collapsed) slide.collapsed = options.collapsed;
717
693
  if (options.max_height) slide.max_height = options.max_height;
718
694
  if (options.embed) slide.embed = options.embed;
695
+ if (options.column) slide.column = options.column;
696
+ else if (options.row) slide.row = options.row;
719
697
  FormValue.apply_options(slide, options);
720
698
  }
721
699
  return slide;
722
700
  }
723
701
  //#endregion
702
+ //#region src/group/group_collapser.ts
703
+ const open_text = document.createElement("span");
704
+ open_text.textContent = "Collapse";
705
+ const close_text = document.createElement("span");
706
+ close_text.textContent = "Expand";
707
+ /**Component group class which allows to add elements and controls the flow of the elements*/
708
+ var FormGroupCollapser = class extends FormElement {
709
+ static element_name() {
710
+ return "group-collapser";
711
+ }
712
+ static element_name_space() {
713
+ return "form";
714
+ }
715
+ #group;
716
+ #collapse_button;
717
+ #collapsed = false;
718
+ #open_text = node_clone(open_text);
719
+ #close_text = node_clone(close_text);
720
+ constructor(group, collapsed) {
721
+ super();
722
+ this.#group = this.appendChild(group);
723
+ if (collapsed) {
724
+ this.classList.add("collapsed");
725
+ this.#collapsed = true;
726
+ }
727
+ this.#collapse_button = this.appendChild(document.createElement("span"));
728
+ this.#collapse_button.tabIndex = 0;
729
+ this.#collapse_button.appendChild(collapsed ? this.#close_text : this.#open_text);
730
+ this.#collapse_button.appendChild(material_unfold_less_rounded());
731
+ this.#collapse_button.onclick = () => this.collapsed = !this.collapsed;
732
+ this.#collapse_button.onkeydown = (e) => {
733
+ if (e.key === "Enter" || e.key === " ") {
734
+ e.preventDefault();
735
+ this.collapsed = !this.collapsed;
736
+ }
737
+ };
738
+ }
739
+ set group(group) {
740
+ const old_group = this.#group;
741
+ this.#group = this.replaceChild(group, old_group);
742
+ }
743
+ get group() {
744
+ return this.#group;
745
+ }
746
+ set collapsed(collapsed) {
747
+ if (collapsed && !this.#collapsed) {
748
+ this.#collapse_button.replaceChildren(this.#close_text, material_unfold_more_rounded());
749
+ if (ANIMATION_LEVEL.get().value === AnimationLevels.All) {
750
+ this.#group.style.overflowY = "auto";
751
+ const full_height = this.#group.getBoundingClientRect().height + "px";
752
+ const animation = this.#group.animate([{ maxHeight: full_height }, {
753
+ maxHeight: "0px",
754
+ paddingBlock: "0px"
755
+ }], {
756
+ duration: ANIMATION_SPEED.get().value,
757
+ easing: "ease-in-out"
758
+ });
759
+ animation.onfinish = async () => {
760
+ this.classList.add("collapsed");
761
+ this.#group.style.overflowY = "";
762
+ };
763
+ } else this.classList.add("collapsed");
764
+ } else if (!collapsed && this.#collapsed) {
765
+ this.classList.remove("collapsed");
766
+ this.#collapse_button.replaceChildren(this.#open_text, material_unfold_less_rounded());
767
+ if (ANIMATION_LEVEL.get().value === AnimationLevels.All) {
768
+ this.#group.style.overflowY = "auto";
769
+ const full_height = this.#group.getBoundingClientRect().height + "px";
770
+ const animation = this.#group.animate([{
771
+ maxHeight: "0px",
772
+ paddingBlock: "0px"
773
+ }, { maxHeight: full_height }], {
774
+ duration: ANIMATION_SPEED.get().value,
775
+ easing: "ease-in-out"
776
+ });
777
+ animation.onfinish = () => this.#group.style.overflowY = "";
778
+ }
779
+ }
780
+ this.#collapsed = collapsed;
781
+ }
782
+ get collapsed() {
783
+ return this.#collapsed;
784
+ }
785
+ set open_text(text) {
786
+ this.#open_text.textContent = text;
787
+ }
788
+ set close_text(text) {
789
+ this.#close_text.textContent = text;
790
+ }
791
+ };
792
+ define_element(FormGroupCollapser);
793
+ /**Creates a dropdown form element */
794
+ function form_group_collapser(group, options) {
795
+ const slide = new FormGroupCollapser(group, options?.collapsed);
796
+ if (options) {
797
+ if (options.open_text) slide.open_text = options.open_text;
798
+ if (options.close_text) slide.close_text = options.close_text;
799
+ FormElement.apply_options(slide, options);
800
+ }
801
+ return slide;
802
+ }
803
+ //#endregion
724
804
  //#region src/list/list_field.ts
725
805
  var ListFormField = class extends ListField {
726
806
  static element_name() {
@@ -770,7 +850,7 @@ var FormNumberWrite = class extends FormValueWrite {
770
850
  }
771
851
  };
772
852
  //#endregion
773
- //#region src/number/numberInput/number_input.ts
853
+ //#region src/number/number_input/number_input.ts
774
854
  /**Slide Selector, displays all options in a slider*/
775
855
  var NumberInput = class extends FormNumberWrite {
776
856
  static element_name() {
@@ -863,14 +943,14 @@ var NumberInput = class extends FormNumberWrite {
863
943
  this.#update_min_legend();
864
944
  }
865
945
  #update_min_legend() {
866
- this.#min_legend.textContent = this.#min === -Infinity ? "" : "Min: " + this.#min.toFixed(this.#decimals) + this.#unit;
946
+ this.#min_legend.textContent = this.#min === -Infinity ? "" : "Min:" + this.#min.toFixed(this.#decimals);
867
947
  }
868
948
  set max(max) {
869
949
  this.#max = max ?? Infinity;
870
950
  this.#update_max_lengend();
871
951
  }
872
952
  #update_max_lengend() {
873
- this.#max_legend.textContent = this.#max === Infinity ? "" : "Max: " + this.#max.toFixed(this.#decimals) + this.#unit;
953
+ this.#max_legend.textContent = this.#max === Infinity ? "" : "Max:" + this.#max.toFixed(this.#decimals);
874
954
  }
875
955
  set step(step) {
876
956
  this.#step = step || 0;
@@ -1111,7 +1191,7 @@ var FormSlider = class extends FormNumberWrite {
1111
1191
  this.#update_min_legend();
1112
1192
  }
1113
1193
  #update_min_legend() {
1114
- this.#left_legend.textContent = this.#min === -Infinity ? "" : "Min: " + this.#min.toFixed(this.#decimals) + this.#unit;
1194
+ this.#left_legend.textContent = this.#min === -Infinity ? "" : "Min:" + this.#min.toFixed(this.#decimals);
1115
1195
  }
1116
1196
  set max(max) {
1117
1197
  this.#max = max ?? Infinity;
@@ -1119,7 +1199,7 @@ var FormSlider = class extends FormNumberWrite {
1119
1199
  this.#update_max_legend();
1120
1200
  }
1121
1201
  #update_max_legend() {
1122
- this.#right_legend.textContent = this.#max === Infinity ? "" : this.#max.toFixed(this.#decimals) + this.#unit + " :Max";
1202
+ this.#right_legend.textContent = this.#max === Infinity ? "" : this.#max.toFixed(this.#decimals) + ":Max";
1123
1203
  }
1124
1204
  #update_min_max() {
1125
1205
  this.#span = this.#max - this.#min;
@@ -1379,14 +1459,14 @@ var FormStepper = class extends FormNumberWrite {
1379
1459
  this.#update_min_legend();
1380
1460
  }
1381
1461
  #update_min_legend() {
1382
- this.#min_legend.textContent = this.#min === -Infinity ? "" : "Min: " + this.#min.toFixed(this.#decimals) + this.#unit;
1462
+ this.#min_legend.textContent = this.#min === -Infinity ? "" : "Min:" + this.#min.toFixed(this.#decimals);
1383
1463
  }
1384
1464
  set max(max) {
1385
1465
  this.#max = max ?? Infinity;
1386
1466
  this.#update_max_lengend();
1387
1467
  }
1388
1468
  #update_max_lengend() {
1389
- this.#max_legend.textContent = this.#max === Infinity ? "" : "Max: " + this.#max.toFixed(this.#decimals) + this.#unit;
1469
+ this.#max_legend.textContent = this.#max === Infinity ? "" : "Max:" + this.#max.toFixed(this.#decimals);
1390
1470
  }
1391
1471
  set step(step) {
1392
1472
  this.#step = step || 0;
@@ -1592,10 +1672,14 @@ var FormDropdown = class extends FormSelectorBase {
1592
1672
  }
1593
1673
  set open(open) {
1594
1674
  if (open && !this.is_open) {
1595
- this.#open.replaceChildren(material_unfold_less_rounded());
1675
+ const old = this.#open;
1676
+ this.#open = material_unfold_less_rounded();
1677
+ old.replaceWith(this.#open);
1596
1678
  box.open_menu(this.#map, this, this.buffer);
1597
1679
  } else if (!open && this.is_open) {
1598
- this.#open.replaceChildren(material_unfold_more_rounded());
1680
+ const old = this.#open;
1681
+ this.#open = material_unfold_more_rounded();
1682
+ old.replaceWith(this.#open);
1599
1683
  box.close_menu();
1600
1684
  }
1601
1685
  this.is_open = open;
@@ -1769,6 +1853,7 @@ var DropDownBox = class extends Base {
1769
1853
  close_menu() {
1770
1854
  if (!this.#is_open) return;
1771
1855
  this.#is_open = false;
1856
+ if (this.#dropdown) this.#dropdown.open = false;
1772
1857
  this.classList.remove("open");
1773
1858
  this.#table.replaceChildren();
1774
1859
  if (this.#dropdown) {
@@ -2321,7 +2406,7 @@ function form_text_input(options) {
2321
2406
  return input;
2322
2407
  }
2323
2408
  //#endregion
2324
- //#region src/text/multiLine/text_multi_line.ts
2409
+ //#region src/text/multi_line/text_multi_line.ts
2325
2410
  var FormTextMultiline = class extends FormValueWrite {
2326
2411
  static element_name() {
2327
2412
  return "textmultiline";
@@ -2479,7 +2564,8 @@ var FormText = class extends FormElement {
2479
2564
  }
2480
2565
  /**Sets the current text of the element*/
2481
2566
  set size(size) {
2482
- this.style.fontSize = `${size}rem`;
2567
+ this.style.fontSize = size + "rem";
2568
+ this.style.lineHeight = size + "rem";
2483
2569
  }
2484
2570
  };
2485
2571
  define_element(FormText);
@@ -2495,7 +2581,8 @@ const form = {
2495
2581
  button: form_button,
2496
2582
  switch: form_switch,
2497
2583
  lamp: form_lamp,
2498
- group: form_group,
2584
+ group_col: form_group_col,
2585
+ group_collapser: form_group_collapser,
2499
2586
  color_input: form_color_input,
2500
2587
  date_time_input: form_date_time_input,
2501
2588
  FormDateTimeType,
@@ -2516,4 +2603,4 @@ const form = {
2516
2603
  //#endregion
2517
2604
  export { FormColors, FormDateTimeType, form as default, form };
2518
2605
 
2519
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiI2Z1bmMiLCIjZXJyb3IiLCIjY2hhbmdlIiwiI2NoYW5nZWQiLCIjd2Fybl90aW1lb3V0IiwiI3NldF92YWx1ZSIsIiNvbl9jbGljayIsIiN0b2dnbGUiLCIjdGV4dCIsIiNpY29uIiwiI3RleHQiLCIjaWNvbiIsIiNjb2xvcnMiLCIjc3dpdGNoIiwiI3ByZXZlbnRfY2xpY2siLCIjaWNvbiIsIiN2YWx1ZV9lbGVtZW50cyIsIiNjb2xsYXBzaWJsZSIsIiNjb2xsYXBzZV9idXR0b24iLCIjY29sbGFwc2VkIiwiI2xlZ2VuZCIsIiN2YWx1ZV9ib3giLCIjc2VsZWN0ZWQiLCIjc2V0IiwiI3N0ZXBfdmFsdWUiLCIjZGVjaW1hbHMiLCIjbWluIiwiI21heCIsIiN1bml0IiwiI3VuaXRfYm94IiwiI3VwZGF0ZV9taW5fbGVnZW5kIiwiI3VwZGF0ZV9tYXhfbGVuZ2VuZCIsIiNtaW5fbGVnZW5kIiwiI21heF9sZWdlbmQiLCIjc3RlcCIsIiNzdGFydCIsIiNtaW4iLCIjc3BhbiIsIiNtYXgiLCIjZGVjaW1hbHMiLCIjdW5pdCIsIiNiYXIiLCIjdmFsIiwiI3N0ZXBwZXJfZnVuYyIsIiNsZWdlbmQiLCIjc2xpZGUiLCIjc2xpZGVyIiwiI21pbiIsIiNtYXgiLCIjbGl2ZSIsIiNtb3ZlX3ZhbHVlIiwiI3hfdG9fcGVyYyIsIiNtb3ZlX3NsaWRlIiwiI3N0ZXAiLCIjbW92ZV9hYnNvbHV0ZSIsIiNzdGVwX3ZhbHVlIiwiI3VuaXQiLCIjdW5pdF9ib3giLCIjdXBkYXRlX21pbl9sZWdlbmQiLCIjdXBkYXRlX21heF9sZWdlbmQiLCIjdXBkYXRlX21pbl9tYXgiLCIjbGVmdF9sZWdlbmQiLCIjZGVjaW1hbHMiLCIjcmlnaHRfbGVnZW5kIiwiI3NwYW4iLCIjc3RhcnQiLCIjaWNvbl9kZWMiLCIjaWNvbl9pbmMiLCIjdmFsdWVfYm94IiwiI3BlcmNfdG9fdmFsdWUiLCIjc3RlcHBlcl9mdW5jIiwiI3RleHQiLCIjbGVnZW5kIiwiI3ZhbHVlX2JveCIsIiNtb3ZlX2RpZmYiLCIjc3RlcCIsIiNzdGVwX3ZhbHVlIiwiI2RlY2ltYWxzIiwiI21pbiIsIiN1bml0IiwiI3VuaXRfYm94IiwiI3VwZGF0ZV9taW5fbGVnZW5kIiwiI3VwZGF0ZV9tYXhfbGVuZ2VuZCIsIiNtaW5fbGVnZW5kIiwiI21heCIsIiNtYXhfbGVnZW5kIiwiI3N0YXJ0IiwiI2xpdmUiLCIjaWNvbl9kZWMiLCIjaWNvbl9pbmMiLCIjbW92ZV92YWx1ZSIsIiN0ZXh0IiwiI2RlZmF1bHQiLCIjc2VsZWN0X2FkamFjZW50IiwiI2RlZmF1bHRfaWNvbiIsIiNzZWxlY3RlZCIsIiNzZXRfaWNvbiIsIiNtYXAiLCIjdmFsdWVzIiwiI29wZW4iLCIjaWNvbiIsIiNjbGVhciIsIiNjb250YWluZXIiLCIjc2Nyb2xsIiwiI3RhYmxlIiwiI2Nsb3NlciIsIiNmb2N1c19vdXRfaGFuZGxlciIsIiNkcm9wZG93biIsIiNzZXRfdmFsdWUiLCIjd2luZG93X3Jlc2l6ZV9oYW5kbGVyIiwiI2lzX29wZW4iLCIjbWFwIiwiI3ZhbHVlcyIsIiNzZWxlY3RlZCIsIiNhZGRfc2VsZWN0aW9uIiwiI3NlbGVjdF9hZGphY2VudCIsIiNsaXZlIiwiI21vZGUiLCIjdHlwZSIsIiN0eXBlIiwiI3BhcnRzIiwiI2ZpbHRlciIsIiNzZXQiLCIjZmlsdGVyIiwiI21heF9sZW5ndGgiLCIjbWF4X2J5dGVzIiwiI3Jlc2l6ZXIiLCIjdmFsdWVfYm94IiwiI3NldCIsIiNmaWx0ZXIiLCIjbWF4X2xlbmd0aCIsIiNtYXhfYnl0ZXMiXSwic291cmNlcyI6WyIuLi9zcmMvc2hhcmVkLnRzIiwiLi4vc3JjL2Jhc2UudHMiLCIuLi9zcmMvYm9vbGVhbi9idXR0b24vYnV0dG9uLnRzIiwiLi4vc3JjL2Jvb2xlYW4vbGFtcC9sYW1wLnRzIiwiLi4vc3JjL2Jvb2xlYW4vc3dpdGNoL3N3aXRjaC50cyIsIi4uL3NyYy9ncm91cC9ncm91cC50cyIsIi4uL3NyYy9saXN0L2xpc3RfZmllbGQudHMiLCIuLi9zcmMvbnVtYmVyL251bWJlcl9iYXNlLnRzIiwiLi4vc3JjL251bWJlci9udW1iZXJJbnB1dC9udW1iZXJfaW5wdXQudHMiLCIuLi9zcmMvbnVtYmVyL3Byb2dyZXNzL3Byb2dyZXNzLnRzIiwiLi4vc3JjL251bWJlci9zbGlkZXIvc2xpZGVyLnRzIiwiLi4vc3JjL251bWJlci9zdGVwcGVyL3N0ZXBwZXIudHMiLCIuLi9zcmMvc2VsZWN0b3JzL3NlbGVjdG9yX2Jhc2UudHMiLCIuLi9zcmMvc2VsZWN0b3JzL2Ryb3BfZG93bi9kcm9wX2Rvd24udHMiLCIuLi9zcmMvc2VsZWN0b3JzL3RvZ2dsZV9idXR0b24vdG9nZ2xlX2J1dHRvbi50cyIsIi4uL3NyYy9zcGFjaW5nL3NwYWNlci50cyIsIi4uL3NyYy9zcGVjaWFsL2NvbG9yL2NvbG9yX2lucHV0LnRzIiwiLi4vc3JjL3NwZWNpYWwvZGF0ZV90aW1lL2RhdGVfdGltZV9pbnB1dC50cyIsIi4uL3NyYy9zcGVjaWFsL2lwL2lwX2lucHV0LnRzIiwiLi4vc3JjL3NwZWNpYWwvcGFzc3dvcmQvcGFzc3dvcmRfaW5wdXQudHMiLCIuLi9zcmMvdGV4dC9pbnB1dC90ZXh0X2lucHV0LnRzIiwiLi4vc3JjL3RleHQvbXVsdGlMaW5lL3RleHRfbXVsdGlfbGluZS50cyIsIi4uL3NyYy90ZXh0L3RleHQvdGV4dC50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCTFVFLFxuICBHUkVFTixcbiAgR1JFWSxcbiAgT1JBTkdFLFxuICBSRUQsXG4gIFlFTExPVyxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29sb3JzXCI7XG5pbXBvcnQgeyB0aGVtZV9pbml0X3ZhcmlhYmxlX3Jvb3QgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi10aGVtZVwiO1xuXG5jb25zdCB0aGVtZV9yb290ID0gdGhlbWVfaW5pdF92YXJpYWJsZV9yb290KFxuICBcImZvcm1cIixcbiAgXCJVSSBGb3JtIEVsZW1lbnRzXCIsXG4gIFwiVGhlbWUgdmFyaWFibGVzIGZvciBVSSBmb3JtIEVsZW1lbnRzXCIsXG4pO1xuXG4vLyAgICAgIF9fX19fICBfX19fX18gICAgICAgICAgX19fX18gICAgIF9fX18gIF8gICBfIF8gIF9fICAgICBfX1xuLy8gICAgIHwgIF9fIFxcfCAgX19fX3wgICAvXFwgICB8ICBfXyBcXCAgIC8gX18gXFx8IFxcIHwgfCB8IFxcIFxcICAgLyAvXG4vLyAgICAgfCB8X18pIHwgfF9fICAgICAvICBcXCAgfCB8ICB8IHwgfCB8ICB8IHwgIFxcfCB8IHwgIFxcIFxcXy8gL1xuLy8gICAgIHwgIF8gIC98ICBfX3wgICAvIC9cXCBcXCB8IHwgIHwgfCB8IHwgIHwgfCAuIGAgfCB8ICAgXFwgICAvXG4vLyAgICAgfCB8IFxcIFxcfCB8X19fXyAvIF9fX18gXFx8IHxfX3wgfCB8IHxfX3wgfCB8XFwgIHwgfF9fX198IHxcbi8vICAgICB8X3wgIFxcX1xcX19fX19fL18vICAgIFxcX1xcX19fX18vICAgXFxfX19fL3xffCBcXF98X19fX19ffF98XG5jb25zdCByZWFkX29ubHkgPSB0aGVtZV9yb290Lm1ha2Vfc3ViX2dyb3VwKFxuICBcInJlYWRcIixcbiAgXCJSZWFkIE9ubHlcIixcbiAgXCJTZXR0aW5ncyBmb3IgZm9ybSBlbGVtZW50cyBpbiByZWFkIG9ubHkgbW9kZVwiLFxuKTtcbnJlYWRfb25seS5tYWtlX3ZhcmlhYmxlKFxuICBcImZpbHRlclwiLFxuICBcIlJlYWQgT25seSBGaWx0ZXJcIixcbiAgXCJGaWx0ZXIgYXBwbGllZCB0byBmb3JtIGVsZW1lbnRzIGluIHJlYWQgb25seSBtb2RlXCIsXG4gIFwib3BhY2l0eSgwLjYpXCIsXG4gIFwib3BhY2l0eSgwLjYpXCIsXG4gIFwiRmlsdGVyXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5cbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjM1xuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMzXG4vLyAgICAgICBfX19fXyBfX19fICBfICAgICAgX19fXyAgX19fX18gICBfX19fX1xuLy8gICAgICAvIF9fX18vIF9fIFxcfCB8ICAgIC8gX18gXFx8ICBfXyBcXCAvIF9fX198XG4vLyAgICAgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8IHxfXykgfCAoX19fXG4vLyAgICAgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8ICBfICAvIFxcX19fIFxcXG4vLyAgICAgfCB8X19ffCB8X198IHwgfF9fX3wgfF9ffCB8IHwgXFwgXFwgX19fXykgfFxuLy8gICAgICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzID0gdGhlbWVfcm9vdC5tYWtlX3N1Yl9ncm91cChcbiAgXCJjb2xvcnNcIixcbiAgXCJDb2xvcnNcIixcbiAgXCJDb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcblxuLy8gICAgICBfX19fX19fIF9fX19fX19fICAgX19fX19fX19fICAgIF9fX19fIF9fX18gIF8gICAgICBfX19fICBfX19fXyAgIF9fX19fXG4vLyAgICAgfF9fICAgX198ICBfX19fXFwgXFwgLyAvX18gICBfX3wgIC8gX19fXy8gX18gXFx8IHwgICAgLyBfXyBcXHwgIF9fIFxcIC8gX19fX3xcbi8vICAgICAgICB8IHwgIHwgfF9fICAgXFwgViAvICAgfCB8ICAgIHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCB8X18pIHwgKF9fX1xuLy8gICAgICAgIHwgfCAgfCAgX198ICAgPiA8ICAgIHwgfCAgICB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgIF8gIC8gXFxfX18gXFxcbi8vICAgICAgICB8IHwgIHwgfF9fX18gLyAuIFxcICAgfCB8ICAgIHwgfF9fX3wgfF9ffCB8IHxfX198IHxfX3wgfCB8IFxcIFxcIF9fX18pIHxcbi8vICAgICAgICB8X3wgIHxfX19fX18vXy8gXFxfXFwgIHxffCAgICAgXFxfX19fX1xcX19fXy98X19fX19fXFxfX19fL3xffCAgXFxfXFxfX19fXy9cbmNvbnN0IGNvbG9yc190ZXh0ID0gY29sb3JzLm1ha2Vfc3ViX2dyb3VwKFxuICBcInRleHRcIixcbiAgXCJUZXh0IENvbG9yc1wiLFxuICBcIlRleHQgY29sb3JzIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5jb2xvcnNfdGV4dC5tYWtlX3ZhcmlhYmxlKFxuICBcImxhYmVsXCIsXG4gIFwiTGFiZWwgQ29sb3JcIixcbiAgXCJDb2xvciBvZiBmb3JtIGVsZW1lbnRzIGxhYmVsc1wiLFxuICBHUkVZW1wiNzAwXCJdLFxuICBHUkVZW1wiMzAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfdGV4dC5tYWtlX3ZhcmlhYmxlKFxuICBcIm5vcm1hbFwiLFxuICBcIk5vcm1hbCBUZXh0IENvbG9yXCIsXG4gIFwiTm9ybWFsIHRleHQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiODAwXCJdLFxuICBHUkVZW1wiMjAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfdGV4dC5tYWtlX3ZhcmlhYmxlKFxuICBcInNlbGVjdGVkXCIsXG4gIFwiU2VsZWN0ZWQgVGV4dCBDb2xvclwiLFxuICBcIlNlbGVjdGVkIHRleHQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiOTAwXCJdLFxuICBHUkVZW1wiNTBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc190ZXh0Lm1ha2VfdmFyaWFibGUoXG4gIFwidW5zZWxlY3RlZFwiLFxuICBcIlVuc2VsZWN0ZWQgVGV4dCBDb2xvclwiLFxuICBcIlVuc2VsZWN0ZWQgdGV4dCBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRVlbXCI2MDBcIl0sXG4gIEdSRVlbXCI0MDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8gICAgICBfX19fX19fIF9fX19fX19fICAgX19fX19fX19fICAgX19fXyAgXyAgICAgICAgICAgICAgIF9fX19fIF8gIF9fXG4vLyAgICAgfF9fICAgX198ICBfX19fXFwgXFwgLyAvX18gICBfX3wgfCAgXyBcXHwgfCAgICAgICAgL1xcICAgLyBfX19ffCB8LyAvXG4vLyAgICAgICAgfCB8ICB8IHxfXyAgIFxcIFYgLyAgIHwgfCAgICB8IHxfKSB8IHwgICAgICAgLyAgXFwgfCB8ICAgIHwgJyAvXG4vLyAgICAgICAgfCB8ICB8ICBfX3wgICA+IDwgICAgfCB8ICAgIHwgIF8gPHwgfCAgICAgIC8gL1xcIFxcfCB8ICAgIHwgIDxcbi8vICAgICAgICB8IHwgIHwgfF9fX18gLyAuIFxcICAgfCB8ICAgIHwgfF8pIHwgfF9fX18gLyBfX19fIFxcIHxfX19ffCAuIFxcXG4vLyAgICAgICAgfF98ICB8X19fX19fL18vIFxcX1xcICB8X3wgICAgfF9fX18vfF9fX19fXy9fLyAgICBcXF9cXF9fX19ffF98XFxfXFxcbi8vXG4vL1xuY29uc3QgY29sb3JzX3RleHRfYmxhY2sgPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwidGV4dEJsYWNrXCIsXG4gIFwiVGV4dCBDb2xvcnMgQmxhY2sgQmFja2dyb3VuZFwiLFxuICBcIlRleHQgY29sb3JzIHVzZWQgZm9yIGJsYWNrIGJhY2tncm91bmQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5jb2xvcnNfdGV4dF9ibGFjay5tYWtlX3ZhcmlhYmxlKFxuICBcIm5vcm1hbFwiLFxuICBcIk5vcm1hbCBUZXh0IENvbG9yXCIsXG4gIFwiTm9ybWFsIHRleHQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiMjAwXCJdLFxuICBHUkVZW1wiMjAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfdGV4dF9ibGFjay5tYWtlX3ZhcmlhYmxlKFxuICBcInNlbGVjdGVkXCIsXG4gIFwiU2VsZWN0ZWQgVGV4dCBDb2xvclwiLFxuICBcIlNlbGVjdGVkIHRleHQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiNTBcIl0sXG4gIEdSRVlbXCI1MFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX3RleHRfYmxhY2subWFrZV92YXJpYWJsZShcbiAgXCJ1bnNlbGVjdGVkXCIsXG4gIFwiVW5zZWxlY3RlZCBUZXh0IENvbG9yXCIsXG4gIFwiVW5zZWxlY3RlZCB0ZXh0IGNvbG9yIGluIGZvcm0gZWxlbWVudHNcIixcbiAgR1JFWVtcIjYwMFwiXSxcbiAgR1JFWVtcIjQwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuXG4vLyAgICAgIF9fX19fIF9fX19fIF9fX18gIF8gICBfICAgIF9fX19fIF9fX18gIF8gICAgICBfX19fICBfX19fXyAgIF9fX19fXG4vLyAgICAgfF8gICBfLyBfX19fLyBfXyBcXHwgXFwgfCB8ICAvIF9fX18vIF9fIFxcfCB8ICAgIC8gX18gXFx8ICBfXyBcXCAvIF9fX198XG4vLyAgICAgICB8IHx8IHwgICB8IHwgIHwgfCAgXFx8IHwgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8IHxfXykgfCAoX19fXG4vLyAgICAgICB8IHx8IHwgICB8IHwgIHwgfCAuIGAgfCB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgIF8gIC8gXFxfX18gXFxcbi8vICAgICAgX3wgfHwgfF9fX3wgfF9ffCB8IHxcXCAgfCB8IHxfX198IHxfX3wgfCB8X19ffCB8X198IHwgfCBcXCBcXCBfX19fKSB8XG4vLyAgICAgfF9fX19fXFxfX19fX1xcX19fXy98X3wgXFxffCAgXFxfX19fX1xcX19fXy98X19fX19fXFxfX19fL3xffCAgXFxfXFxfX19fXy9cbmNvbnN0IGNvbG9yc19pY29uID0gY29sb3JzLm1ha2Vfc3ViX2dyb3VwKFxuICBcImljb25cIixcbiAgXCJJY29uIENvbG9yc1wiLFxuICBcIkljb24gY29sb3JzIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5jb2xvcnNfaWNvbi5tYWtlX3ZhcmlhYmxlKFxuICBcIm5vcm1hbFwiLFxuICBcIk5vcm1hbCBJY29uIENvbG9yXCIsXG4gIFwiQ29sb3Igb2YgaWNvbnMgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiODAwXCJdLFxuICBHUkVZW1wiMjAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfaWNvbi5tYWtlX3ZhcmlhYmxlKFxuICBcInNlbGVjdGVkXCIsXG4gIFwiU2VsZWN0ZWQgSWNvbiBDb2xvclwiLFxuICBcIkNvbG9yIG9mIHNlbGVjdGVkIGljb25zIGluIGZvcm0gZWxlbWVudHNcIixcbiAgR1JFWVtcIjkwMFwiXSxcbiAgR1JFWVtcIjUwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfaWNvbi5tYWtlX3ZhcmlhYmxlKFxuICBcInVuc2VsZWN0ZWRcIixcbiAgXCJVbnNlbGVjdGVkIEljb24gQ29sb3JcIixcbiAgXCJDb2xvciBvZiB1bnNlbGVjdGVkIGljb25zIGluIGZvcm0gZWxlbWVudHNcIixcbiAgR1JFWVtcIjYwMFwiXSxcbiAgR1JFWVtcIjQwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuXG4vLyAgICAgIF9fX18gICAgICAgICAgX19fX18gXyAgX19fX19fXyBfX19fXyAgIF9fX18gIF8gICAgXyBfICAgXyBfX19fXyAgICAgX19fX18gX19fXyAgXyAgICAgIF9fX18gIF9fX19fICAgX19fX19cbi8vICAgICB8ICBfIFxcICAgL1xcICAgLyBfX19ffCB8LyAvIF9fX198ICBfXyBcXCAvIF9fIFxcfCB8ICB8IHwgXFwgfCB8ICBfXyBcXCAgIC8gX19fXy8gX18gXFx8IHwgICAgLyBfXyBcXHwgIF9fIFxcIC8gX19fX3xcbi8vICAgICB8IHxfKSB8IC8gIFxcIHwgfCAgICB8ICcgLyB8ICBfX3wgfF9fKSB8IHwgIHwgfCB8ICB8IHwgIFxcfCB8IHwgIHwgfCB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgfF9fKSB8IChfX19cbi8vICAgICB8ICBfIDwgLyAvXFwgXFx8IHwgICAgfCAgPHwgfCB8XyB8ICBfICAvfCB8ICB8IHwgfCAgfCB8IC4gYCB8IHwgIHwgfCB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgIF8gIC8gXFxfX18gXFxcbi8vICAgICB8IHxfKSAvIF9fX18gXFwgfF9fX198IC4gXFwgfF9ffCB8IHwgXFwgXFx8IHxfX3wgfCB8X198IHwgfFxcICB8IHxfX3wgfCB8IHxfX198IHxfX3wgfCB8X19ffCB8X198IHwgfCBcXCBcXCBfX19fKSB8XG4vLyAgICAgfF9fX18vXy8gICAgXFxfXFxfX19fX3xffFxcX1xcX19fX198X3wgIFxcX1xcXFxfX19fLyBcXF9fX18vfF98IFxcX3xfX19fXy8gICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzX2JhY2tncm91bmQgPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwiYmFja2dyb3VuZFwiLFxuICBcIkJhY2tncm91bmQgQ29sb3JzXCIsXG4gIFwiQmFja2dyb3VuZCBjb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcbmNvbG9yc19iYWNrZ3JvdW5kLm1ha2VfdmFyaWFibGUoXG4gIFwibm9ybWFsXCIsXG4gIFwiTm9ybWFsIEJhY2tncm91bmQgQ29sb3JcIixcbiAgXCJDb2xvciBvZiBub3JtYWwgZm9ybSBlbGVtZW50IGJhY2tncm91bmRzXCIsXG4gIEdSRVlbXCI1MFwiXSxcbiAgR1JFWVtcIjkwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX2JhY2tncm91bmQubWFrZV92YXJpYWJsZShcbiAgXCJob3ZlclwiLFxuICBcIkhvdmVyIEJhY2tncm91bmQgQ29sb3JcIixcbiAgXCJDb2xvciBvZiBmb3JtIGVsZW1lbnQgYmFja2dyb3VuZHMgd2hlbiBob3ZlcmluZ1wiLFxuICBHUkVZW1wiNDAwXCJdLFxuICBHUkVZW1wiNzAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfYmFja2dyb3VuZC5tYWtlX3ZhcmlhYmxlKFxuICBcInVuc2VsZWN0ZWRcIixcbiAgXCJVbnNlbGVjdGVkIEJhY2tncm91bmQgQ29sb3JcIixcbiAgXCJDb2xvciBvZiB1bnNlbGVjdGVkIGZvcm0gZWxlbWVudCBiYWNrZ3JvdW5kc1wiLFxuICBHUkVZW1wiMzAwXCJdLFxuICBHUkVZW1wiODAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5cbi8vICAgICAgX19fXyAgIF9fX18gIF9fX19fICBfX19fXyAgX19fX19fIF9fX19fICAgICBfX19fXyBfX19fICBfICAgICAgX19fXyAgX19fX18gICBfX19fX1xuLy8gICAgIHwgIF8gXFwgLyBfXyBcXHwgIF9fIFxcfCAgX18gXFx8ICBfX19ffCAgX18gXFwgICAvIF9fX18vIF9fIFxcfCB8ICAgIC8gX18gXFx8ICBfXyBcXCAvIF9fX198XG4vLyAgICAgfCB8XykgfCB8ICB8IHwgfF9fKSB8IHwgIHwgfCB8X18gIHwgfF9fKSB8IHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCB8X18pIHwgKF9fX1xuLy8gICAgIHwgIF8gPHwgfCAgfCB8ICBfICAvfCB8ICB8IHwgIF9ffCB8ICBfICAvICB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgIF8gIC8gXFxfX18gXFxcbi8vICAgICB8IHxfKSB8IHxfX3wgfCB8IFxcIFxcfCB8X198IHwgfF9fX198IHwgXFwgXFwgIHwgfF9fX3wgfF9ffCB8IHxfX198IHxfX3wgfCB8IFxcIFxcIF9fX18pIHxcbi8vICAgICB8X19fXy8gXFxfX19fL3xffCAgXFxfXFxfX19fXy98X19fX19ffF98ICBcXF9cXCAgXFxfX19fX1xcX19fXy98X19fX19fXFxfX19fL3xffCAgXFxfXFxfX19fXy9cbmNvbnN0IGNvbG9yc19ib3JkZXIgPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwiYm9yZGVyXCIsXG4gIFwiQm9yZGVyIENvbG9yc1wiLFxuICBcIkJvcmRlciBjb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcbmNvbG9yc19ib3JkZXIubWFrZV92YXJpYWJsZShcbiAgXCJub3JtYWxcIixcbiAgXCJOb3JtYWwgQm9yZGVyIENvbG9yXCIsXG4gIFwiQ29sb3Igb2Ygbm9ybWFsIGZvcm0gZWxlbWVudCBib3JkZXJzXCIsXG4gIEdSRVlbXCI3MDBcIl0sXG4gIEdSRVlbXCIzMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc19ib3JkZXIubWFrZV92YXJpYWJsZShcbiAgXCJ1bnNlbGVjdGVkXCIsXG4gIFwiVW5zZWxlY3RlZCBCb3JkZXIgQ29sb3JcIixcbiAgXCJDb2xvciBvZiB1bnNlbGVjdGVkIGZvcm0gZWxlbWVudCBib3JkZXJzXCIsXG4gIEdSRVlbXCI3MDBcIl0sXG4gIEdSRVlbXCIzMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8gICAgICBfX19fX18gX19fXyAgIF9fX19fIF8gICAgXyAgX19fX19cbi8vICAgICB8ICBfX19fLyBfXyBcXCAvIF9fX198IHwgIHwgfC8gX19fX3xcbi8vICAgICB8IHxfXyB8IHwgIHwgfCB8ICAgIHwgfCAgfCB8IChfX19cbi8vICAgICB8ICBfX3x8IHwgIHwgfCB8ICAgIHwgfCAgfCB8XFxfX18gXFxcbi8vICAgICB8IHwgICB8IHxfX3wgfCB8X19fX3wgfF9ffCB8X19fXykgfFxuLy8gICAgIHxffCAgICBcXF9fX18vIFxcX19fX198XFxfX19fL3xfX19fXy9cbmNvbnN0IGNvbG9yc19mb2N1cyA9IGNvbG9ycy5tYWtlX3N1Yl9ncm91cChcbiAgXCJmb2N1c1wiLFxuICBcIkZvY3VzIENvbG9yc1wiLFxuICBcIkZvY3VzIGNvbG9ycyB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4pO1xuY29sb3JzX2ZvY3VzLm1ha2VfdmFyaWFibGUoXG4gIFwibm9ybWFsXCIsXG4gIFwiRm9jdXMgQ29sb3JcIixcbiAgXCJDb2xvciBvZiBmb2N1c3NlZCBmb3JtIGVsZW1lbnRcIixcbiAgT1JBTkdFW1wiNjAwXCJdLFxuICBPUkFOR0VbXCIzMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8gICAgICBfX19fICAgICAgICAgICBfX19fXyBfX19fXyBfX19fXyAgICBfX19fXyBfX19fICBfICAgICAgX19fXyAgX19fX18gICBfX19fX1xuLy8gICAgIHwgIF8gXFwgICAvXFwgICAgLyBfX19ffF8gICBfLyBfX19ffCAgLyBfX19fLyBfXyBcXHwgfCAgICAvIF9fIFxcfCAgX18gXFwgLyBfX19ffFxuLy8gICAgIHwgfF8pIHwgLyAgXFwgIHwgKF9fXyAgIHwgfHwgfCAgICAgIHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCB8X18pIHwgKF9fX1xuLy8gICAgIHwgIF8gPCAvIC9cXCBcXCAgXFxfX18gXFwgIHwgfHwgfCAgICAgIHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCAgXyAgLyBcXF9fXyBcXFxuLy8gICAgIHwgfF8pIC8gX19fXyBcXCBfX19fKSB8X3wgfHwgfF9fX18gIHwgfF9fX3wgfF9ffCB8IHxfX198IHxfX3wgfCB8IFxcIFxcIF9fX18pIHxcbi8vICAgICB8X19fXy9fLyAgICBcXF9cXF9fX19fL3xfX19fX1xcX19fX198ICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzX2Jhc2ljID0gY29sb3JzLm1ha2Vfc3ViX2dyb3VwKFxuICBcImJhc2ljXCIsXG4gIFwiQmFzaWMgQ29sb3JzXCIsXG4gIFwiQmFzaWMgY29sb3JzIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5jb2xvcnNfYmFzaWMubWFrZV92YXJpYWJsZShcbiAgXCJncmVlblwiLFxuICBcIkJhc2ljIEdyZWVuIENvbG9yXCIsXG4gIFwiQ29tbW9ubHkgdXNlZCBncmVlbiBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRUVOW1wiMzAwXCJdLFxuICBHUkVFTltcIjkwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX2Jhc2ljLm1ha2VfdmFyaWFibGUoXG4gIFwicmVkXCIsXG4gIFwiQmFzaWMgUmVkIENvbG9yXCIsXG4gIFwiQ29tbW9ubHkgdXNlZCByZWQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBSRURbXCIzMDBcIl0sXG4gIFJFRFtcIjkwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX2Jhc2ljLm1ha2VfdmFyaWFibGUoXG4gIFwiYmx1ZVwiLFxuICBcIkJhc2ljIEJsdWUgQ29sb3JcIixcbiAgXCJDb21tb25seSB1c2VkIGJsdWUgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBCTFVFW1wiMzAwXCJdLFxuICBCTFVFW1wiOTAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfYmFzaWMubWFrZV92YXJpYWJsZShcbiAgXCJ5ZWxsb3dcIixcbiAgXCJCYXNpYyBZZWxsb3cgQ29sb3JcIixcbiAgXCJDb21tb25seSB1c2VkIHllbGxvdyBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIFlFTExPV1tcIjMwMFwiXSxcbiAgT1JBTkdFW1wiOTAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5cbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjM1xuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMzXG4vLyAgICAgICBfX19fXyBfX19fXyBfX19fX19fX19fX18gIF9fX19fXG4vLyAgICAgIC8gX19fX3xfICAgX3xfX18gIC8gIF9fX198LyBfX19ffFxuLy8gICAgIHwgKF9fXyAgIHwgfCAgICAvIC98IHxfXyAgfCAoX19fXG4vLyAgICAgIFxcX19fIFxcICB8IHwgICAvIC8gfCAgX198ICBcXF9fXyBcXFxuLy8gICAgICBfX19fKSB8X3wgfF8gLyAvX198IHxfX19fIF9fX18pIHxcbi8vICAgICB8X19fX18vfF9fX19fL19fX19ffF9fX19fX3xfX19fXy9cbmNvbnN0IHNpemVzID0gdGhlbWVfcm9vdC5tYWtlX3N1Yl9ncm91cChcbiAgXCJzaXplXCIsXG4gIFwiU2l6ZVwiLFxuICBcIlNpemVzIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5cbnNpemVzLm1ha2VfdmFyaWFibGUoXG4gIFwiaGVpZ2h0XCIsXG4gIFwiSGVpZ2h0XCIsXG4gIFwiRGVmYXVsdCBoZWlnaHQgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuICBcIjEuNnJlbVwiLFxuICBcIjEuNnJlbVwiLFxuICBcIkxlbmd0aFwiLFxuICB7IG1pbjogMC4xLCBtYXg6IDEwIH0sXG4pO1xuXG5zaXplcy5tYWtlX3ZhcmlhYmxlKFxuICBcInRvdWNoSGVpZ2h0XCIsXG4gIFwiVG91Y2ggSGVpZ2h0XCIsXG4gIFwiTWluaW11bSBoZWlnaHQgZm9yIHRvdWNoIGRldmljZXMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuICBcIjIuNnJlbVwiLFxuICBcIjIuNnJlbVwiLFxuICBcIkxlbmd0aFwiLFxuICB7IG1pbjogMC4xLCBtYXg6IDEwIH0sXG4pO1xuXG4vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIzNcbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjM1xuLy8gICAgICBfX19fX18gX19fXyAgXyAgIF8gX19fX19fX1xuLy8gICAgIHwgIF9fX18vIF9fIFxcfCBcXCB8IHxfXyAgIF9ffFxuLy8gICAgIHwgfF9fIHwgfCAgfCB8ICBcXHwgfCAgfCB8XG4vLyAgICAgfCAgX198fCB8ICB8IHwgLiBgIHwgIHwgfFxuLy8gICAgIHwgfCAgIHwgfF9ffCB8IHxcXCAgfCAgfCB8XG4vLyAgICAgfF98ICAgIFxcX19fXy98X3wgXFxffCAgfF98XG5jb25zdCBmb250ID0gdGhlbWVfcm9vdC5tYWtlX3N1Yl9ncm91cChcbiAgXCJmb250XCIsXG4gIFwiRm9udFwiLFxuICBcIkZvbnQgc2V0dGluZ3MgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcblxuZm9udC5tYWtlX3ZhcmlhYmxlKFxuICBcInNpemVcIixcbiAgXCJGb250IFNpemVcIixcbiAgXCJEZWZhdWx0IGZvbnQgc2l6ZSB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4gIFwiMXJlbVwiLFxuICBcIjFyZW1cIixcbiAgXCJMZW5ndGhcIixcbiAgeyBtaW46IDAuMSwgbWF4OiAxMCB9LFxuKTtcblxuZm9udC5tYWtlX3ZhcmlhYmxlKFxuICBcInRvdWNoX3NpemVcIixcbiAgXCJUb3VjaCBGb250IFNpemVcIixcbiAgXCJGb250IHNpemUgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50cyBmb3IgdG91Y2ggZGV2aWNlc1wiLFxuICBcIjEuMXJlbVwiLFxuICBcIjEuMXJlbVwiLFxuICBcIkxlbmd0aFwiLFxuICB7IG1pbjogMC4xLCBtYXg6IDEwIH0sXG4pO1xuIiwiaW1wb3J0IHsgQmFzZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IHN5bmNfcmVzb2x2ZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHsgZXJyLCBvaywgdHlwZSBPcHRpb24sIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgdHlwZSB7IFN0YXRlLCBTdGF0ZVN1YiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN0YXRlXCI7XG5pbXBvcnQgXCIuL3NoYXJlZFwiO1xuXG4vKipDb2xvcnMgZm9yIGZvcm0gZWxlbWVudHMgdGhhdCBoYXZlIHNlbGVjdGFibGUgY29sb3JzKi9cbmV4cG9ydCBjb25zdCBGb3JtQ29sb3JzID0ge1xuICBOb25lOiBcIm5vbmVcIixcbiAgQmxhY2s6IFwiYmxhY2tcIixcbiAgR3JlZW46IFwiZ3JlZW5cIixcbiAgUmVkOiBcInJlZFwiLFxuICBCbHVlOiBcImJsdWVcIixcbiAgWWVsbG93OiBcInllbGxvd1wiLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEZvcm1Db2xvcnMgPSAodHlwZW9mIEZvcm1Db2xvcnMpW2tleW9mIHR5cGVvZiBGb3JtQ29sb3JzXTtcblxuLyoqU2hhcmVkIGNvbXBvbmVudCBjbGFzcyBmb3Igb3RoZXIgY29tcG9uZW50cyB0byBpbmhlcml0IGZyb20qL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZvcm1FbGVtZW50IGV4dGVuZHMgQmFzZSB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiQGFic3RyYWN0QFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cbn1cblxuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuLy8gICAgIF9fICAgICAgX18gICAgIF8gICAgIF8gICAgXyBfX19fX18gICBfX19fXyAgX19fX19fICAgICAgICAgIF9fX19fXG4vLyAgICAgXFwgXFwgICAgLyAvXFwgICB8IHwgICB8IHwgIHwgfCAgX19fX3wgfCAgX18gXFx8ICBfX19ffCAgIC9cXCAgIHwgIF9fIFxcXG4vLyAgICAgIFxcIFxcICAvIC8gIFxcICB8IHwgICB8IHwgIHwgfCB8X18gICAgfCB8X18pIHwgfF9fICAgICAvICBcXCAgfCB8ICB8IHxcbi8vICAgICAgIFxcIFxcLyAvIC9cXCBcXCB8IHwgICB8IHwgIHwgfCAgX198ICAgfCAgXyAgL3wgIF9ffCAgIC8gL1xcIFxcIHwgfCAgfCB8XG4vLyAgICAgICAgXFwgIC8gX19fXyBcXHwgfF9fX3wgfF9ffCB8IHxfX19fICB8IHwgXFwgXFx8IHxfX19fIC8gX19fXyBcXHwgfF9ffCB8XG4vLyAgICAgICAgIFxcL18vICAgIFxcX1xcX19fX19fXFxfX19fL3xfX19fX198IHxffCAgXFxfXFxfX19fX18vXy8gICAgXFxfXFxfX19fXy9cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtVmFsdWVPcHRpb25zPFJULCBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAvKipJRCBmb3JtIGZvcm0gZWxlbWVudCAqL1xuICBpZD86IElEO1xuICAvKipWYWx1ZSBmb3IgZm9ybSBlbGVtZW50ICovXG4gIHZhbHVlPzogUlQ7XG4gIHZhbHVlX2J5X3N0YXRlPzogU3RhdGU8UlQsIE9wdGlvbjx7fT4sIFJUPjtcbiAgLyoqTG9uZ2VyIGRlc2NyaXB0aW9uIHdoYXQgZm9ybSBlbGVtZW50IGRvZXMgKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKkNoYW5nZSBsaXN0ZW5lciBmdW5jdGlvbiovXG4gIGNoYW5nZT86ICh2YWw6IFJUKSA9PiB2b2lkO1xufVxuXG4vKipTaGFyZWQgY2xhc3MgZm9yIGFsbCBjb21wb25lbnRzIHdpdGggdmFsdWVzKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGb3JtVmFsdWU8XG4gIFJULFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtRWxlbWVudCB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiQGFic3RyYWN0QFwiO1xuICB9XG5cbiAgc3RhdGljIGFwcGx5X29wdGlvbnM8UlQsIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgICBlbGVtZW50OiBGb3JtVmFsdWU8UlQsIElEPixcbiAgICBvcHRpb25zOiBGb3JtVmFsdWVPcHRpb25zPFJULCBJRD4sXG4gICkge1xuICAgIGlmIChvcHRpb25zLmRlc2NyaXB0aW9uKSBlbGVtZW50LmRlc2NyaXB0aW9uID0gb3B0aW9ucy5kZXNjcmlwdGlvbjtcbiAgICBpZiAob3B0aW9ucy52YWx1ZV9ieV9zdGF0ZSkgZWxlbWVudC52YWx1ZV9ieV9zdGF0ZSA9IG9wdGlvbnMudmFsdWVfYnlfc3RhdGU7XG4gICAgZWxzZSBpZiAob3B0aW9ucy52YWx1ZSAhPT0gdW5kZWZpbmVkKSBlbGVtZW50LnZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgfVxuXG4gIHJlYWRvbmx5IGZvcm1faWQ6IElEO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZm9ybV9pZCA9IGlkIGFzIElEO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9kZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqU2V0cyB0aGUgY3VycmVudCBsYWJlbCBvZiB0aGUgZWxlbWVudCovXG4gIHNldCBkZXNjcmlwdGlvbih0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IHRleHQ7XG4gIH1cbiAgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc2NyaXB0aW9uIHx8IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2J1ZmZlcj86IFJUO1xuICBnZXQgYnVmZmVyKCk6IFJUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYnVmZmVyO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9zdGF0ZT86IFN0YXRlPFJULCBPcHRpb248e30+LCBSVD47XG4gICNmdW5jPzogU3RhdGVTdWI8UmVzdWx0PFJULCBzdHJpbmc+PjtcbiAgLyoqVGhpcyBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50Ki9cbiAgc2V0IHZhbHVlX2J5X3N0YXRlKHN0YXRlOiBTdGF0ZTxSVCwgT3B0aW9uPHt9PiwgUlQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRoaXMuI2Z1bmMpIHRoaXMuZGV0YWNoX3N0YXRlKHRoaXMuI2Z1bmMpO1xuICAgIGlmIChzdGF0ZSkge1xuICAgICAgdGhpcy5hdHRhY2hfc3RhdGUoc3RhdGUsICh2YWwpID0+IHtcbiAgICAgICAgaWYgKHZhbC5vaykge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWwudmFsdWU7XG4gICAgICAgICAgaWYgKHRoaXMuI2Vycm9yKSB0aGlzLmVycm9yID0gdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2UgdGhpcy5lcnJvciA9IHZhbC5lcnJvcjtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVsYXRlZCA9IHN0YXRlLnJlbGF0ZWQoKTtcbiAgICAgIGlmIChyZWxhdGVkLnNvbWUpIHRoaXMuc3RhdGVfcmVsYXRlZChyZWxhdGVkLnZhbHVlKTtcbiAgICB9IGVsc2UgdGhpcy5zdGF0ZV9yZWxhdGVkKHt9KTtcbiAgICB0aGlzLl9zdGF0ZSA9IHN0YXRlO1xuICB9XG5cbiAgLyoqVGhpcyBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50Ki9cbiAgc2V0IHZhbHVlKHZhbDogUlQpIHtcbiAgICB0aGlzLl9idWZmZXIgPSB2YWw7XG4gICAgdGhpcy5uZXdfdmFsdWUodmFsKTtcbiAgfVxuXG4gIC8qKlJldHVybnMgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCovXG4gIGdldCB2YWx1ZSgpOiBSZXN1bHQ8UlQsIHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZVxuICAgICAgPyBlcnIoXCJTdGF0ZSBiYXNlZCBjb21wb25lbnRcIilcbiAgICAgIDogdHlwZW9mIHRoaXMuX2J1ZmZlciA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICA/IGVycihcIk5vIHZhbHVlIHlldFwiKVxuICAgICAgICA6IG9rKHRoaXMuX2J1ZmZlcik7XG4gIH1cblxuICAjZXJyb3IgPSBmYWxzZTtcbiAgc2V0IGVycm9yKGVycjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgdGhpcy5uZXdfZXJyb3IoZXJyKTtcbiAgICAgIHRoaXMuI2Vycm9yID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuI2Vycm9yKSB7XG4gICAgICB0aGlzLmNsZWFyX2Vycm9yKCk7XG4gICAgICB0aGlzLiNlcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKkNsZWFycyB0aGUgdmFsdWUgYW5kIGVycm9yIG9mIHRoZSBjb21wb25lbnQgaWYgbm90IHN0YXRlIGJhc2VkKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3N0YXRlKSByZXR1cm47XG4gICAgdGhpcy5fYnVmZmVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2xlYXJfdmFsdWUoKTtcbiAgICB0aGlzLmNsZWFyX2Vycm9yKCk7XG4gIH1cblxuICAvKipDYWxsZWQgd2hlbiB2YWx1ZSBpcyBzZXQgYnkgdmFsdWUgc2V0dGVyIG9yIHN0YXRlKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IG5ld192YWx1ZSh2YWw6IFJUKTogdm9pZDtcblxuICAvKipDbGVhcnMgZm9ybSBlbGVtZW50IGdyYXBoaWNhbGx5Ki9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNsZWFyX3ZhbHVlKCk6IHZvaWQ7XG5cbiAgLyoqQ2FsbGVkIHdoZW4gZXJyb3IgaXMgc2V0IGJ5IGVycm9yIG9yIHN0YXRlKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IG5ld19lcnJvcih2YWw6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqQ2FsbGVkIHdoZW4gZXJyb3IgaXMgY2xlYXJlZCBieSBlcnJvciBvciBzdGF0ZSovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjbGVhcl9lcnJvcigpOiB2b2lkO1xuXG4gIC8qKkNhbGxlZCB3aGVuIHN0YXRlIGhhcyByZWxhdGVkIGluZm9ybWF0aW9uICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzdGF0ZV9yZWxhdGVkKHJlbGF0ZWQ6IHt9KTogdm9pZDtcbn1cblxuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuLy8gICAgIF9fICAgICAgX18gICAgIF8gICAgIF8gICAgXyBfX19fX18gIF9fICAgICAgICAgIF9fX19fX18gIF9fX19fIF9fX19fX18gX19fX19fXG4vLyAgICAgXFwgXFwgICAgLyAvXFwgICB8IHwgICB8IHwgIHwgfCAgX19fX3wgXFwgXFwgICAgICAgIC8gLyAgX18gXFx8XyAgIF98X18gICBfX3wgIF9fX198XG4vLyAgICAgIFxcIFxcICAvIC8gIFxcICB8IHwgICB8IHwgIHwgfCB8X18gICAgIFxcIFxcICAvXFwgIC8gL3wgfF9fKSB8IHwgfCAgICB8IHwgIHwgfF9fXG4vLyAgICAgICBcXCBcXC8gLyAvXFwgXFwgfCB8ICAgfCB8ICB8IHwgIF9ffCAgICAgXFwgXFwvICBcXC8gLyB8ICBfICAvICB8IHwgICAgfCB8ICB8ICBfX3xcbi8vICAgICAgICBcXCAgLyBfX19fIFxcfCB8X19ffCB8X198IHwgfF9fX18gICAgIFxcICAvXFwgIC8gIHwgfCBcXCBcXCBffCB8XyAgIHwgfCAgfCB8X19fX1xuLy8gICAgICAgICBcXC9fLyAgICBcXF9cXF9fX19fX1xcX19fXy98X19fX19ffCAgICAgXFwvICBcXC8gICB8X3wgIFxcX1xcX19fX198ICB8X3wgIHxfX19fX198XG4vKipTaGFyZWQgY2xhc3MgZm9yIGFsbCBjb21wb25lbnRzIHdpdGggdmFsdWVzKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGb3JtVmFsdWVXcml0ZTxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZTxSVCwgSUQ+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJAYWJzdHJhY3RAXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2Fybl9pbnB1dDogSFRNTElucHV0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgI3dhcm5fdGltZW91dD86IG51bWJlcjtcbiAgI2NoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgI2NoYW5nZT86ICh2YWw6IFJUKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy53YXJuX2lucHV0Lm5hbWUgPSBcInZhbFwiO1xuICB9XG5cbiAgc2V0IGNoYW5nZShmdW5jOiAodmFsOiBSVCkgPT4gdm9pZCkge1xuICAgIHRoaXMuI2NoYW5nZSA9IGZ1bmM7XG4gIH1cbiAgZ2V0IGNoYW5nZSgpOiAoKHZhbDogUlQpID0+IHZvaWQpIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jY2hhbmdlO1xuICB9XG5cbiAgLyoqUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCBpZiBpdCBoYXMgY2hhbmdlZCovXG4gIGdldCBjaGFuZ2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNjaGFuZ2VkO1xuICB9XG5cbiAgd2FybihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLndhcm5faW5wdXQuc2V0Q3VzdG9tVmFsaWRpdHkobWVzc2FnZSk7XG4gICAgdGhpcy53YXJuX2lucHV0LnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgaWYgKHRoaXMuI3dhcm5fdGltZW91dCkgY2xlYXJUaW1lb3V0KHRoaXMuI3dhcm5fdGltZW91dCk7XG4gICAgdGhpcy4jd2Fybl90aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLndhcm5faW5wdXQuc2V0Q3VzdG9tVmFsaWRpdHkoXCJcIik7XG4gICAgICB0aGlzLndhcm5faW5wdXQucmVwb3J0VmFsaWRpdHkoKTtcbiAgICB9LCA1MDAwKTtcbiAgfVxuXG4gIC8qKkZ1bmN0aW9uIHRvIGxpbWl0IHZhbHVlIGVudGVyZWQgKi9cbiAgcHJvdGVjdGVkIGxpbWl0X3ZhbHVlKHZhbDogUlQpOiBQcm9taXNlTGlrZTxSZXN1bHQ8UlQsIHN0cmluZz4+IHtcbiAgICBpZiAodGhpcy5fc3RhdGUpIHtcbiAgICAgIGlmICh0aGlzLl9zdGF0ZS53cml0YWJsZSkgcmV0dXJuIHRoaXMuX3N0YXRlLmxpbWl0KHZhbCk7XG4gICAgICBlbHNlIHJldHVybiBzeW5jX3Jlc29sdmUoZXJyKFwiTm90IHdyaXRhYmxlXCIpKTtcbiAgICB9IGVsc2UgcmV0dXJuIHN5bmNfcmVzb2x2ZShvayh2YWwpKTtcbiAgfVxuXG4gIC8qKkZ1bmN0aW9uIHRvIGNoZWNrIHZhbHVlICovXG4gIHByb3RlY3RlZCBjaGVja192YWx1ZSh2YWw6IFJUKTogUHJvbWlzZUxpa2U8UmVzdWx0PFJULCBzdHJpbmc+PiB7XG4gICAgaWYgKHRoaXMuX3N0YXRlKSB7XG4gICAgICBpZiAodGhpcy5fc3RhdGUud3JpdGFibGUpIHJldHVybiB0aGlzLl9zdGF0ZS5jaGVjayh2YWwpO1xuICAgICAgZWxzZSByZXR1cm4gc3luY19yZXNvbHZlKGVycihcIk5vdCB3cml0YWJsZVwiKSk7XG4gICAgfSBlbHNlIHJldHVybiBzeW5jX3Jlc29sdmUob2sodmFsKSk7XG4gIH1cblxuICAvKipGdW5jdGlvbiB0byB1cGRhdGUgdmFsdWUqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2V0X3ZhbHVlX2xpbWl0KHZhbDogUlQpOiBQcm9taXNlPFJlc3VsdDxSVCwgc3RyaW5nPj4ge1xuICAgIGNvbnN0IGxpbWl0ZWQgPSBhd2FpdCB0aGlzLmxpbWl0X3ZhbHVlKHZhbCk7XG4gICAgaWYgKGxpbWl0ZWQuZXJyKSB7XG4gICAgICB0aGlzLndhcm4obGltaXRlZC5lcnJvcik7XG4gICAgICByZXR1cm4gbGltaXRlZDtcbiAgICB9XG4gICAgdGhpcy4jc2V0X3ZhbHVlKGxpbWl0ZWQudmFsdWUpO1xuICAgIHJldHVybiBsaW1pdGVkO1xuICB9XG5cbiAgLyoqRnVuY3Rpb24gdG8gdXBkYXRlIHZhbHVlKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNldF92YWx1ZV9jaGVjayh2YWw6IFJUKTogUHJvbWlzZTxSZXN1bHQ8UlQsIHN0cmluZz4+IHtcbiAgICBjb25zdCBjaGVja2VkID0gYXdhaXQgdGhpcy5jaGVja192YWx1ZSh2YWwpO1xuICAgIGlmIChjaGVja2VkLmVycikge1xuICAgICAgdGhpcy53YXJuKGNoZWNrZWQuZXJyb3IpO1xuICAgICAgcmV0dXJuIGNoZWNrZWQ7XG4gICAgfVxuICAgIHRoaXMuI3NldF92YWx1ZShjaGVja2VkLnZhbHVlKTtcbiAgICByZXR1cm4gY2hlY2tlZDtcbiAgfVxuXG4gICNzZXRfdmFsdWUodmFsOiBSVCkge1xuICAgIGlmICh0aGlzLl9idWZmZXIgPT09IHZhbCkgdGhpcy5uZXdfdmFsdWUodmFsKTtcbiAgICBpZiAodGhpcy4jY2hhbmdlKVxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy4jY2hhbmdlKHZhbCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgd2hpbGUgdXBkYXRpbmcgY2hhbmdlIGxpc3RlbmVyXCIsIGUpO1xuICAgICAgfVxuICAgIGlmICh0aGlzLl9zdGF0ZSkge1xuICAgICAgY29uc3QgYnVmZiA9IHRoaXMuX2J1ZmZlcjtcbiAgICAgIHRoaXMuX3N0YXRlLndyaXRlISh2YWwpLnRoZW4oKGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyLmVycikge1xuICAgICAgICAgIGlmIChidWZmICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKGJ1ZmYpO1xuICAgICAgICAgIHRoaXMud2FybihlcnIuZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uZXdfdmFsdWUodmFsKTtcbiAgICAgIHRoaXMuX2J1ZmZlciA9IHZhbDtcbiAgICAgIHRoaXMuI2NoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHR5cGUgeyBTVkdGdW5jIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3ZnXCI7XG5pbXBvcnQge1xuICBGb3JtQ29sb3JzLFxuICBGb3JtVmFsdWUsXG4gIEZvcm1WYWx1ZVdyaXRlLFxuICB0eXBlIEZvcm1WYWx1ZU9wdGlvbnMsXG59IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuLi8uLi9zaGFyZWRcIjtcbmltcG9ydCBcIi4vYnV0dG9uLnNjc3NcIjtcblxuaW50ZXJmYWNlIEZvcm1CdXR0b25PcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPGJvb2xlYW4sIElEPiB7XG4gIC8qKkJ1dHRvbnMgdGV4dCAqL1xuICB0ZXh0Pzogc3RyaW5nO1xuICAvKipJY29uIGZvciBidXR0b24gKi9cbiAgaWNvbj86IFNWR0Z1bmM7XG4gIC8qKkZ1bmN0aW9uIHRvIGNhbGwgb24gYnV0dG9uIGNsaWNrICovXG4gIG9uX2NsaWNrPzogKCkgPT4gdm9pZDtcbiAgLyoqU2V0IHRydWUgdG8gbWFrZSBidXR0b24gdG9nZ2xlIG9uIGNsaWNrIGluc3RlYWQgb2Ygbm9ybWFsICovXG4gIHRvZ2dsZT86IGJvb2xlYW47XG4gIC8qKkNoYW5nZXMgdGhlIGJ1dHRvbnMgY29sb3IgKi9cbiAgY29sb3I/OiBGb3JtQ29sb3JzO1xufVxuXG5jbGFzcyBGb3JtQnV0dG9uPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFxuICBib29sZWFuLFxuICBJRFxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiYnV0dG9uXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICN0ZXh0OiBIVE1MU3BhbkVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI29uX2NsaWNrPzogKCkgPT4gdm9pZDtcbiAgI3RvZ2dsZT86IGJvb2xlYW47XG4gICNpY29uPzogU1ZHU1ZHRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuXG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgIHRoaXMub25jbGljayA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLiNvbl9jbGljaykgdGhpcy4jb25fY2xpY2soKTtcbiAgICB9O1xuICAgIHRoaXMub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5wb2ludGVyVHlwZSAhPT0gXCJ0b3VjaFwiICYmIGUuYnV0dG9uID09PSAwKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICBpZiAoIXRoaXMuI3RvZ2dsZSkgdGhpcy5zZXRfdmFsdWVfY2hlY2sodHJ1ZSk7XG4gICAgICAgIHRoaXMub25wb2ludGVydXAgPSAoZXYpID0+IHtcbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB0aGlzLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShldi5wb2ludGVySWQpO1xuICAgICAgICAgIGlmICh0aGlzLiN0b2dnbGUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKCF0aGlzLmJ1ZmZlcik7XG4gICAgICAgICAgZWxzZSB0aGlzLnNldF92YWx1ZV9jaGVjayhmYWxzZSk7XG4gICAgICAgICAgdGhpcy5vbnBvaW50ZXJ1cCA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLm9udG91Y2hzdGFydCA9IChlKSA9PiB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaWYgKCF0aGlzLiN0b2dnbGUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRydWUpO1xuICAgICAgdGhpcy5vbnRvdWNoZW5kID0gKGV2KSA9PiB7XG4gICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAoZXYudGFyZ2V0VG91Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBpZiAodGhpcy4jdG9nZ2xlKSB0aGlzLnNldF92YWx1ZV9jaGVjayghdGhpcy5idWZmZXIpO1xuICAgICAgICAgIGVsc2UgdGhpcy5zZXRfdmFsdWVfY2hlY2soZmFsc2UpO1xuICAgICAgICAgIHRoaXMub250b3VjaGVuZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgICB0aGlzLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgIGNhc2UgXCIgXCI6XG4gICAgICAgIGNhc2UgXCJFbnRlclwiOiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgaWYgKCF0aGlzLiN0b2dnbGUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRydWUpO1xuICAgICAgICAgIHRoaXMub25rZXl1cCA9IChlKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgICAgICBjYXNlIFwiIFwiOiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI3RvZ2dsZSkgdGhpcy5zZXRfdmFsdWVfY2hlY2soIXRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jb25fY2xpY2spIHRoaXMuI29uX2NsaWNrKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25rZXl1cCA9IG51bGw7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipTZXRzIHRoZSBjdXJyZW50IHRleHQgb2YgdGhlIGJ1dHRvbiovXG4gIHNldCB0ZXh0KGxhYmVsOiBzdHJpbmcpIHtcbiAgICB0aGlzLiN0ZXh0LnRleHRDb250ZW50ID0gbGFiZWw7XG4gIH1cbiAgZ2V0IHRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RleHQudGV4dENvbnRlbnQ7XG4gIH1cblxuICAvKipDaGFuZ2VzIHRoZSBpY29uIG9mIHRoZSBidXR0b24qL1xuICBzZXQgaWNvbihpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGljb24pIHRoaXMuI2ljb24gPSB0aGlzLmluc2VydEJlZm9yZShpY29uKCksIHRoaXMuI3RleHQpO1xuICAgIGVsc2UgaWYgKHRoaXMuI2ljb24pIHtcbiAgICAgIHRoaXMucmVtb3ZlQ2hpbGQodGhpcy4jaWNvbik7XG4gICAgICB0aGlzLiNpY29uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKkZ1bmN0aW9uIHRvIGNhbGwgb24gYnV0dG9uIGNsaWNrKi9cbiAgc2V0IG9uX2NsaWNrKGZ1bmM6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI29uX2NsaWNrID0gZnVuYztcbiAgfVxuICBnZXQgb25fY2xpY2soKSB7XG4gICAgcmV0dXJuIHRoaXMuI29uX2NsaWNrO1xuICB9XG5cbiAgLyoqQ2hhbmdlcyB0aGUgY29sb3Igb2YgdGhlIGJ1dHRvbiovXG4gIHNldCBjb2xvcihjb2xvcjogRm9ybUNvbG9ycykge1xuICAgIGlmIChjb2xvciA9PT0gRm9ybUNvbG9ycy5Ob25lKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZShcImNvbG9yXCIpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGUoXCJjb2xvclwiLCBjb2xvcik7XG4gIH1cblxuICAvKipDYWxsZWQgd2hlbiB2YWx1ZSBpcyBjaGFuZ2VkICovXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUpIHRoaXMuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICBlbHNlIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLm5ld192YWx1ZShmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKGVycjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5lcnJvcihcIlRPRE9cIiwgZXJyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG5cbiAgLyoqQ2hhbmdlcyB3aGV0aGVyIHRoZSBidXR0b24gaXMgbWFpbnRhaW5lZCBvciBtb21lbnRhcnkqL1xuICBzZXQgdG9nZ2xlKHRvZ2dsZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3RvZ2dsZSA9IEJvb2xlYW4odG9nZ2xlKTtcbiAgfVxuICBnZXQgdG9nZ2xlKCkge1xuICAgIHJldHVybiB0aGlzLiN0b2dnbGU7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1CdXR0b24pO1xuXG4vKipDcmVhdGVzIGEgYnV0dG9uIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fYnV0dG9uPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1CdXR0b25PcHRpb25zPElEPixcbik6IEZvcm1CdXR0b248SUQ+IHtcbiAgY29uc3QgYnV0dCA9IG5ldyBGb3JtQnV0dG9uPElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMudGV4dCkgYnV0dC50ZXh0ID0gb3B0aW9ucy50ZXh0O1xuICAgIGlmIChvcHRpb25zLmljb24pIGJ1dHQuaWNvbiA9IG9wdGlvbnMuaWNvbjtcbiAgICBpZiAob3B0aW9ucy5vbl9jbGljaykgYnV0dC5vbl9jbGljayA9IG9wdGlvbnMub25fY2xpY2s7XG4gICAgaWYgKG9wdGlvbnMudG9nZ2xlKSBidXR0LnRvZ2dsZSA9IG9wdGlvbnMudG9nZ2xlO1xuICAgIGlmIChvcHRpb25zLmNvbG9yKSBidXR0LmNvbG9yID0gb3B0aW9ucy5jb2xvcjtcbiAgICBGb3JtVmFsdWUuYXBwbHlfb3B0aW9ucyhidXR0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gYnV0dDtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb24gfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybVZhbHVlLCB0eXBlIEZvcm1Db2xvcnMsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL2xhbXAuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1MYW1wT3B0aW9uczxcbiAgVCBleHRlbmRzIGJvb2xlYW4gfCBudW1iZXIsXG4gIEMgZXh0ZW5kcyBGb3JtQ29sb3JzW10sXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8VCwgSUQ+IHtcbiAgLyoqU2V0cyB0aGUgbGFtcCBjb2xvcnMgKi9cbiAgY29sb3JzOiBDO1xuICAvKipMYW1wIHRleHQgKi9cbiAgdGV4dD86IHN0cmluZztcbiAgLyoqSWNvbiBmb3IgbGFtcCAqL1xuICBpY29uPzogU1ZHRnVuYztcbn1cblxuZXhwb3J0IGNsYXNzIEZvcm1MYW1wPFxuICBUIGV4dGVuZHMgYm9vbGVhbiB8IG51bWJlcixcbiAgQyBleHRlbmRzIEZvcm1Db2xvcnNbXSxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlPFQsIElEPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwibGFtcFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjdGV4dDogSFRNTFNwYW5FbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNpY29uOiBTVkdTVkdFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAjY29sb3JzOiBGb3JtQ29sb3JzW10gPSBbXTtcblxuICAvKipTZXRzIHRoZSBjdXJyZW50IHRleHQgb2YgdGhlIGxhbXAqL1xuICBzZXQgdGV4dChsYWJlbDogc3RyaW5nKSB7XG4gICAgdGhpcy4jdGV4dC50ZXh0Q29udGVudCA9IGxhYmVsO1xuICB9XG4gIGdldCB0ZXh0KCkge1xuICAgIHJldHVybiB0aGlzLiN0ZXh0LnRleHRDb250ZW50O1xuICB9XG5cbiAgLyoqQ2hhbmdlcyB0aGUgaWNvbiBvZiB0aGUgbGFtcCovXG4gIHNldCBpY29uKGljb246IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoaWNvbikgdGhpcy4jaWNvbiA9IHRoaXMuaW5zZXJ0QmVmb3JlKGljb24oKSwgdGhpcy4jdGV4dCk7XG4gICAgZWxzZSBpZiAodGhpcy4jaWNvbikge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLiNpY29uKTtcbiAgICAgIHRoaXMuI2ljb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGxhbXAqL1xuICBzZXQgY29sb3JzKGNvbG9yczogQykge1xuICAgIHRoaXMuI2NvbG9ycyA9IGNvbG9ycztcbiAgICB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlciEpO1xuICB9XG5cbiAgLyoqQ2FsbGVkIHdoZW4gdmFsdWUgaXMgY2hhbmdlZCAqL1xuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbHVlOiBudW1iZXIgfCBib29sZWFuKSB7XG4gICAgY29uc3QgY29sb3IgPSB0aGlzLiNjb2xvcnNbTnVtYmVyKHZhbHVlKV07XG4gICAgaWYgKGNvbG9yKSB0aGlzLnNldEF0dHJpYnV0ZShcImNvbG9yXCIsIGNvbG9yKTtcbiAgICBlbHNlIHRoaXMucmVtb3ZlQXR0cmlidXRlKFwiY29sb3JcIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoXCJjb2xvclwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoZXJyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKF9yZWxhdGVkOiBPcHRpb248e30+KTogdm9pZCB7fVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybUxhbXApO1xuXG4vKipDcmVhdGVzIGEgYnV0dG9uIGZvcm0gZWxlbWVudCAqL1xuZnVuY3Rpb24gZnJvbTxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtTGFtcE9wdGlvbnM8XG4gICAgbnVtYmVyLFxuICAgIFtGb3JtQ29sb3JzLCBGb3JtQ29sb3JzLCBGb3JtQ29sb3JzLCAuLi5Gb3JtQ29sb3JzW11dLFxuICAgIElEXG4gID4sXG4pOiBGb3JtTGFtcDxudW1iZXIsIFtGb3JtQ29sb3JzLCBGb3JtQ29sb3JzLCBGb3JtQ29sb3JzLCAuLi5Gb3JtQ29sb3JzW11dLCBJRD47XG5mdW5jdGlvbiBmcm9tPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1MYW1wT3B0aW9uczxib29sZWFuLCBbRm9ybUNvbG9ycywgRm9ybUNvbG9yc10sIElEPixcbik6IEZvcm1MYW1wPGJvb2xlYW4sIFtGb3JtQ29sb3JzLCBGb3JtQ29sb3JzXSwgSUQ+O1xuZnVuY3Rpb24gZnJvbTxcbiAgVCBleHRlbmRzIGJvb2xlYW4gfCBudW1iZXIsXG4gIEMgZXh0ZW5kcyBGb3JtQ29sb3JzW10sXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPihvcHRpb25zPzogRm9ybUxhbXBPcHRpb25zPFQsIEMsIElEPik6IEZvcm1MYW1wPFQsIEMsIElEPiB7XG4gIGNvbnN0IGxhbXAgPSBuZXcgRm9ybUxhbXA8VCwgQywgSUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBsYW1wLmNvbG9ycyA9IG9wdGlvbnMuY29sb3JzO1xuICAgIGlmIChvcHRpb25zLnRleHQpIGxhbXAudGV4dCA9IG9wdGlvbnMudGV4dDtcbiAgICBpZiAob3B0aW9ucy5pY29uKSBsYW1wLmljb24gPSBvcHRpb25zLmljb247XG4gICAgRm9ybVZhbHVlLmFwcGx5X29wdGlvbnMobGFtcCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGxhbXA7XG59XG5cbi8qKkNyZWF0ZXMgYSBidXR0b24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgY29uc3QgZm9ybV9sYW1wID0gZnJvbTtcbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb24gfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybUNvbG9ycywgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL3N3aXRjaC5zY3NzXCI7XG5cbmludGVyZmFjZSBGb3JtU3dpdGNoT3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxib29sZWFuLCBJRD4ge1xuICAvKipJY29uIHRvIHVzZSBmb3IgbGVmdCBzaWRlKi9cbiAgaWNvbj86IFNWR0Z1bmM7XG4gIC8qKkNvbG9yIHdoZW4gc3dpdGNoIGlzIG9uICovXG4gIG9uX2NvbG9yPzogRm9ybUNvbG9ycztcbiAgLyoqQ29sb3Igd2hlbiBzd2l0Y2ggaXMgb2ZmICovXG4gIG9mZl9jb2xvcj86IEZvcm1Db2xvcnM7XG59XG5cbmV4cG9ydCBjbGFzcyBGb3JtU3dpdGNoPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFxuICBib29sZWFuLFxuICBJRFxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwic3dpdGNoXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNzd2l0Y2g6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI2ljb246IFNWR1NWR0VsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICNwcmV2ZW50X2NsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcblxuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLiNzd2l0Y2guc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgIHRoaXMuI3N3aXRjaC5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgICBjYXNlIFwiRW50ZXJcIjpcbiAgICAgICAgY2FzZSBcIiBcIjoge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMub25rZXl1cCA9IChlKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgICAgICBjYXNlIFwiIFwiOiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2soIXRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbmtleXVwID0gbnVsbDtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuI3N3aXRjaC5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmJ1dHRvbiA9PT0gMCkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICAgICAgdGhpcy4jc3dpdGNoLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgbGV0IGhhc19tb3ZlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLiNzd2l0Y2gub25wb2ludGVybW92ZSA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGlmIChoYXNfbW92ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJveCA9IHRoaXMuI3N3aXRjaC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IG1pZF9jb3JkID0gYm94LnggKyBib3gud2lkdGggLyAyO1xuICAgICAgICAgICAgaWYgKGV2LmNsaWVudFggPiBtaWRfY29yZCkge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmJ1ZmZlcikgdGhpcy5zZXRfdmFsdWVfY2hlY2soZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBNYXRoLmFicyhlLmNsaWVudFggLSBldi5jbGllbnRYKSA+IDEwIHx8XG4gICAgICAgICAgICBNYXRoLmFicyhlLmNsaWVudFkgLSBldi5jbGllbnRZKSA+IDEwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBoYXNfbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jc3dpdGNoLm9ucG9pbnRlcnVwID0gKGV2KSA9PiB7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgaWYgKCFoYXNfbW92ZWQpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKCF0aGlzLmJ1ZmZlcik7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgICB0aGlzLiNzd2l0Y2gub25wb2ludGVybW92ZSA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuI3N3aXRjaC5vbmNsaWNrID0gKGUpID0+IGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmICh0aGlzLiNwcmV2ZW50X2NsaWNrKSByZXR1cm4gKHRoaXMuI3ByZXZlbnRfY2xpY2sgPSBmYWxzZSk7XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayghdGhpcy5idWZmZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH07XG4gIH1cblxuICAvKipDaGFuZ2VzIHRoZSBpY29uIG9mIHRoZSBzd2l0Y2gqL1xuICBzZXQgaWNvbihpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGljb24pIHRoaXMuI2ljb24gPSB0aGlzLmluc2VydEJlZm9yZShpY29uKCksIHRoaXMuI3N3aXRjaCk7XG4gICAgZWxzZSBpZiAodGhpcy4jaWNvbikge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLiNpY29uKTtcbiAgICAgIHRoaXMuI2ljb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgc2V0IG9uX2NvbG9yKGNvbG9yOiBGb3JtQ29sb3JzKSB7XG4gICAgaWYgKGNvbG9yID09PSBGb3JtQ29sb3JzLk5vbmUpIHRoaXMuI3N3aXRjaC5yZW1vdmVBdHRyaWJ1dGUoXCJvbi1jb2xvclwiKTtcbiAgICBlbHNlIHRoaXMuI3N3aXRjaC5zZXRBdHRyaWJ1dGUoXCJvbi1jb2xvclwiLCBjb2xvcik7XG4gIH1cbiAgc2V0IG9mZl9jb2xvcihjb2xvcjogRm9ybUNvbG9ycykge1xuICAgIGlmIChjb2xvciA9PT0gRm9ybUNvbG9ycy5Ob25lKSB0aGlzLiNzd2l0Y2gucmVtb3ZlQXR0cmlidXRlKFwib2ZmLWNvbG9yXCIpO1xuICAgIGVsc2UgdGhpcy4jc3dpdGNoLnNldEF0dHJpYnV0ZShcIm9mZi1jb2xvclwiLCBjb2xvcik7XG4gIH1cbiAgc2V0IGVycm9yX2NvbG9yKGNvbG9yOiBGb3JtQ29sb3JzKSB7XG4gICAgaWYgKGNvbG9yID09PSBGb3JtQ29sb3JzLk5vbmUpIHRoaXMuI3N3aXRjaC5yZW1vdmVBdHRyaWJ1dGUoXCJlcnJvci1jb2xvclwiKTtcbiAgICBlbHNlIHRoaXMuI3N3aXRjaC5zZXRBdHRyaWJ1dGUoXCJlcnJvci1jb2xvclwiLCBjb2xvcik7XG4gIH1cblxuICAvKipDYWxsZWQgd2hlbiB2YWx1ZSBpcyBjaGFuZ2VkICovXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUpIHRoaXMuI3N3aXRjaC5jbGFzc0xpc3QuYWRkKFwib25cIik7XG4gICAgZWxzZSB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LnJlbW92ZShcIm9uXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMubmV3X3ZhbHVlKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX2Vycjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy4jc3dpdGNoLmNsYXNzTGlzdC5hZGQoXCJlcnJvclwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHtcbiAgICB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LnJlbW92ZShcImVycm9yXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtU3dpdGNoKTtcblxuLyoqQ3JlYXRlcyBhIHN3aXRjaCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3N3aXRjaDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtU3dpdGNoT3B0aW9uczxJRD4sXG4pOiBGb3JtU3dpdGNoPElEPiB7XG4gIGNvbnN0IHN3aXQgPSBuZXcgRm9ybVN3aXRjaDxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmljb24pIHN3aXQuaWNvbiA9IG9wdGlvbnMuaWNvbjtcbiAgICBpZiAob3B0aW9ucy5vbl9jb2xvcikgc3dpdC5vbl9jb2xvciA9IG9wdGlvbnMub25fY29sb3I7XG4gICAgaWYgKG9wdGlvbnMub2ZmX2NvbG9yKSBzd2l0Lm9mZl9jb2xvciA9IG9wdGlvbnMub2ZmX2NvbG9yO1xuICAgIEZvcm1WYWx1ZVdyaXRlLmFwcGx5X29wdGlvbnMoc3dpdCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHN3aXQ7XG59XG4iLCJpbXBvcnQgeyBBY2Nlc3NUeXBlcywgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IFByZXR0aWZ5IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29tbW9uXCI7XG5pbXBvcnQge1xuICBtYXRlcmlhbF91bmZvbGRfbGVzc19yb3VuZGVkLFxuICBtYXRlcmlhbF91bmZvbGRfbW9yZV9yb3VuZGVkLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1pY29uc1wiO1xuaW1wb3J0IHsgZXJyLCBvaywgdHlwZSBPcHRpb24sIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQge1xuICBBTklNQVRJT05fTEVWRUwsXG4gIEFOSU1BVElPTl9TUEVFRCxcbiAgQW5pbWF0aW9uTGV2ZWxzLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi10aGVtZVwiO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnQsIEZvcm1WYWx1ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vZ3JvdXAuc2Nzc1wiO1xuXG4vKipEaWZmZXJlbnQgYm9yZGVyIHN0eWxlcyBmb3IgdGhlIGNvbXBvbmVudCBncm91cCovXG5leHBvcnQgY29uc3QgRm9ybUdyb3VwQm9yZGVyU3R5bGUgPSB7XG4gIE5vbmU6IFwibm9uZVwiLFxuICBJbnNldDogXCJpbnNldFwiLFxuICBPdXRzZXQ6IFwib3V0c2V0XCIsXG4gIExpbmU6IFwibGluZVwiLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEZvcm1Hcm91cEJvcmRlclN0eWxlID1cbiAgKHR5cGVvZiBGb3JtR3JvdXBCb3JkZXJTdHlsZSlba2V5b2YgdHlwZW9mIEZvcm1Hcm91cEJvcmRlclN0eWxlXTtcblxudHlwZSBFeHRyYWN0QjxBcnIgZXh0ZW5kcyBhbnlbXT4gPSBBcnIgZXh0ZW5kcyBbaW5mZXIgSGVhZCwgLi4uaW5mZXIgVGFpbF1cbiAgPyBIZWFkIGV4dGVuZHMgRm9ybVZhbHVlPGluZmVyIFQsIGluZmVyIElEPlxuICAgID8gW0Zvcm1WYWx1ZTxULCBJRD4sIC4uLkV4dHJhY3RCPFRhaWw+XVxuICAgIDogWy4uLkV4dHJhY3RCPFRhaWw+XVxuICA6IFtdO1xuXG50eXBlIFRvS2V5VmFsPEFyciBleHRlbmRzIEZvcm1WYWx1ZTxhbnksIGFueT5bXT4gPSB7XG4gIFtLIGluIEFycltudW1iZXJdIGFzIEtbXCJmb3JtX2lkXCJdXTogSyBleHRlbmRzIEZvcm1WYWx1ZTxpbmZlciBULCBhbnk+XG4gICAgPyBUXG4gICAgOiBuZXZlcjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUdyb3VwT3B0aW9uczxcbiAgTCBleHRlbmRzIEZvcm1FbGVtZW50W10sXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBULFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8VCwgSUQ+IHtcbiAgLyoqRWxlbWVudHMgdG8gYWRkIHRvIHRoZSBncm91cCovXG4gIGVsZW1lbnRzPzogWy4uLkxdO1xuICAvKipXZXRoZXIgdGhlIGdyb3VwIGlzIGNvbGxhcHNpYmxlLCBtZWFuaW5nIGl0IGhhcyBhIGJ1dHRvbiB0byBjb2xsYXBzZSBhbmQgZXhwYW5kIGFsbCBjb250ZW50IHRvIHRoZSBzaXplIG9mIHRoYXQgYnV0dG9uKi9cbiAgY29sbGFwc2libGU/OiBib29sZWFuO1xuICAvKipXZXRoZXIgdGhlIGdyb3VwIGlzIGNvbGxhcHNlZCBpbml0aWFsbHkqL1xuICBjb2xsYXBzZWQ/OiBib29sZWFuO1xuICAvKipUZXh0IHRvIHNob3cgb24gdGhlIGNvbGxhcHNlIGJ1dHRvbiovXG4gIGNvbGxhcHNlX3RleHQ/OiBzdHJpbmc7XG4gIC8qKkJvcmRlciBzdHlsZSBmb3IgZ3JvdXAqL1xuICBib3JkZXI/OiBGb3JtR3JvdXBCb3JkZXJTdHlsZTtcbiAgLyoqUmVtb3ZlcyBwYWRkaW5nIHdoZW4gdHJ1ZSBhbGxvd3MgZm9yIHB1dHRpbmcgZ3JvdXBzIGluIGdyb3VwcyB3aXRob3V0IHBhZGRpbmcgYnVpbGRpbmcgdXAgKi9cbiAgZW1iZWQ/OiBib29sZWFuO1xuICAvKipHcm91cCBtYXggaGVpZ2h0IGluIHJlbSwgdW5kZWZpbmVkIG1lYW5zIG5vIGxpbWl0Ki9cbiAgbWF4X2hlaWdodD86IG51bWJlcjtcbn1cblxuLyoqQ29tcG9uZW50IGdyb3VwIGNsYXNzIHdoaWNoIGFsbG93cyB0byBhZGQgZWxlbWVudHMgYW5kIGNvbnRyb2xzIHRoZSBmbG93IG9mIHRoZSBlbGVtZW50cyovXG5leHBvcnQgY2xhc3MgRm9ybUdyb3VwPFxuICBSVCBleHRlbmRzIG9iamVjdCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlPFJULCBJRD4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcImdyb3VwXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNjb2xsYXBzaWJsZT86IEhUTUxEaXZFbGVtZW50O1xuICAjY29sbGFwc2VkOiBib29sZWFuID0gZmFsc2U7XG4gICNjb2xsYXBzZV9idXR0b24/OiBIVE1MU3BhbkVsZW1lbnQ7XG4gICN2YWx1ZV9lbGVtZW50czogTWFwPHN0cmluZywgRm9ybVZhbHVlPGFueSwgYW55Pj4gPSBuZXcgTWFwKCk7XG5cbiAgc2V0IGVsZW1lbnRzKGVsZW1lbnRzOiBGb3JtRWxlbWVudFtdKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIG4gPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvbXAgPSBlbGVtZW50c1tpXTtcbiAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgRm9ybVZhbHVlICYmIGNvbXAuZm9ybV9pZCkge1xuICAgICAgICBpZiAodGhpcy4jdmFsdWVfZWxlbWVudHMuaGFzKGNvbXAuZm9ybV9pZCBhcyBzdHJpbmcpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiRm9ybSBlbGVtZW50IHdpdGggZm9ybSBpZCBcIiArXG4gICAgICAgICAgICAgIGNvbXAuZm9ybV9pZCArXG4gICAgICAgICAgICAgIFwiIGFscmVhZHkgZXhpc3RzIGluIGdyb3VwXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiN2YWx1ZV9lbGVtZW50cy5zZXQoY29tcC5mb3JtX2lkIGFzIHN0cmluZywgY29tcCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy4jY29sbGFwc2libGUpIHRoaXMuI2NvbGxhcHNpYmxlLmFwcGVuZENoaWxkKGNvbXApO1xuICAgICAgZWxzZSB0aGlzLmFwcGVuZENoaWxkKGNvbXApO1xuICAgIH1cbiAgfVxuXG4gIGdldCBlbGVtZW50cygpOiBGb3JtRWxlbWVudFtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuI3ZhbHVlX2VsZW1lbnRzLnZhbHVlcygpXTtcbiAgfVxuXG4gIC8qKlRoaXMgcGxhY2VzIHRoZSBncm91cCBhdCBhbiBhYnNvbHV0ZSBwb3NpdGlvbiBpbiBvbmUgb2YgdGhlIGNvcm5lcnMgb2YgdGhlIGNvbnRhaW5lciovXG4gIHNldCBib3JkZXIoYm9yZGVyOiBGb3JtR3JvdXBCb3JkZXJTdHlsZSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcbiAgICAgIEZvcm1Hcm91cEJvcmRlclN0eWxlLkluc2V0LFxuICAgICAgRm9ybUdyb3VwQm9yZGVyU3R5bGUuT3V0c2V0LFxuICAgICk7XG4gICAgaWYgKGJvcmRlciAmJiBib3JkZXIgIT09IEZvcm1Hcm91cEJvcmRlclN0eWxlLk5vbmUpXG4gICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoYm9yZGVyKTtcbiAgfVxuXG4gIHNldCBjb2xsYXBzaWJsZShjb2xsYXBzaWJsZTogYm9vbGVhbikge1xuICAgIGlmIChjb2xsYXBzaWJsZSAmJiAhdGhpcy4jY29sbGFwc2libGUpIHtcbiAgICAgIHRoaXMuI2NvbGxhcHNpYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDEpXG4gICAgICAgIHRoaXMuI2NvbGxhcHNpYmxlLnJlcGxhY2VDaGlsZHJlbiguLi50aGlzLmNoaWxkcmVuKTtcbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy4jY29sbGFwc2libGUpO1xuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKFwiY29sbGFwc2libGVcIik7XG4gICAgICB0aGlzLmFwcGVuZENoaWxkKFxuICAgICAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24gfHxcbiAgICAgICAgICAodGhpcy5jb2xsYXBzZV90ZXh0ID0gXCJcIikgfHxcbiAgICAgICAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24hLFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29sbGFwc2VkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCFjb2xsYXBzaWJsZSAmJiB0aGlzLiNjb2xsYXBzaWJsZSkge1xuICAgICAgdGhpcy5jb2xsYXBzZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVwbGFjZUNoaWxkcmVuKC4uLnRoaXMuI2NvbGxhcHNpYmxlLmNoaWxkcmVuKTtcbiAgICAgIHRoaXMuI2NvbGxhcHNpYmxlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5jbGFzc0xpc3QucmVtb3ZlKFwiY29sbGFwc2libGVcIik7XG4gICAgfVxuICB9XG4gIGdldCBjb2xsYXBzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jY29sbGFwc2libGUgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHNldCBjb2xsYXBzZWQoY29sbGFwc2VkOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuI2NvbGxhcHNpYmxlKSB7XG4gICAgICBpZiAoY29sbGFwc2VkICYmICF0aGlzLiNjb2xsYXBzZWQpIHtcbiAgICAgICAgLy8jIEFuaW1hdGlvblxuICAgICAgICBpZiAoQU5JTUFUSU9OX0xFVkVMLmdldCgpLnZhbHVlID09PSBBbmltYXRpb25MZXZlbHMuQWxsKSB7XG4gICAgICAgICAgdGhpcy4jY29sbGFwc2libGUuc3R5bGUub3ZlcmZsb3dZID0gXCJoaWRkZW5cIjtcbiAgICAgICAgICBjb25zdCBmdWxsX2hlaWdodCA9XG4gICAgICAgICAgICB0aGlzLiNjb2xsYXBzaWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgKyBcInB4XCI7XG4gICAgICAgICAgY29uc3QgYW5pbWF0aW9uID0gdGhpcy4jY29sbGFwc2libGUuYW5pbWF0ZShcbiAgICAgICAgICAgIFt7IGhlaWdodDogZnVsbF9oZWlnaHQgfSwgeyBoZWlnaHQ6IFwiMFwiIH1dLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBkdXJhdGlvbjogQU5JTUFUSU9OX1NQRUVELmdldCgpLnZhbHVlLFxuICAgICAgICAgICAgICBlYXNpbmc6IFwiZWFzZS1pblwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGFuaW1hdGlvbi5vbmZpbmlzaCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcImNvbGxhcHNlZFwiKTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNjb2xsYXBzaWJsZSkgdGhpcy4jY29sbGFwc2libGUuc3R5bGUub3ZlcmZsb3dZID0gXCJcIjtcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcImNvbGxhcHNlZFwiKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghY29sbGFwc2VkICYmIHRoaXMuI2NvbGxhcHNlZCkge1xuICAgICAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXCJjb2xsYXBzZWRcIik7XG4gICAgICAgIC8vIyBBbmltYXRpb25cbiAgICAgICAgaWYgKEFOSU1BVElPTl9MRVZFTC5nZXQoKS52YWx1ZSA9PT0gQW5pbWF0aW9uTGV2ZWxzLkFsbCkge1xuICAgICAgICAgIHRoaXMuI2NvbGxhcHNpYmxlLnN0eWxlLm92ZXJmbG93WSA9IFwiaGlkZGVuXCI7XG4gICAgICAgICAgY29uc3QgZnVsbF9oZWlnaHQgPVxuICAgICAgICAgICAgdGhpcy4jY29sbGFwc2libGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ICsgXCJweFwiO1xuICAgICAgICAgIGNvbnN0IGFuaW1hdGlvbiA9IHRoaXMuI2NvbGxhcHNpYmxlLmFuaW1hdGUoXG4gICAgICAgICAgICBbeyBoZWlnaHQ6IFwiMFwiIH0sIHsgaGVpZ2h0OiBmdWxsX2hlaWdodCB9XSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZHVyYXRpb246IEFOSU1BVElPTl9TUEVFRC5nZXQoKS52YWx1ZSxcbiAgICAgICAgICAgICAgZWFzaW5nOiBcImVhc2Utb3V0XCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgICAgYW5pbWF0aW9uLm9uZmluaXNoID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2NvbGxhcHNpYmxlKSB0aGlzLiNjb2xsYXBzaWJsZS5zdHlsZS5vdmVyZmxvd1kgPSBcIlwiO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuI2NvbGxhcHNlZCA9IGNvbGxhcHNlZDtcbiAgICB9XG4gIH1cbiAgZ2V0IGNvbGxhcHNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jY29sbGFwc2VkO1xuICB9XG5cbiAgc2V0IGNvbGxhcHNlX3RleHQodGV4dDogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLiNjb2xsYXBzZV9idXR0b24pIHtcbiAgICAgIHRoaXMuI2NvbGxhcHNlX2J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uLnRhYkluZGV4ID0gMDtcbiAgICAgIHRoaXMuI2NvbGxhcHNlX2J1dHRvbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24uYXBwZW5kQ2hpbGQobWF0ZXJpYWxfdW5mb2xkX2xlc3Nfcm91bmRlZCgpKTtcbiAgICAgIHRoaXMuI2NvbGxhcHNlX2J1dHRvbi5hcHBlbmRDaGlsZChtYXRlcmlhbF91bmZvbGRfbW9yZV9yb3VuZGVkKCkpO1xuICAgICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiAodGhpcy5jb2xsYXBzZWQgPSAhdGhpcy5jb2xsYXBzZWQpO1xuICAgICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICAgIGlmIChlLmtleSA9PT0gXCJFbnRlclwiIHx8IGUua2V5ID09PSBcIiBcIikge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLmNvbGxhcHNlZCA9ICF0aGlzLmNvbGxhcHNlZDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uLmZpcnN0Q2hpbGQhLnRleHRDb250ZW50ID0gdGV4dDtcbiAgfVxuXG4gIHNldCBtYXhfaGVpZ2h0KGhlaWdodDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShcIi0tbWF4X2hlaWdodFwiLCBoZWlnaHQgPyBoZWlnaHQgKyBcInJlbVwiIDogXCJub25lXCIpO1xuICAgIGlmIChoZWlnaHQpIHRoaXMuY2xhc3NMaXN0LmFkZChcIm1heF9oZWlnaHRcIik7XG4gICAgZWxzZSB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXhfaGVpZ2h0XCIpO1xuICB9XG5cbiAgc2V0IGVtYmVkKGVtYmVkOiBib29sZWFuKSB7XG4gICAgaWYgKGVtYmVkKSB0aGlzLmNsYXNzTGlzdC5hZGQoXCJlbWJlZFwiKTtcbiAgICBlbHNlIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcImVtYmVkXCIpO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbDogUlQpIHtcbiAgICBzdXBlci52YWx1ZSA9IHZhbDtcbiAgfVxuXG4gIC8qKlJldHVybnMgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCovXG4gIGdldCB2YWx1ZSgpOiBSZXN1bHQ8UlQsIHN0cmluZz4ge1xuICAgIGlmICh0aGlzLl9zdGF0ZSkgcmV0dXJuIGVycihcIlN0YXRlIGJhc2VkIGNvbXBvbmVudFwiKTtcbiAgICBjb25zdCByZXN1bHQ6IFJUID0ge30gYXMgUlQ7XG4gICAgZm9yIChjb25zdCBba2V5LCBjb21wXSBvZiB0aGlzLiN2YWx1ZV9lbGVtZW50cykge1xuICAgICAgY29uc3QgdmFsID0gY29tcC52YWx1ZTtcbiAgICAgIGlmICh2YWwuZXJyKSByZXR1cm4gZXJyKFwiQ29tcG9uZW50IHdpdGggaWQgXCIgKyBrZXkgKyBcIiBoYXMgbm8gdmFsdWVcIik7XG4gICAgICByZXN1bHRba2V5IGFzIGtleW9mIFJUXSA9IHZhbC52YWx1ZSBhcyBSVFtrZXlvZiBSVF07XG4gICAgfVxuICAgIHJldHVybiBvayhyZXN1bHQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWw6IFJUKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFsKVxuICAgICAgaWYgKHRoaXMuI3ZhbHVlX2VsZW1lbnRzLmhhcyhrZXkpKVxuICAgICAgICB0aGlzLiN2YWx1ZV9lbGVtZW50cy5nZXQoa2V5KSEudmFsdWUgPSB2YWxba2V5IGFzIGtleW9mIFJUXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGNvbXAgb2YgdGhpcy4jdmFsdWVfZWxlbWVudHMudmFsdWVzKCkpIGNvbXAuY2xlYXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoZXJyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKF9yZWxhdGVkOiBPcHRpb248e30+KTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBvbl9hY2Nlc3MoYWNjZXNzOiBBY2Nlc3NUeXBlcyk6IHZvaWQge1xuICAgIHN3aXRjaCAoYWNjZXNzKSB7XG4gICAgICBjYXNlIEFjY2Vzc1R5cGVzLlJlYWQ6IHtcbiAgICAgICAgdGhpcy50YWJJbmRleCA9IDA7XG4gICAgICAgIHRoaXMub25mb2N1cyA9ICgpID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmZvY3VzKCk7XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBBY2Nlc3NUeXBlcy5Xcml0ZToge1xuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShcInRhYkluZGV4XCIpO1xuICAgICAgICB0aGlzLm9uZm9jdXMgPSBudWxsO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1Hcm91cCk7XG5cbi8qKkNyZWF0ZXMgYSBkcm9wZG93biBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2dyb3VwPFxuICBMIGV4dGVuZHMgRm9ybUVsZW1lbnRbXSxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFQgZXh0ZW5kcyBvYmplY3QgPSBQcmV0dGlmeTxQYXJ0aWFsPFRvS2V5VmFsPEV4dHJhY3RCPEw+Pj4+LFxuPihvcHRpb25zPzogRm9ybUdyb3VwT3B0aW9uczxMLCBJRCwgVD4pOiBGb3JtR3JvdXA8VCwgSUQ+IHtcbiAgY29uc3Qgc2xpZGUgPSBuZXcgRm9ybUdyb3VwPFQsIElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuYm9yZGVyKSBzbGlkZS5ib3JkZXIgPSBvcHRpb25zLmJvcmRlcjtcbiAgICBpZiAob3B0aW9ucy5lbGVtZW50cykgc2xpZGUuZWxlbWVudHMgPSBvcHRpb25zLmVsZW1lbnRzO1xuICAgIGlmIChvcHRpb25zLmNvbGxhcHNlX3RleHQpIHNsaWRlLmNvbGxhcHNlX3RleHQgPSBvcHRpb25zLmNvbGxhcHNlX3RleHQ7XG4gICAgaWYgKG9wdGlvbnMuY29sbGFwc2libGUpIHNsaWRlLmNvbGxhcHNpYmxlID0gb3B0aW9ucy5jb2xsYXBzaWJsZTtcbiAgICBpZiAob3B0aW9ucy5jb2xsYXBzZWQpIHNsaWRlLmNvbGxhcHNlZCA9IG9wdGlvbnMuY29sbGFwc2VkO1xuICAgIGlmIChvcHRpb25zLm1heF9oZWlnaHQpIHNsaWRlLm1heF9oZWlnaHQgPSBvcHRpb25zLm1heF9oZWlnaHQ7XG4gICAgaWYgKG9wdGlvbnMuZW1iZWQpIHNsaWRlLmVtYmVkID0gb3B0aW9ucy5lbWJlZDtcbiAgICBGb3JtVmFsdWUuYXBwbHlfb3B0aW9ucyhzbGlkZSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHNsaWRlO1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBMaXN0RmllbGQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1saXN0XCI7XG5pbXBvcnQgeyBGb3JtRWxlbWVudCB9IGZyb20gXCIuLi9iYXNlXCI7XG5pbXBvcnQgXCIuL2xpc3RfZmllbGQuc2Nzc1wiO1xuXG5leHBvcnQgY2xhc3MgTGlzdEZvcm1GaWVsZDxUIGV4dGVuZHMgRm9ybUVsZW1lbnQ+IGV4dGVuZHMgTGlzdEZpZWxkIHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJsaXN0ZmllbGRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgc2V0IGVsZW1lbnQoY29tcG9uZW50OiBUKSB7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGRyZW4oY29tcG9uZW50KTtcbiAgfVxuXG4gIGdldCBlbGVtZW50KCk6IFQge1xuICAgIHJldHVybiB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFQ7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KExpc3RGb3JtRmllbGQpO1xuXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9saXN0X2ZpZWxkPFQgZXh0ZW5kcyBGb3JtRWxlbWVudD4oZWxlbWVudDogVCkge1xuICBjb25zdCBmaWVsZCA9IG5ldyBMaXN0Rm9ybUZpZWxkPFQ+KCk7XG4gIGZpZWxkLmVsZW1lbnQgPSBlbGVtZW50O1xuICByZXR1cm4gZmllbGQ7XG59XG4iLCJpbXBvcnQgeyBub25lIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgdHlwZSB7IFN0YXRlTnVtYmVyUmVsYXRlZCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN0YXRlXCI7XG5pbXBvcnQgdHlwZSB7IFNWR0Z1bmMgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdmdcIjtcbmltcG9ydCB7IEZvcm1WYWx1ZVdyaXRlLCB0eXBlIEZvcm1WYWx1ZU9wdGlvbnMgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi9udW1iZXJfYmFzZS5zY3NzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybU51bWJlck9wdGlvbnM8XG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBSVCA9IG51bWJlcixcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPFJULCBJRD4ge1xuICAvKipMb3dlciBsaW1pdCBmb3Igc2xpZGVyIHZhbHVlKi9cbiAgbWluPzogbnVtYmVyO1xuICAvKipVcHBlciBsaW1pdCBmb3Igc2xpZGVyIHZhbHVlKi9cbiAgbWF4PzogbnVtYmVyO1xuICAvKipBbW91bnQgb2YgZGVjaW1hbHMgdG8gc2hvdyovXG4gIGRlY2ltYWxzPzogbnVtYmVyO1xuICAvKipVbml0IHRvIHVzZSBmb3Igc2xpZGVyKi9cbiAgdW5pdD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtTnVtYmVyV3JpdGVPcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgUlQgPSBudW1iZXIsXG4+IGV4dGVuZHMgRm9ybU51bWJlck9wdGlvbnM8SUQsIFJUPiB7XG4gIC8qKlN0ZXAgc2l6ZSwgdXNlIDAgZm9yIGF1dG9tYXRpYyBzdGVwIHNpemUqL1xuICBzdGVwPzogbnVtYmVyO1xuICAvKipTdGFydCBmb3Igc3RlcCwgdXNlIDAgZm9yIGF1dG9tYXRpYyAqL1xuICBzdGFydD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtU3RlcHBlckJhc2VPcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgUlQgPSBudW1iZXIsXG4+IGV4dGVuZHMgRm9ybU51bWJlcldyaXRlT3B0aW9uczxJRCwgUlQ+IHtcbiAgLyoqd2V0aGVyIHRoZSBldmVudHMgYXJlIGxpdmUgYXMgdGhlIHNsaWRlciBpcyBtb3ZlZCBvciBvbmx5IHdoZW4gbW92aW5nIHN0b3BzICovXG4gIGxpdmU/OiBib29sZWFuO1xuICAvKipJY29uIHRvIHVzZSBmb3IgZGVjcmVhc2luZyB2YWx1ZSovXG4gIGljb25fZGVjcmVhc2U/OiBTVkdGdW5jO1xuICAvKipJY29uIHRvIHVzZSBmb3IgaW5jcmVhc2luZyB2YWx1ZSovXG4gIGljb25faW5jcmVhc2U/OiBTVkdGdW5jO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRm9ybU51bWJlcldyaXRlPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgUlQgPSBudW1iZXIsXG4+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8UlQsIElEPiB7XG4gIHN0YXRpYyBhcHBseV9vcHRpb25zPFJULCBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gICAgZWxlbWVudDogRm9ybU51bWJlcldyaXRlPElELCBSVD4sXG4gICAgb3B0aW9uczogRm9ybU51bWJlcldyaXRlT3B0aW9uczxJRCwgUlQ+LFxuICApIHtcbiAgICBpZiAob3B0aW9ucy51bml0KSBlbGVtZW50LnVuaXQgPSBvcHRpb25zLnVuaXQ7XG4gICAgaWYgKG9wdGlvbnMuZGVjaW1hbHMpIGVsZW1lbnQuZGVjaW1hbHMgPSBvcHRpb25zLmRlY2ltYWxzO1xuICAgIGlmIChvcHRpb25zLm1pbiAhPT0gdW5kZWZpbmVkKSBlbGVtZW50Lm1pbiA9IG9wdGlvbnMubWluO1xuICAgIGlmIChvcHRpb25zLm1heCAhPT0gdW5kZWZpbmVkKSBlbGVtZW50Lm1heCA9IG9wdGlvbnMubWF4O1xuICAgIGlmIChvcHRpb25zLnN0ZXApIGVsZW1lbnQuc3RlcCA9IG9wdGlvbnMuc3RlcDtcbiAgICBpZiAob3B0aW9ucy5zdGFydCkgZWxlbWVudC5zdGFydCA9IG9wdGlvbnMuc3RhcnQ7XG4gICAgc3VwZXIuYXBwbHlfb3B0aW9ucyhlbGVtZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlNldCB0aGUgbWluaW11bSB2YWx1ZSovXG4gIGFic3RyYWN0IHNldCBtaW4obWluOiBudW1iZXIgfCB1bmRlZmluZWQpO1xuXG4gIC8qKlNldCB0aGUgbWluaW11bSB2YWx1ZSovXG4gIGFic3RyYWN0IHNldCBtYXgobWF4OiBudW1iZXIgfCB1bmRlZmluZWQpO1xuXG4gIC8qKlNldHMgdGhlIHNpemUgb2YgbnVtYmVyIGNoYW5nZSBzdGVwcyovXG4gIGFic3RyYWN0IHNldCBzdGVwKHN0ZXA6IG51bWJlciB8IHVuZGVmaW5lZCk7XG5cbiAgLyoqU2V0cyB0aGUgc3RhcnQgb2Zmc2V0IGZvciBudW1iZXIgc3RlcHMqL1xuICBhYnN0cmFjdCBzZXQgc3RhcnQoc3RlcDogbnVtYmVyIHwgdW5kZWZpbmVkKTtcblxuICAvKipTZXRzIHRoZSBhbW91bnQgb2YgZGVjaW1hbHMgdGhlIGVsZW1lbnQgY2FuIGhhdmUqL1xuICBhYnN0cmFjdCBzZXQgZGVjaW1hbHMoZGVjOiBudW1iZXIgfCB1bmRlZmluZWQpO1xuXG4gIC8qKlNldHMgdGhlIHVuaXQgb2YgdGhlIGVsZW1lbnQqL1xuICBhYnN0cmFjdCBzZXQgdW5pdCh1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQpO1xuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKHJlbGF0ZWQ6IFBhcnRpYWw8U3RhdGVOdW1iZXJSZWxhdGVkPik6IHZvaWQge1xuICAgIGlmIChyZWxhdGVkLm1pbilcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJtaW5cIiwgcmVsYXRlZC5taW4sICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtaW5cIik7XG4gICAgaWYgKHJlbGF0ZWQubWF4KVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcIm1heFwiLCByZWxhdGVkLm1heCwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcIm1heFwiKTtcbiAgICBpZiAocmVsYXRlZC5zdGVwKVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcInN0ZXBcIiwgcmVsYXRlZC5zdGVwLCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwic3RlcFwiKTtcbiAgICBpZiAocmVsYXRlZC5zdGFydClcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJzdGFydFwiLCByZWxhdGVkLnN0YXJ0LCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwic3RhcnRcIik7XG4gICAgaWYgKHJlbGF0ZWQuZGVjaW1hbHMpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwiZGVjaW1hbHNcIiwgcmVsYXRlZC5kZWNpbWFscywgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcImRlY2ltYWxzXCIpO1xuICAgIGlmIChyZWxhdGVkLnVuaXQpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwidW5pdFwiLCByZWxhdGVkLnVuaXQsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJ1bml0XCIpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7XG4gIGdldF9jdXJzb3JfcG9zaXRpb24sXG4gIHNldF9jdXJzb3JfZW5kLFxuICBzZXRfY3Vyc29yX3Bvc2l0aW9uLFxuICBzZXRfc2VsZWN0aW9uX2FsbCxcbiAgc3luY19yZXNvbHZlLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1jb21tb25cIjtcbmltcG9ydCB7IG51bWJlcl9zdGVwX3N0YXJ0X2RlY2ltYWwgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1tYXRoXCI7XG5pbXBvcnQgeyBlcnIsIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgeyBGb3JtTnVtYmVyV3JpdGUsIHR5cGUgRm9ybU51bWJlcldyaXRlT3B0aW9ucyB9IGZyb20gXCIuLi9udW1iZXJfYmFzZVwiO1xuaW1wb3J0IFwiLi9udW1iZXJfaW5wdXQuc2Nzc1wiO1xuXG4vKipTbGlkZSBTZWxlY3RvciwgZGlzcGxheXMgYWxsIG9wdGlvbnMgaW4gYSBzbGlkZXIqL1xuY2xhc3MgTnVtYmVySW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybU51bWJlcldyaXRlPElEPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwibnVtYmVyaW5wdXRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI3NlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gICN1bml0OiBzdHJpbmcgPSBcIlwiO1xuICAjbWluOiBudW1iZXIgPSAtSW5maW5pdHk7XG4gICNtYXg6IG51bWJlciA9IEluZmluaXR5O1xuICAjc3RlcDogbnVtYmVyID0gMDtcbiAgI3N0YXJ0OiBudW1iZXIgPSAwO1xuICAjZGVjaW1hbHM6IG51bWJlciA9IDA7XG5cbiAgI3ZhbHVlX2JveCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjdW5pdF9ib3ggPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI2xlZ2VuZCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICNtYXhfbGVnZW5kID0gdGhpcy4jbGVnZW5kLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI21pbl9sZWdlbmQgPSB0aGlzLiNsZWdlbmQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMuI3ZhbHVlX2JveC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICB0aGlzLm9ucG9pbnRlcmRvd24gPSAoZSkgPT4ge1xuICAgICAgdGhpcy4jc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgaWYgKGUudGFyZ2V0ICE9PSB0aGlzLiN2YWx1ZV9ib3gpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzZXRfY3Vyc29yX2VuZCh0aGlzLiN2YWx1ZV9ib3gpO1xuICAgICAgfSBlbHNlIHRoaXMuI3ZhbHVlX2JveC5mb2N1cygpO1xuICAgIH07XG4gICAgdGhpcy4jdmFsdWVfYm94LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAodGhpcy4jc2VsZWN0ZWQpIHJldHVybjtcbiAgICAgIHNldF9zZWxlY3Rpb25fYWxsKHRoaXMuI3ZhbHVlX2JveCk7XG4gICAgICB0aGlzLiNzZWxlY3RlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgdGhpcy4jdmFsdWVfYm94Lm9uYmx1ciA9ICgpID0+IHtcbiAgICAgIHRoaXMuI3NlbGVjdGVkID0gZmFsc2U7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy4jc2V0KGZhbHNlKTtcbiAgICAgIH0sIDApO1xuICAgIH07XG4gICAgdGhpcy5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkVudGVyXCIpIHRoaXMuI3NldCh0cnVlKTtcbiAgICAgIGVsc2UgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGVsc2UgdGhpcy5jbGVhcl92YWx1ZSgpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd1VwXCIpIHRoaXMuI3N0ZXBfdmFsdWUodHJ1ZSk7XG4gICAgICBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0Rvd25cIikgdGhpcy4jc3RlcF92YWx1ZShmYWxzZSk7XG4gICAgICBlbHNlIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgICB0aGlzLm9uYmVmb3JlaW5wdXQgPSAoZSkgPT4ge1xuICAgICAgaWYgKGUuaW5wdXRUeXBlID09PSBcImluc2VydFBhcmFncmFwaFwiKSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlbHNlIGlmIChlLmRhdGEpIHtcbiAgICAgICAgaWYgKCEvW1xcZCwuLV0vZy50ZXN0KGUuZGF0YSkpIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZWxzZSBpZiAoL1ssLl0vZy50ZXN0KGUuZGF0YSkgJiYgdGhpcy4jZGVjaW1hbHMgPT09IDApXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLiNtaW4gPj0gMCAmJiAvLS9nLnRlc3QoZS5kYXRhKSkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBhc3luYyAjc2V0KGN1cjogYm9vbGVhbikge1xuICAgIGNvbnN0IHNlbCA9IGdldF9jdXJzb3JfcG9zaXRpb24odGhpcy4jdmFsdWVfYm94KTtcbiAgICBjb25zdCBidWZmID0gdGhpcy5idWZmZXI7XG4gICAgKFxuICAgICAgYXdhaXQgdGhpcy5zZXRfdmFsdWVfY2hlY2soXG4gICAgICAgIHBhcnNlRmxvYXQodGhpcy4jdmFsdWVfYm94LnRleHRDb250ZW50Py5yZXBsYWNlKFwiLFwiLCBcIi5cIikgfHwgXCJcIikgfHwgMCxcbiAgICAgIClcbiAgICApXG4gICAgICAubWFwX2VycigoKSA9PiB7XG4gICAgICAgIHRoaXMubmV3X3ZhbHVlKGJ1ZmYgfHwgTWF0aC5tYXgoTWF0aC5taW4oMCwgdGhpcy4jbWF4KSwgdGhpcy4jbWluKSk7XG4gICAgICAgIHNldF9jdXJzb3JfZW5kKHRoaXMuI3ZhbHVlX2JveCk7XG4gICAgICB9KVxuICAgICAgLm1hcCgoKSA9PiB7XG4gICAgICAgIGlmICghY3VyKSByZXR1cm47XG4gICAgICAgIHNldF9jdXJzb3JfcG9zaXRpb24odGhpcy4jdmFsdWVfYm94LCBzZWwpO1xuICAgICAgfSk7XG4gIH1cblxuICBmb2N1cyhvcHRpb25zPzogRm9jdXNPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy4jdmFsdWVfYm94LmZvY3VzKG9wdGlvbnMpO1xuICB9XG5cbiAgc2V0IHVuaXQodW5pdDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jdW5pdCA9IHVuaXQgfHwgXCJcIjtcbiAgICB0aGlzLiN1bml0X2JveC50ZXh0Q29udGVudCA9IHRoaXMuI3VuaXQ7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlbmdlbmQoKTtcbiAgfVxuXG4gIHNldCBkZWNpbWFscyhkZWM6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2RlY2ltYWxzID0gZGVjIHx8IDA7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlbmdlbmQoKTtcbiAgfVxuXG4gIHNldCBtaW4obWluOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtaW4gPSBtaW4gPz8gLUluZmluaXR5O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gIH1cbiAgI3VwZGF0ZV9taW5fbGVnZW5kKCkge1xuICAgIHRoaXMuI21pbl9sZWdlbmQudGV4dENvbnRlbnQgPVxuICAgICAgdGhpcy4jbWluID09PSAtSW5maW5pdHlcbiAgICAgICAgPyBcIlwiXG4gICAgICAgIDogXCJNaW46IFwiICsgdGhpcy4jbWluLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdDtcbiAgfVxuXG4gIHNldCBtYXgobWF4OiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtYXggPSBtYXggPz8gSW5maW5pdHk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZW5nZW5kKCk7XG4gIH1cbiAgI3VwZGF0ZV9tYXhfbGVuZ2VuZCgpIHtcbiAgICB0aGlzLiNtYXhfbGVnZW5kLnRleHRDb250ZW50ID1cbiAgICAgIHRoaXMuI21heCA9PT0gSW5maW5pdHlcbiAgICAgICAgPyBcIlwiXG4gICAgICAgIDogXCJNYXg6IFwiICsgdGhpcy4jbWF4LnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdDtcbiAgfVxuXG4gIHNldCBzdGVwKHN0ZXA6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3N0ZXAgPSBzdGVwIHx8IDA7XG4gIH1cblxuICBzZXQgc3RhcnQoc3RlcDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jc3RhcnQgPSBzdGVwIHx8IDA7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnRleHRDb250ZW50ID0gdmFsLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudCA9IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBsaW1pdF92YWx1ZSh2YWw6IG51bWJlcik6IFByb21pc2VMaWtlPFJlc3VsdDxudW1iZXIsIHN0cmluZz4+IHtcbiAgICBsZXQgbGltID0gbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbChcbiAgICAgIE1hdGgubWluKE1hdGgubWF4KHZhbCwgdGhpcy4jbWluKSwgdGhpcy4jbWF4KSxcbiAgICAgIHRoaXMuI3N0ZXAsXG4gICAgICB0aGlzLiNzdGFydCxcbiAgICAgIHRoaXMuI2RlY2ltYWxzLFxuICAgICk7XG4gICAgaWYgKGxpbSA8IHRoaXMuI21pbikgbGltICs9IHRoaXMuI3N0ZXA7XG4gICAgaWYgKGxpbSA+IHRoaXMuI21heCkgbGltIC09IHRoaXMuI3N0ZXA7XG4gICAgcmV0dXJuIHN1cGVyLmxpbWl0X3ZhbHVlKGxpbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tfdmFsdWUodmFsOiBudW1iZXIpOiBQcm9taXNlTGlrZTxSZXN1bHQ8bnVtYmVyLCBzdHJpbmc+PiB7XG4gICAgaWYgKHZhbCA8IHRoaXMuI21pbilcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihcIk1pbmltdW0gdmFsdWUgXCIgKyB0aGlzLiNtaW4udG9GaXhlZCh0aGlzLiNkZWNpbWFscykgKyB0aGlzLiN1bml0KSxcbiAgICAgICk7XG4gICAgaWYgKHZhbCA+IHRoaXMuI21heClcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihcIk1heGltdW0gdmFsdWUgXCIgKyB0aGlzLiNtYXgudG9GaXhlZCh0aGlzLiNkZWNpbWFscykgKyB0aGlzLiN1bml0KSxcbiAgICAgICk7XG4gICAgbGV0IGxpbSA9IG51bWJlcl9zdGVwX3N0YXJ0X2RlY2ltYWwoXG4gICAgICB2YWwsXG4gICAgICB0aGlzLiNzdGVwLFxuICAgICAgdGhpcy4jc3RhcnQsXG4gICAgICB0aGlzLiNkZWNpbWFscyxcbiAgICApO1xuICAgIGlmIChsaW0gPCB0aGlzLiNtaW4pIGxpbSArPSB0aGlzLiNzdGVwO1xuICAgIGlmIChsaW0gPiB0aGlzLiNtYXgpIGxpbSAtPSB0aGlzLiNzdGVwO1xuICAgIHJldHVybiBzdXBlci5jaGVja192YWx1ZShsaW0pO1xuICB9XG5cbiAgI3N0ZXBfdmFsdWUoZGlyOiBib29sZWFuKSB7XG4gICAgY29uc3Qgc3RlcCA9XG4gICAgICB0aGlzLiNzdGVwIHx8XG4gICAgICBNYXRoLm1heChcbiAgICAgICAgdGhpcy4jZGVjaW1hbHMgPyAxIC8gdGhpcy4jZGVjaW1hbHMgOiAxLFxuICAgICAgICBNYXRoLmZsb29yKE1hdGguYWJzKHRoaXMuYnVmZmVyIHx8IDApIC8gMTUwKSxcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKCh0aGlzLmJ1ZmZlciB8fCAwKSArIChkaXIgPyBzdGVwIDogLXN0ZXApKTtcbiAgfVxufVxuZGVmaW5lX2VsZW1lbnQoTnVtYmVySW5wdXQpO1xuXG4vKipDcmVhdGVzIGEgZHJvcGRvd24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9udW1iZXJfaW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybU51bWJlcldyaXRlT3B0aW9uczxJRD4sXG4pOiBOdW1iZXJJbnB1dDxJRD4ge1xuICBjb25zdCBpbnB1dCA9IG5ldyBOdW1iZXJJbnB1dDxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIEZvcm1OdW1iZXJXcml0ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IG5vbmUgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU3RhdGVOdW1iZXJSZWxhdGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RhdGVcIjtcbmltcG9ydCB7IEZvcm1WYWx1ZSB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgeyB0eXBlIEZvcm1OdW1iZXJPcHRpb25zIH0gZnJvbSBcIi4uL251bWJlcl9iYXNlXCI7XG5pbXBvcnQgXCIuL3Byb2dyZXNzLnNjc3NcIjtcblxuZXhwb3J0IGNsYXNzIEZvcm1Qcm9ncmVzczxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4gZXh0ZW5kcyBGb3JtVmFsdWU8XG4gIG51bWJlcixcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInByb2dyZXNzXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNtaW46IG51bWJlciA9IDA7XG4gICNtYXg6IG51bWJlciA9IDEwMDtcbiAgI3NwYW46IG51bWJlciA9IDEwMDtcbiAgI2RlY2ltYWxzOiBudW1iZXIgPSAwO1xuICAjYmFyOiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICN2YWw6IEhUTUxTcGFuRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjdW5pdDogSFRNTFNwYW5FbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG5cbiAgLyoqU2V0IHRoZSBtaW5pbXVtIHZhbHVlKi9cbiAgc2V0IG1pbihtaW46IG51bWJlcikge1xuICAgIHRoaXMuI21pbiA9IG1pbjtcbiAgICB0aGlzLiNzcGFuID0gdGhpcy4jbWF4IC0gdGhpcy4jbWluO1xuICB9XG5cbiAgLyoqU2V0IHRoZSBtaW5pbXVtIHZhbHVlKi9cbiAgc2V0IG1heChtYXg6IG51bWJlcikge1xuICAgIHRoaXMuI21heCA9IG1heDtcbiAgICB0aGlzLiNzcGFuID0gdGhpcy4jbWF4IC0gdGhpcy4jbWluO1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgYW1vdW50IG9mIGRlY2ltYWxzIHRoZSBlbGVtZW50IGNhbiBoYXZlKi9cbiAgc2V0IGRlY2ltYWxzKGRlYzogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jZGVjaW1hbHMgPSBNYXRoLm1heChkZWMgPz8gMCwgMCk7XG4gIH1cblxuICAvKipTZXRzIHRoZSB1bml0IG9mIHRoZSBlbGVtZW50Ki9cbiAgc2V0IHVuaXQodW5pdDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jdW5pdC50ZXh0Q29udGVudCA9IHVuaXQgPz8gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuI2Jhci5zdHlsZS53aWR0aCA9XG4gICAgICBNYXRoLm1pbihNYXRoLm1heCgoKHZhbHVlIC0gdGhpcy4jbWluKSAvIHRoaXMuI3NwYW4pICogMTAwLCAwKSwgMTAwKSArXG4gICAgICBcIiVcIjtcbiAgICB0aGlzLiN2YWwudGV4dENvbnRlbnQgPSB2YWx1ZS50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLiNiYXIuc3R5bGUud2lkdGggPSBcIjAlXCI7XG4gICAgdGhpcy4jdmFsLnRleHRDb250ZW50ID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoZXJyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKHJlbGF0ZWQ6IFBhcnRpYWw8U3RhdGVOdW1iZXJSZWxhdGVkPik6IHZvaWQge1xuICAgIGlmIChyZWxhdGVkLm1pbilcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJtaW5cIiwgcmVsYXRlZC5taW4sICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtaW5cIik7XG4gICAgaWYgKHJlbGF0ZWQubWF4KVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcIm1heFwiLCByZWxhdGVkLm1heCwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcIm1heFwiKTtcbiAgICBpZiAocmVsYXRlZC5kZWNpbWFscylcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJkZWNpbWFsc1wiLCByZWxhdGVkLmRlY2ltYWxzLCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwiZGVjaW1hbHNcIik7XG4gICAgaWYgKHJlbGF0ZWQudW5pdClcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJ1bml0XCIsIHJlbGF0ZWQudW5pdCwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcInVuaXRcIik7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1Qcm9ncmVzcyk7XG5cbi8qKkNyZWF0ZXMgYSBwcm9ncmVzcyBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3Byb2dyZXNzPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1OdW1iZXJPcHRpb25zPElEPixcbik6IEZvcm1Qcm9ncmVzczxJRD4ge1xuICBjb25zdCBwcm9nID0gbmV3IEZvcm1Qcm9ncmVzczxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5taW4gIT09IFwidW5kZWZpbmVkXCIpIHByb2cubWluID0gb3B0aW9ucy5taW47XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLm1heCAhPT0gXCJ1bmRlZmluZWRcIikgcHJvZy5tYXggPSBvcHRpb25zLm1heDtcbiAgICBwcm9nLmRlY2ltYWxzID0gb3B0aW9ucy5kZWNpbWFscztcbiAgICBwcm9nLnVuaXQgPSBvcHRpb25zLnVuaXQ7XG4gICAgRm9ybVZhbHVlLmFwcGx5X29wdGlvbnMocHJvZywgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHByb2c7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IHN5bmNfcmVzb2x2ZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHtcbiAgbWF0ZXJpYWxfYWRkX3JvdW5kZWQsXG4gIG1hdGVyaWFsX3JlbW92ZV9yb3VuZGVkLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1pY29uc1wiO1xuaW1wb3J0IHsgbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLW1hdGhcIjtcbmltcG9ydCB7IGVyciwgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybU51bWJlcldyaXRlLCB0eXBlIEZvcm1TdGVwcGVyQmFzZU9wdGlvbnMgfSBmcm9tIFwiLi4vbnVtYmVyX2Jhc2VcIjtcbmltcG9ydCBcIi4vc2xpZGVyLnNjc3NcIjtcblxuLyoqU2xpZGUgU2VsZWN0b3IsIGRpc3BsYXlzIGFsbCBvcHRpb25zIGluIGEgc2xpZGVyKi9cbmV4cG9ydCBjbGFzcyBGb3JtU2xpZGVyPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1OdW1iZXJXcml0ZTxcbiAgSUQsXG4gIG51bWJlclxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwic2xpZGVyXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICN1bml0OiBzdHJpbmcgPSBcIlwiO1xuICAjZGVjaW1hbHM6IG51bWJlciA9IDA7XG4gICNtaW46IG51bWJlciA9IC1JbmZpbml0eTtcbiAgI21heDogbnVtYmVyID0gSW5maW5pdHk7XG4gICNzcGFuOiBudW1iZXIgPSBJbmZpbml0eTtcbiAgI3N0ZXA6IG51bWJlciA9IDA7XG4gICNzdGFydDogbnVtYmVyID0gMDtcbiAgI2xpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgI2ljb25fZGVjID0gdGhpcy4jc3RlcHBlcl9mdW5jKFxuICAgIHRoaXMuYXBwZW5kQ2hpbGQobWF0ZXJpYWxfcmVtb3ZlX3JvdW5kZWQoKSksXG4gICAgZmFsc2UsXG4gICk7XG4gICNzbGlkZSA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICNsZWdlbmQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI2xlZnRfbGVnZW5kID0gdGhpcy4jbGVnZW5kLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI3JpZ2h0X2xlZ2VuZCA9IHRoaXMuI2xlZ2VuZC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNpY29uX2luYyA9IHRoaXMuI3N0ZXBwZXJfZnVuYyhcbiAgICB0aGlzLmFwcGVuZENoaWxkKG1hdGVyaWFsX2FkZF9yb3VuZGVkKCkpLFxuICAgIHRydWUsXG4gICk7XG4gICNzbGlkZXIgPSB0aGlzLiNzbGlkZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI3ZhbHVlX2JveCA9IHRoaXMuI3NsaWRlci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICN1bml0X2JveCA9IHRoaXMuI3NsaWRlci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLiNzbGlkZXIuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcblxuICAgIHRoaXMub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5idXR0b24gIT09IDApIHJldHVybjtcbiAgICAgIGlmIChlLnBvaW50ZXJUeXBlICE9PSBcIm1vdXNlXCIgJiYgIXRoaXMuI3NsaWRlci5jb250YWlucyhlLnRhcmdldCBhcyBOb2RlKSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuI3NsaWRlci5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuICAgICAgY29uc3QgYm94ID0gdGhpcy4jc2xpZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy4jc2xpZGVyLmNvbnRhaW5zKGUudGFyZ2V0IGFzIE5vZGUpXG4gICAgICAgID8gZS5jbGllbnRYID49IGJveC54XG4gICAgICAgICAgPyBlLmNsaWVudFggPD0gYm94LnggKyBib3gud2lkdGhcbiAgICAgICAgICAgID8gYm94LnggLSBlLmNsaWVudFhcbiAgICAgICAgICAgIDogLWJveC53aWR0aFxuICAgICAgICAgIDogMFxuICAgICAgICA6IC1ib3gud2lkdGggLyAyO1xuICAgICAgaWYgKHRoaXMuI21pbiA9PT0gLUluZmluaXR5IHx8IHRoaXMuI21heCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5idWZmZXIgfHwgMDtcbiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsID0gKHZhbHVlICs9IGRpZmYgLyA1MCk7XG4gICAgICAgICAgaWYgKHRoaXMuI2xpdmUpXG4gICAgICAgICAgICAoYXdhaXQgdGhpcy5zZXRfdmFsdWVfbGltaXQodmFsKSkubWFwKCh2KSA9PiAodmFsdWUgPSB2KSk7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAoYXdhaXQgdGhpcy5saW1pdF92YWx1ZSh2YWwpKS5tYXAoKHYpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy4jbW92ZV92YWx1ZSh2KTtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDApO1xuICAgICAgICBsZXQgZGlmZiA9IHRoaXMuI3hfdG9fcGVyYyhlLmNsaWVudFggKyBvZmZzZXQpIC0gNTA7XG4gICAgICAgIHRoaXMuI21vdmVfc2xpZGUodGhpcy4jeF90b19wZXJjKGUuY2xpZW50WCArIG9mZnNldCkpO1xuICAgICAgICB0aGlzLiNzbGlkZXIuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICB0aGlzLiNzbGlkZXIub25wb2ludGVybW92ZSA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGNvbnN0IHBlcmMgPSB0aGlzLiN4X3RvX3BlcmMoZXYuY2xpZW50WCArIG9mZnNldCk7XG4gICAgICAgICAgZGlmZiA9ICh0aGlzLiNzdGVwIHx8IDEpICogKChwZXJjIC0gNTApICogMik7XG4gICAgICAgICAgdGhpcy4jbW92ZV9zbGlkZShwZXJjKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLm9ucG9pbnRlcm1vdmUgPSBudWxsO1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IG51bGw7XG4gICAgICAgICAgdGhpcy4jbW92ZV9zbGlkZSg1MCk7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgaWYgKCF0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9saW1pdCh2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgICAgIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmJ1ZmZlciB8fCAwO1xuICAgICAgICB0aGlzLiNtb3ZlX2Fic29sdXRlKGUuY2xpZW50WCArIG9mZnNldCk7XG4gICAgICAgIHRoaXMuI3NsaWRlci5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJtb3ZlID0gKGV2KSA9PiB7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy4jbW92ZV9hYnNvbHV0ZShldi5jbGllbnRYICsgb2Zmc2V0KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLm9ucG9pbnRlcm1vdmUgPSBudWxsO1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgdGhpcy4jbW92ZV9hYnNvbHV0ZShldi5jbGllbnRYICsgb2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgICAgIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy4jc2xpZGUub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJBcnJvd1JpZ2h0XCIpIHRoaXMuI3N0ZXBfdmFsdWUodHJ1ZSk7XG4gICAgICBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0xlZnRcIikgdGhpcy4jc3RlcF92YWx1ZShmYWxzZSk7XG4gICAgICBlbHNlIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgfVxuXG4gIHNldCB1bml0KHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3VuaXQgPSB1bml0IHx8IFwiXCI7XG4gICAgdGhpcy4jdW5pdF9ib3gudGV4dENvbnRlbnQgPSB0aGlzLiN1bml0O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZWdlbmQoKTtcbiAgfVxuXG4gIHNldCBtaW4obWluOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtaW4gPSBtaW4gPz8gLUluZmluaXR5O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbWF4KCk7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgfVxuICAjdXBkYXRlX21pbl9sZWdlbmQoKSB7XG4gICAgdGhpcy4jbGVmdF9sZWdlbmQudGV4dENvbnRlbnQgPVxuICAgICAgdGhpcy4jbWluID09PSAtSW5maW5pdHlcbiAgICAgICAgPyBcIlwiXG4gICAgICAgIDogXCJNaW46IFwiICsgdGhpcy4jbWluLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdDtcbiAgfVxuXG4gIHNldCBtYXgobWF4OiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtYXggPSBtYXggPz8gSW5maW5pdHk7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9tYXgoKTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlZ2VuZCgpO1xuICB9XG5cbiAgI3VwZGF0ZV9tYXhfbGVnZW5kKCkge1xuICAgIHRoaXMuI3JpZ2h0X2xlZ2VuZC50ZXh0Q29udGVudCA9XG4gICAgICB0aGlzLiNtYXggPT09IEluZmluaXR5XG4gICAgICAgID8gXCJcIlxuICAgICAgICA6IHRoaXMuI21heC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQgKyBcIiA6TWF4XCI7XG4gIH1cblxuICAjdXBkYXRlX21pbl9tYXgoKSB7XG4gICAgdGhpcy4jc3BhbiA9IHRoaXMuI21heCAtIHRoaXMuI21pbjtcbiAgICBpZiAodGhpcy4jc3BhbiA9PT0gSW5maW5pdHkpIHRoaXMuI21vdmVfc2xpZGUoNTApO1xuICAgIGVsc2UgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgfVxuXG4gIHNldCBkZWNpbWFscyhkZWM6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2RlY2ltYWxzID0gZGVjIHx8IDA7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlZ2VuZCgpO1xuICB9XG5cbiAgc2V0IHN0ZXAoc3RlcDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jc3RlcCA9IHN0ZXAgfHwgMDtcbiAgfVxuXG4gIHNldCBzdGFydChzdGVwOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNzdGFydCA9IHN0ZXAgfHwgMDtcbiAgfVxuXG4gIC8qKlNldCB3ZXRoZXIgdGhlIHNsaWRlciBpcyBpbiBsaXZlIG1vZGUqL1xuICBzZXQgbGl2ZShsaXZlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbGl2ZSA9IGxpdmUgfHwgZmFsc2U7XG4gIH1cblxuICBzZXQgaWNvbl9kZWNyZWFzZShpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGQoXG4gICAgICB0aGlzLiNpY29uX2RlYyxcbiAgICAgIHRoaXMuI3N0ZXBwZXJfZnVuYyhpY29uID8gaWNvbigpIDogbWF0ZXJpYWxfcmVtb3ZlX3JvdW5kZWQoKSwgZmFsc2UpLFxuICAgICk7XG4gIH1cblxuICBzZXQgaWNvbl9pbmNyZWFzZShpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGQoXG4gICAgICB0aGlzLiNpY29uX2luYyxcbiAgICAgIHRoaXMuI3N0ZXBwZXJfZnVuYyhpY29uID8gaWNvbigpIDogbWF0ZXJpYWxfYWRkX3JvdW5kZWQoKSwgdHJ1ZSksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuI21vdmVfdmFsdWUodmFsdWUpO1xuICAgIHRoaXMuI21vdmVfc2xpZGUoXG4gICAgICBNYXRoLm1pbihNYXRoLm1heCgoKC10aGlzLiNtaW4gKyB2YWx1ZSkgLyB0aGlzLiNzcGFuKSAqIDEwMCwgMCksIDEwMCksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQgPSBcIlwiO1xuICAgIHRoaXMuI21vdmVfc2xpZGUoNTApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihlcnI6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGxpbWl0X3ZhbHVlKHZhbDogbnVtYmVyKTogUHJvbWlzZUxpa2U8UmVzdWx0PG51bWJlciwgc3RyaW5nPj4ge1xuICAgIGxldCBsaW0gPSBudW1iZXJfc3RlcF9zdGFydF9kZWNpbWFsKFxuICAgICAgTWF0aC5taW4oTWF0aC5tYXgodmFsLCB0aGlzLiNtaW4pLCB0aGlzLiNtYXgpLFxuICAgICAgdGhpcy4jc3RlcCxcbiAgICAgIHRoaXMuI3N0YXJ0LFxuICAgICAgdGhpcy4jZGVjaW1hbHMsXG4gICAgKTtcbiAgICBpZiAobGltIDwgdGhpcy4jbWluKSBsaW0gKz0gdGhpcy4jc3RlcDtcbiAgICBpZiAobGltID4gdGhpcy4jbWF4KSBsaW0gLT0gdGhpcy4jc3RlcDtcbiAgICByZXR1cm4gc3VwZXIubGltaXRfdmFsdWUobGltKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja192YWx1ZSh2YWw6IG51bWJlcik6IFByb21pc2VMaWtlPFJlc3VsdDxudW1iZXIsIHN0cmluZz4+IHtcbiAgICBpZiAodmFsIDwgdGhpcy4jbWluKVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKFwiTWluaW11bSB2YWx1ZSBcIiArIHRoaXMuI21pbi50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQpLFxuICAgICAgKTtcbiAgICBpZiAodmFsID4gdGhpcy4jbWF4KVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKFwiTWF4aW11bSB2YWx1ZSBcIiArIHRoaXMuI21heC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQpLFxuICAgICAgKTtcbiAgICBsZXQgbGltID0gbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbChcbiAgICAgIHZhbCxcbiAgICAgIHRoaXMuI3N0ZXAsXG4gICAgICB0aGlzLiNzdGFydCxcbiAgICAgIHRoaXMuI2RlY2ltYWxzLFxuICAgICk7XG4gICAgaWYgKGxpbSA8IHRoaXMuI21pbikgbGltICs9IHRoaXMuI3N0ZXA7XG4gICAgaWYgKGxpbSA+IHRoaXMuI21heCkgbGltIC09IHRoaXMuI3N0ZXA7XG4gICAgcmV0dXJuIHN1cGVyLmNoZWNrX3ZhbHVlKGxpbSk7XG4gIH1cblxuICBhc3luYyAjbW92ZV9hYnNvbHV0ZSh4OiBudW1iZXIsIGxhc3Q/OiBudW1iZXIpIHtcbiAgICBjb25zdCBwZXJjID0gdGhpcy4jeF90b19wZXJjKHgpO1xuICAgIGlmICh0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9saW1pdCh0aGlzLiNwZXJjX3RvX3ZhbHVlKHBlcmMpKTtcbiAgICBlbHNlIHtcbiAgICAgIGlmIChsYXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmxpbWl0X3ZhbHVlKHRoaXMuI3BlcmNfdG9fdmFsdWUocGVyYykpO1xuICAgICAgICBpZiAodmFsdWUub2spIHtcbiAgICAgICAgICB0aGlzLiNtb3ZlX3NsaWRlKCgoLXRoaXMuI21pbiArIHZhbHVlLnZhbHVlKSAvIHRoaXMuI3NwYW4pICogMTAwKTtcbiAgICAgICAgICB0aGlzLiNtb3ZlX3ZhbHVlKHZhbHVlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRfdmFsdWVfbGltaXQodGhpcy4jcGVyY190b192YWx1ZShwZXJjKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI3hfdG9fcGVyYyh4OiBudW1iZXIpIHtcbiAgICBjb25zdCBib3ggPSB0aGlzLiNzbGlkZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAoKHggLSBib3gueCkgLyBib3gud2lkdGgpICogMTAwKSk7XG4gIH1cblxuICAjcGVyY190b192YWx1ZShwZXJjOiBudW1iZXIpIHtcbiAgICByZXR1cm4gKHBlcmMgLyAxMDApICogdGhpcy4jc3BhbiArIHRoaXMuI21pbjtcbiAgfVxuXG4gIC8qKkF0dGFjaGVzIGNsaWNrIGFjdGlvbiB0byBvdmVyIHRpbWUgaW5jcmVhc2Ugc3BlZWQgb2Ygc3RlcHBpbmcgd2hlbiBob2xkaW5nIHN0ZXAgYnV0dG9ucyAqL1xuICAjc3RlcHBlcl9mdW5jKGljb246IFNWR1NWR0VsZW1lbnQsIGRpcjogYm9vbGVhbikge1xuICAgIGljb24ub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5idXR0b24gPT09IDApIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgbGV0IGludGVydmFsID0gMDtcbiAgICAgICAgbGV0IHNjYWxlcl9pbnRlcnZhbCA9IDA7XG4gICAgICAgIGxldCBzY2FsZXIgPSAyNTA7XG4gICAgICAgIGNvbnN0IHJlbGVhc2UgPSAoKSA9PiB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChzY2FsZXJfaW50ZXJ2YWwpO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICBpY29uLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgICBpY29uLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgaWNvbi5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuICAgICAgICB9O1xuICAgICAgICBpY29uLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgaWNvbi5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc3RlcF92YWx1ZShkaXIpO1xuICAgICAgICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy4jc3RlcF92YWx1ZShkaXIpLCBzY2FsZXIpO1xuICAgICAgICAgIHNjYWxlcl9pbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChzY2FsZXIgPiAyMCkgc2NhbGVyIC89IDEuMTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLiNzdGVwX3ZhbHVlKGRpciksIHNjYWxlcik7XG4gICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgICAgIGljb24ub25wb2ludGVydXAgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKGludGVydmFsID09PSAwKSB0aGlzLiNzdGVwX3ZhbHVlKGRpcik7XG4gICAgICAgICAgcmVsZWFzZSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGljb247XG4gIH1cblxuICAjc3RlcF92YWx1ZShkaXI6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzdGVwID1cbiAgICAgIHRoaXMuI3N0ZXAgfHxcbiAgICAgIE1hdGgubWF4KFxuICAgICAgICB0aGlzLiNkZWNpbWFscyA/IDEgLyB0aGlzLiNkZWNpbWFscyA6IDEsXG4gICAgICAgIE1hdGguZmxvb3IoTWF0aC5hYnModGhpcy5idWZmZXIgfHwgMCkgLyAxNTApLFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5zZXRfdmFsdWVfY2hlY2soKHRoaXMuYnVmZmVyIHx8IDApICsgKGRpciA/IHN0ZXAgOiAtc3RlcCkpO1xuICB9XG5cbiAgI21vdmVfc2xpZGUocGVyYzogbnVtYmVyKSB7XG4gICAgdGhpcy4jc2xpZGVyLnN0eWxlLmxlZnQgPSBwZXJjICsgXCIlXCI7XG4gIH1cbiAgI21vdmVfdmFsdWUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudCA9IHZhbHVlLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtU2xpZGVyKTtcblxuLyoqQ3JlYXRlcyBhIGRyb3Bkb3duIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fc2xpZGVyPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1TdGVwcGVyQmFzZU9wdGlvbnM8SUQ+LFxuKTogRm9ybVNsaWRlcjxJRD4ge1xuICBjb25zdCBzbGlkZSA9IG5ldyBGb3JtU2xpZGVyPElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMubGl2ZSkgc2xpZGUubGl2ZSA9IG9wdGlvbnMubGl2ZTtcbiAgICBpZiAob3B0aW9ucy5pY29uX2RlY3JlYXNlKSBzbGlkZS5pY29uX2RlY3JlYXNlID0gb3B0aW9ucy5pY29uX2RlY3JlYXNlO1xuICAgIGlmIChvcHRpb25zLmljb25faW5jcmVhc2UpIHNsaWRlLmljb25faW5jcmVhc2UgPSBvcHRpb25zLmljb25faW5jcmVhc2U7XG4gICAgRm9ybU51bWJlcldyaXRlLmFwcGx5X29wdGlvbnMoc2xpZGUsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBzbGlkZTtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHsgc2xlZXAsIHN5bmNfcmVzb2x2ZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHtcbiAgbWF0ZXJpYWxfYWRkX3JvdW5kZWQsXG4gIG1hdGVyaWFsX3JlbW92ZV9yb3VuZGVkLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1pY29uc1wiO1xuaW1wb3J0IHsgbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLW1hdGhcIjtcbmltcG9ydCB7IGVyciwgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybU51bWJlcldyaXRlLCB0eXBlIEZvcm1TdGVwcGVyQmFzZU9wdGlvbnMgfSBmcm9tIFwiLi4vbnVtYmVyX2Jhc2VcIjtcbmltcG9ydCBcIi4vc3RlcHBlci5zY3NzXCI7XG5cbi8qKlNsaWRlIFNlbGVjdG9yLCBkaXNwbGF5cyBhbGwgb3B0aW9ucyBpbiBhIHNsaWRlciovXG5leHBvcnQgY2xhc3MgRm9ybVN0ZXBwZXI8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybU51bWJlcldyaXRlPFxuICBJRCxcbiAgbnVtYmVyXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJzdGVwcGVyXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICN1bml0OiBzdHJpbmcgPSBcIlwiO1xuICAjZGVjaW1hbHM6IG51bWJlciA9IDA7XG4gICNtaW46IG51bWJlciA9IC1JbmZpbml0eTtcbiAgI21heDogbnVtYmVyID0gSW5maW5pdHk7XG4gICNzdGVwOiBudW1iZXIgPSAwO1xuICAjc3RhcnQ6IG51bWJlciA9IDA7XG4gICNsaXZlOiBib29sZWFuID0gZmFsc2U7XG4gICNpY29uX2RlYyA9IHRoaXMuI3N0ZXBwZXJfZnVuYyhcbiAgICB0aGlzLmFwcGVuZENoaWxkKG1hdGVyaWFsX3JlbW92ZV9yb3VuZGVkKCkpLFxuICAgIGZhbHNlLFxuICApO1xuICAjdGV4dCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjaWNvbl9pbmMgPSB0aGlzLiNzdGVwcGVyX2Z1bmMoXG4gICAgdGhpcy5hcHBlbmRDaGlsZChtYXRlcmlhbF9hZGRfcm91bmRlZCgpKSxcbiAgICB0cnVlLFxuICApO1xuICAjdmFsdWVfYm94ID0gdGhpcy4jdGV4dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICN1bml0X2JveCA9IHRoaXMuI3RleHQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjbGVnZW5kID0gdGhpcy4jdGV4dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNtYXhfbGVnZW5kID0gdGhpcy4jbGVnZW5kLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI21pbl9sZWdlbmQgPSB0aGlzLiNsZWdlbmQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIjBcIik7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuXG4gICAgdGhpcy4jdmFsdWVfYm94LnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiLTFcIik7XG4gICAgdGhpcy4jdmFsdWVfYm94LmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgIGxldCBkcmFnX2Jsb2NrZXIgPSBmYWxzZTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25mb2N1cyA9IGFzeW5jICgpID0+IHtcbiAgICAgIGRyYWdfYmxvY2tlciA9IHRydWU7XG4gICAgfTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25ibHVyID0gYXN5bmMgKCkgPT4ge1xuICAgICAgZHJhZ19ibG9ja2VyID0gZmFsc2U7XG4gICAgICBhd2FpdCBzbGVlcCgwKTtcbiAgICAgIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKFxuICAgICAgICBwYXJzZUZsb2F0KHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudD8ucmVwbGFjZShcIixcIiwgXCIuXCIpIHx8IFwiXCIpIHx8IDAsXG4gICAgICApO1xuICAgIH07XG4gICAgbGV0IHJlc2V0ID0gKCkgPT4ge307XG4gICAgdGhpcy4jdGV4dC5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmJ1dHRvbiA9PT0gMCAmJiAoZS50YXJnZXQgIT09IHRoaXMuI3ZhbHVlX2JveCB8fCAhZHJhZ19ibG9ja2VyKSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBjb25zdCBpbml0aWFsX3ZhbCA9IHRoaXMuYnVmZmVyIHx8IDA7XG4gICAgICAgIGxldCBtb3ZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy4jdGV4dC5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgIHRoaXMuI3RleHQub25wb2ludGVybW92ZSA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGlmIChtb3ZpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuI21vdmVfZGlmZihcbiAgICAgICAgICAgICAgaW5pdGlhbF92YWwgKyAoKGV2LmNsaWVudFggLSBlLmNsaWVudFgpIC8gMTApICogKHRoaXMuI3N0ZXAgfHwgMSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoZS5jbGllbnRYIC0gZXYuY2xpZW50WCkgPiA1KSB7XG4gICAgICAgICAgICB0aGlzLiN2YWx1ZV9ib3guY29udGVudEVkaXRhYmxlID0gXCJmYWxzZVwiO1xuICAgICAgICAgICAgbW92aW5nID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJlc2V0ID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuI3ZhbHVlX2JveC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAgICAgICB0aGlzLiN0ZXh0LnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jdGV4dC5vbnBvaW50ZXJtb3ZlID0gbnVsbDtcbiAgICAgICAgICB0aGlzLiN0ZXh0Lm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jdGV4dC5vbnBvaW50ZXJ1cCA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgaWYgKCFtb3ZpbmcgJiYgZS50YXJnZXQgIT09IHRoaXMuI3ZhbHVlX2JveCkge1xuICAgICAgICAgICAgdGhpcy4jdmFsdWVfYm94LmZvY3VzKCk7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydEFmdGVyKHRoaXMuI3ZhbHVlX2JveC5maXJzdENoaWxkISk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLm93bmVyRG9jdW1lbnQ/LmRlZmF1bHRWaWV3Py5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAobW92aW5nKSB7XG4gICAgICAgICAgICB0aGlzLiNtb3ZlX2RpZmYoXG4gICAgICAgICAgICAgIGluaXRpYWxfdmFsICsgKChldi5jbGllbnRYIC0gZS5jbGllbnRYKSAvIDEwKSAqICh0aGlzLiNzdGVwIHx8IDEpLFxuICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG1vdmluZyA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkFycm93UmlnaHRcIiB8fCBlLmtleSA9PT0gXCJBcnJvd0xlZnRcIikge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuI3N0ZXBfdmFsdWUoZS5rZXkgPT09IFwiQXJyb3dSaWdodFwiKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAocmVzZXQpIHJlc2V0KCk7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGVsc2UgdGhpcy5jbGVhcl92YWx1ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSB0aGlzLiN2YWx1ZV9ib3ggJiZcbiAgICAgICAgICAvW1xcZCwuLV0vZy50ZXN0KGUua2V5KVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQgPSBcIlwiO1xuICAgICAgICAgIHRoaXMuI3ZhbHVlX2JveC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB0aGlzLiN2YWx1ZV9ib3guYmx1cigpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICBlbHNlIHRoaXMuY2xlYXJfdmFsdWUoKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dSaWdodFwiIHx8IGUua2V5ID09PSBcIkFycm93TGVmdFwiKVxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH07XG4gICAgdGhpcy4jdmFsdWVfYm94Lm9uYmVmb3JlaW5wdXQgPSAoZSkgPT4ge1xuICAgICAgaWYgKGUuaW5wdXRUeXBlID09PSBcImluc2VydFBhcmFncmFwaFwiKSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoZS5kYXRhKSB7XG4gICAgICAgIGlmICghL1tcXGQsLi1dL2cudGVzdChlLmRhdGEpKSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGVsc2UgaWYgKC9bLC5dL2cudGVzdChlLmRhdGEpICYmIHRoaXMuI2RlY2ltYWxzID09PSAwKVxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgKHRoaXMuI21pbiA+PSAwICYmIC8tL2cudGVzdChlLmRhdGEpKSB8fFxuICAgICAgICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudD8uaW5jbHVkZXMoXCItXCIpXG4gICAgICAgIClcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHNldCB1bml0KHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3VuaXQgPSB1bml0IHx8IFwiXCI7XG4gICAgdGhpcy4jdW5pdF9ib3gudGV4dENvbnRlbnQgPSB0aGlzLiN1bml0O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZW5nZW5kKCk7XG4gIH1cblxuICBzZXQgZGVjaW1hbHMoZGVjOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNkZWNpbWFscyA9IGRlYyB8fCAwO1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZW5nZW5kKCk7XG4gIH1cblxuICBzZXQgbWluKG1pbjogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWluID0gbWluID8/IC1JbmZpbml0eTtcbiAgICB0aGlzLiN1cGRhdGVfbWluX2xlZ2VuZCgpO1xuICB9XG4gICN1cGRhdGVfbWluX2xlZ2VuZCgpIHtcbiAgICB0aGlzLiNtaW5fbGVnZW5kLnRleHRDb250ZW50ID1cbiAgICAgIHRoaXMuI21pbiA9PT0gLUluZmluaXR5XG4gICAgICAgID8gXCJcIlxuICAgICAgICA6IFwiTWluOiBcIiArIHRoaXMuI21pbi50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQ7XG4gIH1cblxuICBzZXQgbWF4KG1heDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWF4ID0gbWF4ID8/IEluZmluaXR5O1xuICAgIHRoaXMuI3VwZGF0ZV9tYXhfbGVuZ2VuZCgpO1xuICB9XG4gICN1cGRhdGVfbWF4X2xlbmdlbmQoKSB7XG4gICAgdGhpcy4jbWF4X2xlZ2VuZC50ZXh0Q29udGVudCA9XG4gICAgICB0aGlzLiNtYXggPT09IEluZmluaXR5XG4gICAgICAgID8gXCJcIlxuICAgICAgICA6IFwiTWF4OiBcIiArIHRoaXMuI21heC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQ7XG4gIH1cblxuICBzZXQgc3RlcChzdGVwOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNzdGVwID0gc3RlcCB8fCAwO1xuICB9XG5cbiAgc2V0IHN0YXJ0KHN0ZXA6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3N0YXJ0ID0gc3RlcCB8fCAwO1xuICB9XG5cbiAgLyoqU2V0IHdldGhlciB0aGUgc2xpZGVyIGlzIGluIGxpdmUgbW9kZSovXG4gIHNldCBsaXZlKGxpdmU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNsaXZlID0gbGl2ZSB8fCBmYWxzZTtcbiAgfVxuXG4gIHNldCBpY29uX2RlY3JlYXNlKGljb246IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnJlcGxhY2VDaGlsZChcbiAgICAgIHRoaXMuI2ljb25fZGVjLFxuICAgICAgdGhpcy4jc3RlcHBlcl9mdW5jKGljb24gPyBpY29uKCkgOiBtYXRlcmlhbF9yZW1vdmVfcm91bmRlZCgpLCBmYWxzZSksXG4gICAgKTtcbiAgfVxuXG4gIHNldCBpY29uX2luY3JlYXNlKGljb246IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnJlcGxhY2VDaGlsZChcbiAgICAgIHRoaXMuI2ljb25faW5jLFxuICAgICAgdGhpcy4jc3RlcHBlcl9mdW5jKGljb24gPyBpY29uKCkgOiBtYXRlcmlhbF9hZGRfcm91bmRlZCgpLCB0cnVlKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy4jbW92ZV92YWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnRleHRDb250ZW50ID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoZXJyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBsaW1pdF92YWx1ZSh2YWw6IG51bWJlcik6IFByb21pc2VMaWtlPFJlc3VsdDxudW1iZXIsIHN0cmluZz4+IHtcbiAgICBsZXQgbGltID0gbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbChcbiAgICAgIE1hdGgubWluKE1hdGgubWF4KHZhbCwgdGhpcy4jbWluKSwgdGhpcy4jbWF4KSxcbiAgICAgIHRoaXMuI3N0ZXAsXG4gICAgICB0aGlzLiNzdGFydCxcbiAgICAgIHRoaXMuI2RlY2ltYWxzLFxuICAgICk7XG4gICAgaWYgKGxpbSA8IHRoaXMuI21pbikgbGltICs9IHRoaXMuI3N0ZXA7XG4gICAgaWYgKGxpbSA+IHRoaXMuI21heCkgbGltIC09IHRoaXMuI3N0ZXA7XG4gICAgcmV0dXJuIHN1cGVyLmxpbWl0X3ZhbHVlKGxpbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tfdmFsdWUodmFsOiBudW1iZXIpOiBQcm9taXNlTGlrZTxSZXN1bHQ8bnVtYmVyLCBzdHJpbmc+PiB7XG4gICAgaWYgKHZhbCA8IHRoaXMuI21pbilcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihcIk1pbmltdW0gdmFsdWUgXCIgKyB0aGlzLiNtaW4udG9GaXhlZCh0aGlzLiNkZWNpbWFscykgKyB0aGlzLiN1bml0KSxcbiAgICAgICk7XG4gICAgaWYgKHZhbCA+IHRoaXMuI21heClcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihcIk1heGltdW0gdmFsdWUgXCIgKyB0aGlzLiNtYXgudG9GaXhlZCh0aGlzLiNkZWNpbWFscykgKyB0aGlzLiN1bml0KSxcbiAgICAgICk7XG4gICAgbGV0IGxpbSA9IG51bWJlcl9zdGVwX3N0YXJ0X2RlY2ltYWwoXG4gICAgICB2YWwsXG4gICAgICB0aGlzLiNzdGVwLFxuICAgICAgdGhpcy4jc3RhcnQsXG4gICAgICB0aGlzLiNkZWNpbWFscyxcbiAgICApO1xuICAgIGlmIChsaW0gPCB0aGlzLiNtaW4pIGxpbSArPSB0aGlzLiNzdGVwO1xuICAgIGlmIChsaW0gPiB0aGlzLiNtYXgpIGxpbSAtPSB0aGlzLiNzdGVwO1xuICAgIHJldHVybiBzdXBlci5jaGVja192YWx1ZShsaW0pO1xuICB9XG5cbiAgLyoqTW92ZXMgdGhlIHZhbHVlIHRvIGEgcG9zaXRpb24gYnkgdGhlIG1vdXNlIHggY29vcmRpbmF0ZXMqL1xuICBhc3luYyAjbW92ZV9kaWZmKHZhbHVlOiBudW1iZXIsIGxhc3Q6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9saW1pdCh2YWx1ZSk7XG4gICAgZWxzZSB7XG4gICAgICBpZiAobGFzdCkgdGhpcy5zZXRfdmFsdWVfbGltaXQodmFsdWUpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGxpbSA9IGF3YWl0IHRoaXMubGltaXRfdmFsdWUodmFsdWUpO1xuICAgICAgICBpZiAobGltLm9rKSB0aGlzLiNtb3ZlX3ZhbHVlKGxpbS52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqTW92ZXMgdGhlIHNsaWRlciB0byB0aGUgZ2l2ZW4gcGVyY2VudCBwb3NpdGlvbiovXG4gICNtb3ZlX3ZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQgPSB2YWx1ZS50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKTtcbiAgfVxuXG4gIC8qKkF0dGFjaGVzIGNsaWNrIGFjdGlvbiB0byBvdmVyIHRpbWUgaW5jcmVhc2Ugc3BlZWQgb2Ygc3RlcHBpbmcgd2hlbiBob2xkaW5nIHN0ZXAgYnV0dG9ucyAqL1xuICAjc3RlcHBlcl9mdW5jKGljb246IFNWR1NWR0VsZW1lbnQsIGRpcjogYm9vbGVhbikge1xuICAgIGljb24ub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5idXR0b24gPT09IDApIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgbGV0IGludGVydmFsID0gMDtcbiAgICAgICAgbGV0IHNjYWxlcl9pbnRlcnZhbCA9IDA7XG4gICAgICAgIGxldCBzY2FsZXIgPSAyNTA7XG4gICAgICAgIGNvbnN0IHJlbGVhc2UgPSAoKSA9PiB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChzY2FsZXJfaW50ZXJ2YWwpO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICBpY29uLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgICBpY29uLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgaWNvbi5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuICAgICAgICB9O1xuICAgICAgICBpY29uLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgaWNvbi5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc3RlcF92YWx1ZShkaXIpO1xuICAgICAgICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy4jc3RlcF92YWx1ZShkaXIpLCBzY2FsZXIpO1xuICAgICAgICAgIHNjYWxlcl9pbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChzY2FsZXIgPiAyMCkgc2NhbGVyIC89IDEuMTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLiNzdGVwX3ZhbHVlKGRpciksIHNjYWxlcik7XG4gICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgICAgIGljb24ub25wb2ludGVydXAgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKGludGVydmFsID09PSAwKSB0aGlzLiNzdGVwX3ZhbHVlKGRpcik7XG4gICAgICAgICAgcmVsZWFzZSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGljb247XG4gIH1cblxuICAjc3RlcF92YWx1ZShkaXI6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzdGVwID1cbiAgICAgIHRoaXMuI3N0ZXAgfHxcbiAgICAgIE1hdGgubWF4KFxuICAgICAgICB0aGlzLiNkZWNpbWFscyA/IDEgLyB0aGlzLiNkZWNpbWFscyA6IDEsXG4gICAgICAgIE1hdGguZmxvb3IoTWF0aC5hYnModGhpcy5idWZmZXIgfHwgMCkgLyAxNTApLFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5zZXRfdmFsdWVfY2hlY2soKHRoaXMuYnVmZmVyIHx8IDApICsgKGRpciA/IHN0ZXAgOiAtc3RlcCkpO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtU3RlcHBlcik7XG5cbi8qKkNyZWF0ZXMgYSBkcm9wZG93biBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3N0ZXBwZXI8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybVN0ZXBwZXJCYXNlT3B0aW9uczxJRD4sXG4pOiBGb3JtU3RlcHBlcjxJRD4ge1xuICBjb25zdCBzbGlkZSA9IG5ldyBGb3JtU3RlcHBlcjxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmxpdmUpIHNsaWRlLmxpdmUgPSBvcHRpb25zLmxpdmU7XG4gICAgaWYgKG9wdGlvbnMuaWNvbl9kZWNyZWFzZSkgc2xpZGUuaWNvbl9kZWNyZWFzZSA9IG9wdGlvbnMuaWNvbl9kZWNyZWFzZTtcbiAgICBpZiAob3B0aW9ucy5pY29uX2luY3JlYXNlKSBzbGlkZS5pY29uX2luY3JlYXNlID0gb3B0aW9ucy5pY29uX2luY3JlYXNlO1xuICAgIEZvcm1OdW1iZXJXcml0ZS5hcHBseV9vcHRpb25zKHNsaWRlLCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gc2xpZGU7XG59XG4iLCJpbXBvcnQgeyBzb21lIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgc3RhdGUsIHsgdHlwZSBTdGF0ZUVudW1SZWxhdGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RhdGVcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi9iYXNlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybVNlbGVjdG9yT3B0aW9uPFJUPiB7XG4gIC8qKlZhbHVlIHRvIHNldCB3aGVuIG9wdGlvbiBpcyBzZWxlY3RlZCAqL1xuICB2YWx1ZTogUlQ7XG4gIC8qKlRleHQgZm9yIHNlbGVjdGlvbiAqL1xuICB0ZXh0OiBzdHJpbmc7XG4gIC8qKkljb24gdG8gZGlzcGxheSBmb3Igb3B0aW9uKi9cbiAgaWNvbj86IFNWR0Z1bmM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnM8XG4gIFQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8VCwgSUQ+IHtcbiAgLyoqT3B0aW9ucyBmb3Igc2VsZWN0b3IqL1xuICBzZWxlY3Rpb25zPzogRm9ybVNlbGVjdG9yT3B0aW9uPFQ+W107XG59XG5cbi8qKkJhc2UgZm9yIG51bWJlciBlbGVtZW50cyBlbGVtZW50cyovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRm9ybVNlbGVjdG9yQmFzZTxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFJULCBJRD4ge1xuICAvKipTZXRzIHRoZSBzZWxlY3Rpb24gb3B0aW9ucyBmb3IgdGhlIHNlbGVjdG9yICovXG4gIGFic3RyYWN0IHNldCBzZWxlY3Rpb25zKHNlbGVjdGlvbnM6IEZvcm1TZWxlY3Rvck9wdGlvbjxSVD5bXSB8IHVuZGVmaW5lZCk7XG5cbiAgc3RhdGljIGFwcGx5X29wdGlvbnM8UlQsIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgICBlbGVtZW50OiBGb3JtU2VsZWN0b3JCYXNlPFJULCBJRD4sXG4gICAgb3B0aW9uczogRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnM8UlQsIElEPixcbiAgKSB7XG4gICAgaWYgKG9wdGlvbnMuc2VsZWN0aW9ucykgZWxlbWVudC5zZWxlY3Rpb25zID0gb3B0aW9ucy5zZWxlY3Rpb25zO1xuICAgIHN1cGVyLmFwcGx5X29wdGlvbnMoZWxlbWVudCwgb3B0aW9ucyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChyZWxhdGVkOiBQYXJ0aWFsPFN0YXRlRW51bVJlbGF0ZWQ+KTogdm9pZCB7XG4gICAgaWYgKHJlbGF0ZWQubGlzdCkge1xuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcF9tYXAoXG4gICAgICAgIFwic2VsZWN0aW9uc1wiLFxuICAgICAgICByZWxhdGVkLmxpc3QsXG4gICAgICAgICgpID0+IHNvbWUoW10pLFxuICAgICAgICAodmFsKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHNvbWUoXG4gICAgICAgICAgICBzdGF0ZS5lLm1hcCh2YWwsIChrZXksIHZhbCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRleHQ6IHZhbC5uYW1lLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBrZXkgYXMgUlQsXG4gICAgICAgICAgICAgICAgaWNvbjogdmFsLmljb24sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2UsIGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHtcbiAgbWF0ZXJpYWxfY2xvc2Vfcm91bmRlZCxcbiAgbWF0ZXJpYWxfdW5mb2xkX2xlc3Nfcm91bmRlZCxcbiAgbWF0ZXJpYWxfdW5mb2xkX21vcmVfcm91bmRlZCxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItaWNvbnNcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHtcbiAgRm9ybVNlbGVjdG9yQmFzZSxcbiAgdHlwZSBGb3JtU2VsZWN0b3JCYXNlT3B0aW9ucyxcbiAgdHlwZSBGb3JtU2VsZWN0b3JPcHRpb24sXG59IGZyb20gXCIuLi9zZWxlY3Rvcl9iYXNlXCI7XG5pbXBvcnQgXCIuL2Ryb3BfZG93bi5zY3NzXCI7XG5cbmludGVyZmFjZSBTZWxPcHRpb25zIHtcbiAgdGV4dDogc3RyaW5nO1xuICBpY29uPzogU1ZHRnVuYztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtRHJvcERvd25PcHRpb25zPFxuICBSVCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnM8UlQsIElEPiB7XG4gIC8qKkRlZmF1bHQgdGV4dCBkaXNwbGF5ZWQqL1xuICBkZWZhdWx0Pzogc3RyaW5nO1xuICAvKipEZWZhdWx0IGljb24gZGlzcGxheWVkKi9cbiAgZGVmYXVsdF9pY29uPzogU1ZHRnVuYztcbn1cblxuLyoqRHJvcGRvd24gYm94IGZvciBzZWxlY3RpbmcgYmV0d2VlbiBtdWx0aXBsZSBjaG9pY2VzIGluIGEgc21hbGwgc3BhY2UqL1xuZXhwb3J0IGNsYXNzIEZvcm1Ecm9wZG93bjxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1TZWxlY3RvckJhc2U8UlQsIElEPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiZHJvcGRvd25cIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI21hcDogTWFwPFJULCBTZWxPcHRpb25zPiA9IG5ldyBNYXAoKTtcbiAgI3ZhbHVlczogUlRbXSA9IFtdO1xuICAjc2VsZWN0ZWQ6IG51bWJlciA9IC0xO1xuXG4gICNpY29uPzogU1ZHU1ZHRWxlbWVudDtcbiAgI3RleHQ6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI29wZW46IFNWR1NWR0VsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKG1hdGVyaWFsX3VuZm9sZF9tb3JlX3JvdW5kZWQoKSk7XG4gICNkZWZhdWx0OiBUZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJTZWxlY3Qgc29tZXRoaW5nXCIpO1xuICAjZGVmYXVsdF9pY29uPzogU1ZHRnVuYztcbiAgcHJpdmF0ZSBpc19vcGVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLiN0ZXh0LmFwcGVuZCh0aGlzLiNkZWZhdWx0KTtcbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgdGhpcy50YWJJbmRleCA9IDA7XG4gICAgdGhpcy5vbmNsaWNrID0gKCkgPT4gKHRoaXMub3BlbiA9IHRydWUpO1xuICAgIHRoaXMub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5wb2ludGVyVHlwZSA9PT0gXCJtb3VzZVwiKSB7XG4gICAgICAgIHRoaXMub3BlbiA9IHRydWU7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIHN3aXRjaCAoZS5rZXkpIHtcbiAgICAgICAgY2FzZSBcIiBcIjpcbiAgICAgICAgY2FzZSBcIkVudGVyXCI6XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMub3BlbiA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJBcnJvd0Rvd25cIjpcbiAgICAgICAgY2FzZSBcIkFycm93VXBcIjpcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB0aGlzLiNzZWxlY3RfYWRqYWNlbnQoZS5rZXkgPT09IFwiQXJyb3dEb3duXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipHZXRzIHRoZSBkZWZhdWx0IHRleHQgZGlzcGxheWVkIHdoZW4gbm90aGluZyBoYXMgYmVlbiBzZWxlY3RlZCB5ZXQgKi9cbiAgZ2V0IGRlZmF1bHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2RlZmF1bHQubm9kZVZhbHVlIHx8IFwiXCI7XG4gIH1cblxuICAvKipTZXRzIHRoZSBkZWZhdWx0IHRleHQgZGlzcGxheWVkIHdoZW4gbm90aGluZyBoYXMgYmVlbiBzZWxlY3RlZCB5ZXQgKi9cbiAgc2V0IGRlZmF1bHQoZGVmOiBzdHJpbmcpIHtcbiAgICB0aGlzLiNkZWZhdWx0Lm5vZGVWYWx1ZSA9IGRlZjtcbiAgfVxuXG4gIC8qKlNldHMgdGhlIGRlZmF1bHQgdGV4dCBkaXNwbGF5ZWQgd2hlbiBub3RoaW5nIGhhcyBiZWVuIHNlbGVjdGVkIHlldCAqL1xuICBzZXQgZGVmYXVsdF9pY29uKGRlZjogU1ZHRnVuYyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2RlZmF1bHRfaWNvbiA9IGRlZjtcbiAgICBpZiAoZGVmICYmIHRoaXMuI3NlbGVjdGVkID09PSAtMSkgdGhpcy4jc2V0X2ljb24gPSBkZWY7XG4gIH1cblxuICBzZXQgc2VsZWN0aW9ucyhzZWxlY3Rpb25zOiBGb3JtU2VsZWN0b3JPcHRpb248UlQ+W10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICBpZiAodGhpcy4jbWFwLnNpemUgPiAwKSB7XG4gICAgICB0aGlzLiNtYXAuY2xlYXIoKTtcbiAgICAgIHRoaXMuI3ZhbHVlcyA9IFtdO1xuICAgICAgdGhpcy4jc2VsZWN0ZWQgPSAtMTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IHNlbGVjdGlvbnMgJiYgaSA8IHNlbGVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHsgdmFsdWUsIHRleHQsIGljb24gfSA9IHNlbGVjdGlvbnNbaV07XG4gICAgICB0aGlzLiNtYXAuc2V0KHZhbHVlLCB7IHRleHQsIGljb24gfSk7XG4gICAgICB0aGlzLiN2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gIH1cblxuICBzZXQgb3BlbihvcGVuOiBib29sZWFuKSB7XG4gICAgaWYgKG9wZW4gJiYgIXRoaXMuaXNfb3Blbikge1xuICAgICAgdGhpcy4jb3Blbi5yZXBsYWNlQ2hpbGRyZW4obWF0ZXJpYWxfdW5mb2xkX2xlc3Nfcm91bmRlZCgpKTtcbiAgICAgIGJveC5vcGVuX21lbnUodGhpcy4jbWFwLCB0aGlzLCB0aGlzLmJ1ZmZlcik7XG4gICAgfSBlbHNlIGlmICghb3BlbiAmJiB0aGlzLmlzX29wZW4pIHtcbiAgICAgIHRoaXMuI29wZW4ucmVwbGFjZUNoaWxkcmVuKG1hdGVyaWFsX3VuZm9sZF9tb3JlX3JvdW5kZWQoKSk7XG4gICAgICBib3guY2xvc2VfbWVudSgpO1xuICAgIH1cbiAgICB0aGlzLmlzX29wZW4gPSBvcGVuO1xuICB9XG5cbiAgLyoqQ2hhbmdlcyB0aGUgaWNvbiBvZiB0aGUgYnV0dG9uKi9cbiAgc2V0ICNzZXRfaWNvbihpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGljb24pIHtcbiAgICAgIGNvbnN0IGkgPSBpY29uKCk7XG4gICAgICBpZiAodGhpcy4jaWNvbikgdGhpcy5yZXBsYWNlQ2hpbGQoaSwgdGhpcy4jaWNvbik7XG4gICAgICBlbHNlIHRoaXMuaW5zZXJ0QmVmb3JlKGksIHRoaXMuI3RleHQpO1xuICAgICAgdGhpcy4jaWNvbiA9IGk7XG4gICAgfSBlbHNlIGlmICh0aGlzLiNpY29uKSB7XG4gICAgICB0aGlzLnJlbW92ZUNoaWxkKHRoaXMuI2ljb24pO1xuICAgICAgdGhpcy4jaWNvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipTZWxlY3RzIHRoZSBwcmV2aW91cyBvciBuZXh0IHNlbGVjdGlvbiBpbiB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gZGlyIGZhbHNlIGlzIG5leHQgdHJ1ZSBpcyBwcmV2aW91cyovXG4gICNzZWxlY3RfYWRqYWNlbnQoZGlyOiBib29sZWFuKSB7XG4gICAgY29uc3QgeSA9IE1hdGgubWluKFxuICAgICAgdGhpcy4jdmFsdWVzLmxlbmd0aCAtIDEsXG4gICAgICBNYXRoLm1heCgwLCBkaXIgPyB0aGlzLiNzZWxlY3RlZCArIDEgOiB0aGlzLiNzZWxlY3RlZCAtIDEpLFxuICAgICk7XG4gICAgaWYgKHkgIT09IHRoaXMuI3NlbGVjdGVkKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLiN2YWx1ZXNbeV0pO1xuICB9XG5cbiAgI2NsZWFyKCkge1xuICAgIHRoaXMuZGVmYXVsdF9pY29uID0gdGhpcy4jZGVmYXVsdF9pY29uXG4gICAgICA/ICh0aGlzLiNzZXRfaWNvbiA9IHRoaXMuI2RlZmF1bHRfaWNvbilcbiAgICAgIDogKHRoaXMuI3NldF9pY29uID0gdW5kZWZpbmVkKTtcbiAgICB0aGlzLiN0ZXh0LnJlcGxhY2VDaGlsZHJlbih0aGlzLiNkZWZhdWx0KTtcbiAgfVxuXG4gIC8qKkNhbGxlZCB3aGVuIFZhbHVlIGlzIGNoYW5nZWQgKi9cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWx1ZTogUlQpIHtcbiAgICBpZiAoIXRoaXMuI21hcC5oYXModmFsdWUpKSB7XG4gICAgICB0aGlzLiNjbGVhcigpO1xuICAgICAgdGhpcy4jc2VsZWN0ZWQgPSAtMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3B0ID0gdGhpcy4jbWFwLmdldCh2YWx1ZSkhO1xuICAgIHRoaXMuI3RleHQuaW5uZXJUZXh0ID0gb3B0LnRleHQ7XG4gICAgdGhpcy4jc2VsZWN0ZWQgPSB0aGlzLiN2YWx1ZXMuaW5kZXhPZih2YWx1ZSk7XG4gICAgaWYgKG9wdC5pY29uKSB0aGlzLiNzZXRfaWNvbiA9IG9wdC5pY29uO1xuICAgIGVsc2UgdGhpcy4jc2V0X2ljb24gPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy4jY2xlYXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgd2FybihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHN1cGVyLndhcm4obWVzc2FnZSk7XG4gICAgfSwgMCk7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1Ecm9wZG93bik7XG5cbi8qKkNyZWF0ZXMgYSBkcm9wZG93biBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2Ryb3Bkb3duPFJULCBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtRHJvcERvd25PcHRpb25zPFJULCBJRD4sXG4pOiBGb3JtRHJvcGRvd248UlQsIElEPiB7XG4gIGNvbnN0IGRyb3AgPSBuZXcgRm9ybURyb3Bkb3duPFJULCBJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmRlZmF1bHQpIGRyb3AuZGVmYXVsdCA9IG9wdGlvbnMuZGVmYXVsdDtcbiAgICBpZiAob3B0aW9ucy5kZWZhdWx0X2ljb24pIGRyb3AuZGVmYXVsdF9pY29uID0gb3B0aW9ucy5kZWZhdWx0X2ljb247XG4gICAgRm9ybVNlbGVjdG9yQmFzZS5hcHBseV9vcHRpb25zKGRyb3AsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBkcm9wO1xufVxuXG4vLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuY2xhc3MgRHJvcERvd25Cb3ggZXh0ZW5kcyBCYXNlIHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJkcm9wZG93bmJveFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjY2xvc2VyOiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICNjb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI3Njcm9sbDogSFRNTERpdkVsZW1lbnQgPSB0aGlzLiNjb250YWluZXIuYXBwZW5kQ2hpbGQoXG4gICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxcbiAgKTtcbiAgI3RhYmxlOiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuI3Njcm9sbC5hcHBlbmRDaGlsZChcbiAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLFxuICApO1xuICAjZHJvcGRvd246IEZvcm1Ecm9wZG93bjxhbnksIGFueT4gfCB1bmRlZmluZWQ7XG4gICNmb2N1c19vdXRfaGFuZGxlciA9IChlOiBGb2N1c0V2ZW50KSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKCFlLnJlbGF0ZWRUYXJnZXQgfHwgIXRoaXMuY29udGFpbnMoZS5yZWxhdGVkVGFyZ2V0IGFzIE5vZGUpKVxuICAgICAgdGhpcy5jbG9zZV9tZW51KCk7XG4gIH07XG4gICN3aW5kb3dfcmVzaXplX2hhbmRsZXIgPSAoKSA9PiB0aGlzLmNsb3NlX21lbnUoKTtcbiAgI2lzX29wZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuI2NvbnRhaW5lci50YWJJbmRleCA9IDA7XG4gICAgdGhpcy4jY29udGFpbmVyLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHRoaXMuY2xvc2VfbWVudSgpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dVcFwiIHx8IChlLnNoaWZ0S2V5ICYmIGUua2V5ID09PSBcIlRhYlwiKSkge1xuICAgICAgICBjb25zdCBlbGVtID1cbiAgICAgICAgICBlLnRhcmdldCA9PT0gdGhpcy4jY29udGFpbmVyXG4gICAgICAgICAgICA/IHRoaXMuI3RhYmxlLmxhc3RFbGVtZW50Q2hpbGRcbiAgICAgICAgICAgIDogKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICBpZiAoZWxlbSkgKGVsZW0gYXMgSFRNTEVsZW1lbnQpLmZvY3VzKCk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBcIkFycm93RG93blwiIHx8IGUua2V5ID09PSBcIlRhYlwiKSB7XG4gICAgICAgIGNvbnN0IGVsZW0gPVxuICAgICAgICAgIGUudGFyZ2V0ID09PSB0aGlzLiNjb250YWluZXJcbiAgICAgICAgICAgID8gdGhpcy4jdGFibGUuZmlyc3RFbGVtZW50Q2hpbGRcbiAgICAgICAgICAgIDogKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgIGlmIChlbGVtKSAoZWxlbSBhcyBIVE1MRWxlbWVudCkuZm9jdXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcblxuICAgIHRoaXMuI2Nsb3NlclxuICAgICAgLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpXG4gICAgICAuYXBwZW5kQ2hpbGQobWF0ZXJpYWxfY2xvc2Vfcm91bmRlZCgpKTtcbiAgICB0aGlzLiNjbG9zZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSkuaW5uZXJIVE1MID0gXCJDbG9zZVwiO1xuICAgIHRoaXMuI2Nsb3Nlci50YWJJbmRleCA9IDA7XG4gICAgdGhpcy4jY2xvc2VyLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuY2xvc2VfbWVudSgpO1xuICAgIH07XG4gICAgdGhpcy4jY2xvc2VyLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiIFwiIHx8IGUua2V5ID09PSBcIkVudGVyXCIpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmNsb3NlX21lbnUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgdGhpcy4jZm9jdXNfb3V0X2hhbmRsZXIsIHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAjc2V0X3ZhbHVlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgLy9AdHMtZXhwZWN0LWVycm9yIENhbGwgcHJpdmF0ZSBtZXRob2QgZnJvbSBzaXN0ZXIgY2xhc3NcbiAgICBpZiAodGhpcy4jZHJvcGRvd24pIHRoaXMuI2Ryb3Bkb3duLnNldF92YWx1ZV9jaGVjayh2YWx1ZSk7XG4gICAgdGhpcy5jbG9zZV9tZW51KCk7XG4gIH1cblxuICBvcGVuX21lbnUoXG4gICAgbWFwOiBNYXA8YW55LCBTZWxPcHRpb25zPixcbiAgICBwYXJlbnQ6IEZvcm1Ecm9wZG93bjxhbnksIGFueT4sXG4gICAgdmFsdWU6IGFueSxcbiAgKSB7XG4gICAgY29uc3QgaW5uZXJfaGVpZ2h0ID0gdGhpcy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Py5pbm5lckhlaWdodCB8fCAwO1xuICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcIm9wZW5cIik7XG4gICAgY29uc3QgYm91bmRzID0gcGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChib3VuZHMueSArIGJvdW5kcy5oZWlnaHQgLyAyIDwgaW5uZXJfaGVpZ2h0IC8gMikge1xuICAgICAgY29uc3QgdG9wID0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0O1xuICAgICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLnRvcCA9IHRvcCArIFwicHhcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5ib3R0b20gPSBcIlwiO1xuICAgICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLm1heEhlaWdodCA9IGlubmVyX2hlaWdodCAtIHRvcCAtIDEwICsgXCJweFwiO1xuICAgICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSBcImNvbHVtblwiO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBib3R0b20gPSBpbm5lcl9oZWlnaHQgLSBib3VuZHMueTtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS50b3AgPSBcIlwiO1xuICAgICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLmJvdHRvbSA9IGJvdHRvbSArIFwicHhcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5tYXhIZWlnaHQgPSBpbm5lcl9oZWlnaHQgLSBib3R0b20gLSAxMCArIFwicHhcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5mbGV4RGlyZWN0aW9uID0gXCJjb2x1bW4tcmV2ZXJzZVwiO1xuICAgIH1cbiAgICB0aGlzLiNjb250YWluZXIuc3R5bGUubGVmdCA9IGJvdW5kcy54ICsgXCJweFwiO1xuICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS53aWR0aCA9IGJvdW5kcy53aWR0aCArIFwicHhcIjtcbiAgICB0aGlzLiNkcm9wZG93biA9IHBhcmVudDtcblxuICAgIGlmICh0aGlzLiNzY3JvbGwuc2Nyb2xsSGVpZ2h0ID4gdGhpcy4jc2Nyb2xsLmNsaWVudEhlaWdodClcbiAgICAgIHRoaXMuI3Njcm9sbC5jbGFzc0xpc3QuYWRkKFwic2Nyb2xsXCIpO1xuICAgIGVsc2UgdGhpcy4jc2Nyb2xsLmNsYXNzTGlzdC5yZW1vdmUoXCJzY3JvbGxcIik7XG5cbiAgICBsZXQgZm9jdXM6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkIGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgIHRoaXMuI3RhYmxlLnJlcGxhY2VDaGlsZHJlbihcbiAgICAgIC4uLkFycmF5LmZyb20obWFwKS5tYXAoKFt2YWwsIG9wdF0pID0+IHtcbiAgICAgICAgY29uc3QgbGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGNvbnN0IGljb24gPSBsaW5lLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgICAgICBpZiAob3B0Lmljb24pIGljb24uYXBwZW5kQ2hpbGQob3B0Lmljb24oKSk7XG4gICAgICAgIGNvbnN0IHRleHQgPSBsaW5lLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgICAgICB0ZXh0LnRleHRDb250ZW50ID0gb3B0LnRleHQ7XG4gICAgICAgIGxpbmUub25wb2ludGVydXAgPSAoZSkgPT4ge1xuICAgICAgICAgIGlmIChlLnBvaW50ZXJUeXBlICE9PSBcInRvdWNoXCIpIHRoaXMuI3NldF92YWx1ZSh2YWwpO1xuICAgICAgICB9O1xuICAgICAgICBsaW5lLm9uY2xpY2sgPSAoKSA9PiB0aGlzLiNzZXRfdmFsdWUodmFsKTtcbiAgICAgICAgbGluZS50YWJJbmRleCA9IDA7XG4gICAgICAgIGxpbmUub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgICAgICBpZiAoZS5rZXkgPT09IFwiIFwiIHx8IGUua2V5ID09PSBcIkVudGVyXCIpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuI3NldF92YWx1ZSh2YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHZhbCA9PT0gdmFsdWUpIGZvY3VzID0gbGluZTtcbiAgICAgICAgcmV0dXJuIGxpbmU7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy9TaG93IGNsb3NlciBvciBub3RcbiAgICBjb25zdCBib3ggPSB0aGlzLiNzY3JvbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgYm94X2FyZWEgPSBib3gud2lkdGggKiBib3guaGVpZ2h0O1xuICAgIGNvbnN0IGh0bWwgPSB0aGlzLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIGNvbnN0IGh0bWxfYXJlYSA9IGh0bWwuY2xpZW50V2lkdGggKiBodG1sLmNsaWVudEhlaWdodDtcbiAgICBpZiAoYm94X2FyZWEgPiBodG1sX2FyZWEgKiAwLjUpIHtcbiAgICAgIHRoaXMuI3RhYmxlLnByZXBlbmQodGhpcy4jY2xvc2VyKTtcbiAgICB9XG5cbiAgICBpZiAoZm9jdXMpIHtcbiAgICAgIGZvY3VzLmZvY3VzKCk7XG4gICAgICBmb2N1cy5jbGFzc0xpc3QuYWRkKFwic2VsZWN0ZWRcIik7XG4gICAgfSBlbHNlIHRoaXMuI2NvbnRhaW5lci5mb2N1cygpO1xuXG4gICAgdGhpcy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Py5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgXCJyZXNpemVcIixcbiAgICAgIHRoaXMuI3dpbmRvd19yZXNpemVfaGFuZGxlcixcbiAgICAgIHsgcGFzc2l2ZTogdHJ1ZSB9LFxuICAgICk7XG4gICAgdGhpcy4jaXNfb3BlbiA9IHRydWU7XG4gIH1cblxuICBjbG9zZV9tZW51KCkge1xuICAgIGlmICghdGhpcy4jaXNfb3BlbikgcmV0dXJuO1xuICAgIHRoaXMuI2lzX29wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXCJvcGVuXCIpO1xuICAgIHRoaXMuI3RhYmxlLnJlcGxhY2VDaGlsZHJlbigpO1xuICAgIGlmICh0aGlzLiNkcm9wZG93bikge1xuICAgICAgdGhpcy4jZHJvcGRvd24uZm9jdXMoKTtcbiAgICAgIC8vQHRzLWV4cGVjdC1lcnJvciBPdmVyd3JpdGUgcHJpdmF0ZSBwcm9wZXJ0eSBmcm9tIHNpc3RlciBjbGFzc1xuICAgICAgdGhpcy4jZHJvcGRvd24uaXNfb3BlbiA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICBcInJlc2l6ZVwiLFxuICAgICAgdGhpcy4jd2luZG93X3Jlc2l6ZV9oYW5kbGVyLFxuICAgICk7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KERyb3BEb3duQm94KTtcbmNvbnN0IGJveCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChuZXcgRHJvcERvd25Cb3goKSk7XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7XG4gIEZvcm1TZWxlY3RvckJhc2UsXG4gIHR5cGUgRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnMsXG4gIHR5cGUgRm9ybVNlbGVjdG9yT3B0aW9uLFxufSBmcm9tIFwiLi4vc2VsZWN0b3JfYmFzZVwiO1xuaW1wb3J0IFwiLi90b2dnbGVfYnV0dG9uLnNjc3NcIjtcblxuaW50ZXJmYWNlIFNlbE9wdGlvbnMge1xuICB0b3A6IEhUTUxEaXZFbGVtZW50O1xuICBib3Q6IEhUTUxEaXZFbGVtZW50O1xufVxuXG4vKipUb2dnbGUgYnV0dG9ucywgZGlzcGxheXMgYWxsIG9wdGlvbnMgaW4gYSBtdWx0aSB0b2dnbGVyKi9cbmV4cG9ydCBjbGFzcyBGb3JtVG9nZ2xlQnV0dG9uPFxuICBSVCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVNlbGVjdG9yQmFzZTxSVCwgSUQ+IHtcbiAgLyoqUmV0dXJucyB0aGUgbmFtZSB1c2VkIHRvIGRlZmluZSB0aGUgZWxlbWVudCovXG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwidG9nZ2xlYnV0dG9uXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNtYXA6IE1hcDxSVCwgU2VsT3B0aW9ucz4gPSBuZXcgTWFwKCk7XG4gICN2YWx1ZXM6IFJUW10gPSBbXTtcbiAgI3NlbGVjdGVkOiBudW1iZXIgPSAtMTtcblxuICBzZXQgc2VsZWN0aW9ucyhzZWxlY3Rpb25zOiBGb3JtU2VsZWN0b3JPcHRpb248UlQ+W10gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodGhpcy4jbWFwLnNpemUgPiAwKSB7XG4gICAgICB0aGlzLiNtYXAuY2xlYXIoKTtcbiAgICAgIHRoaXMuI3ZhbHVlcyA9IFtdO1xuICAgICAgdGhpcy4jc2VsZWN0ZWQgPSAtMTtcbiAgICAgIHRoaXMucmVwbGFjZUNoaWxkcmVuKCk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBzZWxlY3Rpb25zICYmIGkgPCBzZWxlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSBzZWxlY3Rpb25zW2ldO1xuICAgICAgdGhpcy4jbWFwLnNldCh2YWx1ZSwgdGhpcy4jYWRkX3NlbGVjdGlvbihzZWxlY3Rpb25zW2ldKSk7XG4gICAgICB0aGlzLiN2YWx1ZXMucHVzaChzZWxlY3Rpb25zW2ldLnZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgfVxuXG4gICNhZGRfc2VsZWN0aW9uKHNlbGVjdGlvbjogRm9ybVNlbGVjdG9yT3B0aW9uPFJUPikge1xuICAgIGNvbnN0IHRvcCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICAgdG9wLnRhYkluZGV4ID0gMDtcbiAgICBjb25zdCBib3QgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgIGlmIChzZWxlY3Rpb24uaWNvbikge1xuICAgICAgdG9wLmFwcGVuZENoaWxkKHNlbGVjdGlvbi5pY29uKCkpO1xuICAgICAgYm90LnRleHRDb250ZW50ID0gc2VsZWN0aW9uLnRleHQ7XG4gICAgfSBlbHNlIHRvcC50ZXh0Q29udGVudCA9IHNlbGVjdGlvbi50ZXh0O1xuICAgIGNvbnN0IGNsaWNrID0gKCkgPT4ge1xuICAgICAgdG9wLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayhzZWxlY3Rpb24udmFsdWUpO1xuICAgIH07XG4gICAgdG9wLm9uY2xpY2sgPSBjbGljaztcbiAgICBib3Qub25jbGljayA9IGNsaWNrO1xuICAgIHRvcC5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIiBcIiB8fCBlLmtleSA9PT0gXCJFbnRlclwiKSBjbGljaygpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dSaWdodFwiKSB0aGlzLiNzZWxlY3RfYWRqYWNlbnQodHJ1ZSk7XG4gICAgICBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0xlZnRcIikgdGhpcy4jc2VsZWN0X2FkamFjZW50KGZhbHNlKTtcbiAgICAgIGVsc2UgcmV0dXJuO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuICAgIHJldHVybiB7IHRvcCwgYm90IH07XG4gIH1cblxuICAvKipTZWxlY3RzIHRoZSBwcmV2aW91cyBvciBuZXh0IHNlbGVjdGlvbiBpbiB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gZGlyIGZhbHNlIGlzIG5leHQgdHJ1ZSBpcyBwcmV2aW91cyovXG4gICNzZWxlY3RfYWRqYWNlbnQoZGlyOiBib29sZWFuKSB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy4jbWFwLmdldCh0aGlzLiN2YWx1ZXNbdGhpcy4jc2VsZWN0ZWRdKTtcbiAgICBpZiAoc2VsKSBzZWwudG9wLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgY29uc3QgeSA9IE1hdGgubWluKFxuICAgICAgdGhpcy4jdmFsdWVzLmxlbmd0aCAtIDEsXG4gICAgICBNYXRoLm1heCgwLCBkaXIgPyB0aGlzLiNzZWxlY3RlZCArIDEgOiB0aGlzLiNzZWxlY3RlZCAtIDEpLFxuICAgICk7XG4gICAgaWYgKHkgIT09IHRoaXMuI3NlbGVjdGVkKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLiN2YWx1ZXNbeV0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWx1ZTogUlQpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2ID0gdGhpcy4jbWFwLmdldCh0aGlzLiN2YWx1ZXNbdGhpcy4jc2VsZWN0ZWRdKTtcbiAgICBpZiAocHJldikge1xuICAgICAgcHJldi50b3AuY2xhc3NMaXN0LnJlbW92ZShcInNlbGVjdGVkXCIpO1xuICAgICAgcHJldi5ib3QuY2xhc3NMaXN0LnJlbW92ZShcInNlbGVjdGVkXCIpO1xuICAgIH1cbiAgICBjb25zdCBvcHQgPSB0aGlzLiNtYXAuZ2V0KHZhbHVlKSE7XG4gICAgaWYgKG9wdCkge1xuICAgICAgb3B0LnRvcC5jbGFzc0xpc3QuYWRkKFwic2VsZWN0ZWRcIik7XG4gICAgICBvcHQuYm90LmNsYXNzTGlzdC5hZGQoXCJzZWxlY3RlZFwiKTtcbiAgICAgIHRoaXMuI3NlbGVjdGVkID0gdGhpcy4jdmFsdWVzLmluZGV4T2YodmFsdWUpO1xuICAgICAgaWYgKHRoaXMuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgb3B0LnRvcC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2ID0gdGhpcy4jbWFwLmdldCh0aGlzLiN2YWx1ZXNbdGhpcy4jc2VsZWN0ZWRdKTtcbiAgICBpZiAocHJldikge1xuICAgICAgcHJldi50b3AuY2xhc3NMaXN0LnJlbW92ZShcInNlbGVjdGVkXCIpO1xuICAgICAgcHJldi5ib3QuY2xhc3NMaXN0LnJlbW92ZShcInNlbGVjdGVkXCIpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtVG9nZ2xlQnV0dG9uKTtcblxuLyoqQ3JlYXRlcyBhIHRvZ2dsZSBidXR0b24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV90b2dnbGVfYnV0dG9uPFJULCBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtU2VsZWN0b3JCYXNlT3B0aW9uczxSVCwgSUQ+LFxuKTogRm9ybVRvZ2dsZUJ1dHRvbjxSVCwgSUQ+IHtcbiAgY29uc3QgdG9nZyA9IG5ldyBGb3JtVG9nZ2xlQnV0dG9uPFJULCBJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykgRm9ybVNlbGVjdG9yQmFzZS5hcHBseV9vcHRpb25zKHRvZ2csIG9wdGlvbnMpO1xuICByZXR1cm4gdG9nZztcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnQgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi4vc2hhcmVkXCI7XG5pbXBvcnQgXCIuL3NwYWNlci5zY3NzXCI7XG5cbmludGVyZmFjZSBGb3JtU3BhY2VyT3B0aW9ucyB7XG4gIC8qKlNwYWNpbmcgYW1vdW50ICAqL1xuICBzcGFjZT86IG51bWJlcjtcbn1cblxuY2xhc3MgRm9ybVNwYWNlciBleHRlbmRzIEZvcm1FbGVtZW50IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJzcGFjZXJcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlNldHMgdGhlIGFtb3VudCBvZiBzcGFjZSwgaW4gcmVtICovXG4gIHNldCBzcGFjZShzcGFjZTogbnVtYmVyKSB7XG4gICAgdGhpcy5zdHlsZS5oZWlnaHQgPSBgJHtzcGFjZX1yZW1gO1xuICB9XG4gIGdldCBzcGFjZSgpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdCh0aGlzLnN0eWxlLmhlaWdodCk7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1TcGFjZXIpO1xuXG4vKipDcmVhdGVzIGEgc3BhY2VyIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fc3BhY2VyKG9wdGlvbnM/OiBGb3JtU3BhY2VyT3B0aW9ucyk6IEZvcm1TcGFjZXIge1xuICBjb25zdCBzcGFjZXIgPSBuZXcgRm9ybVNwYWNlcigpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnNwYWNlKSBzcGFjZXIuc3BhY2UgPSBvcHRpb25zLnNwYWNlO1xuICB9XG4gIHJldHVybiBzcGFjZXI7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB0eXBlIHsgT3B0aW9uIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgeyBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vY29sb3JfaW5wdXQuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Db2xvcklucHV0T3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFJUID0gc3RyaW5nLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8UlQsIElEPiB7XG4gIC8qKldoZXRoZXIgdGhlIGNvbG9yIGlucHV0IHNob3VsZCB1cGRhdGUgbGl2ZSovXG4gIGxpdmU/OiBib29sZWFuO1xufVxuXG5jbGFzcyBGb3JtQ29sb3JJbnB1dDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4gZXh0ZW5kcyBGb3JtVmFsdWVXcml0ZTxcbiAgc3RyaW5nLFxuICBJRFxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiY29sb3JpbnB1dFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjbGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMud2Fybl9pbnB1dC50eXBlID0gXCJjb2xvclwiO1xuICAgIHRoaXMud2Fybl9pbnB1dC5vbmlucHV0ID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuI2xpdmUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMud2Fybl9pbnB1dC52YWx1ZSk7XG4gICAgfTtcbiAgICB0aGlzLndhcm5faW5wdXQub25jaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuI2xpdmUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMud2Fybl9pbnB1dC52YWx1ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHNldCBsaXZlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuI2xpdmUgPSB2YWw7XG4gIH1cbiAgZ2V0IGxpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2xpdmU7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy53YXJuX2lucHV0LnZhbHVlID0gdmFsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZSA9IFwiIzAwMDAwMFwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihfdmFsOiBzdHJpbmcpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChfcmVsYXRlZDogT3B0aW9uPHt9Pik6IHZvaWQge31cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1Db2xvcklucHV0KTtcblxuLyoqQ3JlYXRlcyBhIGNvbG9yIGlucHV0IGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fY29sb3JfaW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybUNvbG9ySW5wdXRPcHRpb25zPElELCBzdHJpbmc+LFxuKTogRm9ybUNvbG9ySW5wdXQ8SUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgRm9ybUNvbG9ySW5wdXQ8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5saXZlKSBpbnB1dC5saXZlID0gb3B0aW9ucy5saXZlO1xuICAgIEZvcm1WYWx1ZVdyaXRlLmFwcGx5X29wdGlvbnMoaW5wdXQsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBpbnB1dDtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHtcbiAgbWF0ZXJpYWxfY2FsZW5kYXJfbW9udGhfcm91bmRlZCxcbiAgbWF0ZXJpYWxfc2NoZWR1bGVfcm91bmRlZCxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItaWNvbnNcIjtcbmltcG9ydCB0eXBlIHsgT3B0aW9uIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgeyBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vZGF0ZV90aW1lX2lucHV0LnNjc3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBEYXRlVGltZUlucHV0T3B0aW9uczxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8UlQsIElEPiB7XG4gIC8qKlR5cGUgb2YgZGF0ZSB0aW1lKi9cbiAgdHlwZT86IEZvcm1EYXRlVGltZVR5cGU7XG59XG5cbmV4cG9ydCBjb25zdCBGb3JtRGF0ZVRpbWVUeXBlID0ge1xuICBEQVRFOiBcImRhdGVcIixcbiAgVElNRTogXCJ0aW1lXCIsXG4gIERBVEVUSU1FOiBcImRhdGV0aW1lXCIsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgRm9ybURhdGVUaW1lVHlwZSA9XG4gICh0eXBlb2YgRm9ybURhdGVUaW1lVHlwZSlba2V5b2YgdHlwZW9mIEZvcm1EYXRlVGltZVR5cGVdO1xuXG5jb25zdCBEYXRlVGltZU1vZGUgPSB7XG4gIERBVEU6IFwiZGF0ZVwiLFxuICBTVFJJTkc6IFwic3RyaW5nXCIsXG4gIE5VTUJFUjogXCJudW1iZXJcIixcbn0gYXMgY29uc3Q7XG5cbmNsYXNzIEZvcm1EYXRlVGltZUlucHV0PFxuICBSVCBleHRlbmRzIERhdGUgfCBzdHJpbmcgfCBudW1iZXIsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFJULCBJRD4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcImRhdGV0aW1laW5wdXRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI3R5cGU6IEZvcm1EYXRlVGltZVR5cGUgPSBGb3JtRGF0ZVRpbWVUeXBlLkRBVEVUSU1FO1xuICAjbW9kZTogc3RyaW5nID0gRGF0ZVRpbWVNb2RlLkRBVEU7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwiZGF0ZXRpbWUtbG9jYWxcIjtcbiAgICB0aGlzLndhcm5faW5wdXQubGFuZyA9IFwiZGEtREtcIjtcbiAgICB0aGlzLndhcm5faW5wdXQuc3RlcCA9IFwiMC4xXCI7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQobWF0ZXJpYWxfY2FsZW5kYXJfbW9udGhfcm91bmRlZCgpKS5vbmNsaWNrID0gKCkgPT5cbiAgICAgIHRoaXMud2Fybl9pbnB1dC5zaG93UGlja2VyKCk7XG4gICAgdGhpcy5hcHBlbmRDaGlsZChtYXRlcmlhbF9zY2hlZHVsZV9yb3VuZGVkKCkpLm9uY2xpY2sgPSAoKSA9PlxuICAgICAgdGhpcy53YXJuX2lucHV0LnNob3dQaWNrZXIoKTtcbiAgICB0aGlzLndhcm5faW5wdXQub25jaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy53YXJuX2lucHV0LnZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLiNtb2RlID09PSBEYXRlVGltZU1vZGUuREFURSlcbiAgICAgICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayhuZXcgRGF0ZSh0aGlzLndhcm5faW5wdXQudmFsdWVBc051bWJlcikgYXMgUlQpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLiNtb2RlID09PSBEYXRlVGltZU1vZGUuU1RSSU5HKVxuICAgICAgICAgIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMud2Fybl9pbnB1dC52YWx1ZSBhcyBSVCk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuI21vZGUgPT09IERhdGVUaW1lTW9kZS5OVU1CRVIpXG4gICAgICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy53YXJuX2lucHV0LnZhbHVlQXNOdW1iZXIgYXMgUlQpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipSZXR1cm5zIHRoZSBkYXRlIHRpbWUgdHlwZSovXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiB0aGlzLiN0eXBlO1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgZGF0ZSB0aW1lIHR5cGUqL1xuICBzZXQgdHlwZSh0eXBlOiBGb3JtRGF0ZVRpbWVUeXBlKSB7XG4gICAgaWYgKHR5cGUgPT09IEZvcm1EYXRlVGltZVR5cGUuREFURSkgdGhpcy53YXJuX2lucHV0LnR5cGUgPSBcImRhdGVcIjtcbiAgICBpZiAodHlwZSA9PT0gRm9ybURhdGVUaW1lVHlwZS5USU1FKSB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwidGltZVwiO1xuICAgIGlmICh0eXBlID09PSBGb3JtRGF0ZVRpbWVUeXBlLkRBVEVUSU1FKVxuICAgICAgdGhpcy53YXJuX2lucHV0LnR5cGUgPSBcImRhdGV0aW1lLWxvY2FsXCI7XG4gICAgdGhpcy4jdHlwZSA9IHR5cGU7XG4gIH1cblxuICAvKipSZXR1cm5zIHRoZSBkYXRlIHRpbWUgdHlwZSovXG4gIGdldCBzdGVwKCkge1xuICAgIHJldHVybiBOdW1iZXIodGhpcy53YXJuX2lucHV0LnN0ZXApO1xuICB9XG4gIC8qKlNldHMgdGhlIGRhdGUgdGltZSB0eXBlKi9cbiAgc2V0IHN0ZXAoc3RlcDogbnVtYmVyKSB7XG4gICAgdGhpcy53YXJuX2lucHV0LnN0ZXAgPSBTdHJpbmcoc3RlcCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbHVlOiBSVCk6IHZvaWQge1xuICAgIGlmICghdGhpcy4jbW9kZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgdGhpcy4jbW9kZSA9IERhdGVUaW1lTW9kZS5OVU1CRVI7XG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHRoaXMuI21vZGUgPSBEYXRlVGltZU1vZGUuU1RSSU5HO1xuICAgICAgZWxzZSB0aGlzLiNtb2RlID0gRGF0ZVRpbWVNb2RlLkRBVEU7XG4gICAgfVxuICAgIGxldCB0aW1lOiBudW1iZXI7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgdGltZSA9IHZhbHVlO1xuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgdGltZSA9IG5ldyBEYXRlKHZhbHVlKS5nZXRUaW1lKCk7XG4gICAgZWxzZSB0aW1lID0gdmFsdWUuZ2V0VGltZSgpO1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZUFzTnVtYmVyID0gdGltZTtcbiAgfVxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy53YXJuX2lucHV0LnZhbHVlID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtRGF0ZVRpbWVJbnB1dCk7XG5cbi8qKkNyZWF0ZXMgYSBjb2xvciBpbnB1dCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2RhdGVfdGltZV9pbnB1dDxcbiAgUlQgZXh0ZW5kcyBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4ob3B0aW9ucz86IERhdGVUaW1lSW5wdXRPcHRpb25zPFJULCBJRD4pOiBGb3JtRGF0ZVRpbWVJbnB1dDxSVCwgSUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgRm9ybURhdGVUaW1lSW5wdXQ8UlQsIElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMudHlwZSkgaW5wdXQudHlwZSA9IG9wdGlvbnMudHlwZTtcbiAgICBGb3JtVmFsdWVXcml0ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7XG4gIGdldF9jdXJzb3JfcG9zaXRpb24sXG4gIElQQWRkcmVzcyxcbiAgSVBWZXJzaW9uLFxuICBzZXRfY3Vyc29yX2VuZCxcbiAgc2V0X3NlbGVjdGlvbl9hbGwsXG4gIHNsZWVwLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1jb21tb25cIjtcbmltcG9ydCB0eXBlIHsgT3B0aW9uIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgeyBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vaXBfaW5wdXQuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElwSW5wdXRPcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPElQQWRkcmVzcywgSUQ+IHtcbiAgLyoqSXAgYWRkcmVzcyB0eXBlLCB0aGlzIGlzIG92ZXJ3cml0dGVuIGlmIHN1cHBsaWVkIHdpdGggYW4gaXBhZGRyZXNzIHdpdGggYSBkaWZmZXJlbnQgdHlwZSovXG4gIHR5cGU6IElQVmVyc2lvbjtcbn1cblxuY2xhc3MgRm9ybUlwSW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIElQQWRkcmVzcyxcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcImlwaW5wdXRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI3R5cGU6IElQVmVyc2lvbjtcbiAgI3BhcnRzOiBIVE1MRGl2RWxlbWVudFtdID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogOCB9LCAoXywgaSkgPT4ge1xuICAgIGNvbnN0IGlucCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICAgaWYgKGkgPCA3KSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgICBpbnAuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgaW5wLm9uYmVmb3JlaW5wdXQgPSBhc3luYyAoZXYpID0+IHtcbiAgICAgIGlmIChldi5pbnB1dFR5cGUgPT09IFwiaW5zZXJ0UGFyYWdyYXBoXCIpIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvL0JhY2tzcGFjZVxuICAgICAgZWxzZSBpZiAoZXYuaW5wdXRUeXBlID09PSBcImRlbGV0ZUNvbnRlbnRCYWNrd2FyZFwiKSB7XG4gICAgICAgIGlmIChpbnAudGV4dENvbnRlbnQubGVuZ3RoID09PSAwICYmIGkgPiAwKSB7XG4gICAgICAgICAgc2V0X2N1cnNvcl9lbmQoaW5wLnByZXZpb3VzRWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIERlbGV0ZVxuICAgICAgfSBlbHNlIGlmIChldi5pbnB1dFR5cGUgPT09IFwiZGVsZXRlQ29udGVudEZvcndhcmRcIikge1xuICAgICAgICBpZiAoaW5wLnRleHRDb250ZW50Lmxlbmd0aCA9PT0gMCAmJiBpIDwgbGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGF3YWl0IHNsZWVwKDApO1xuICAgICAgICAgIChpbnAubmV4dEVsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50KT8uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChldi5kYXRhKSB7XG4gICAgICAgIC8vQ2hlY2sgZm9yIC4gb3IgOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgKGV2LmRhdGEgPT09IFwiLlwiIHx8IGV2LmRhdGEgPT09IFwiOlwiIHx8IGV2LmRhdGEgPT09IFwiLFwiKSAmJlxuICAgICAgICAgIGkgPCBsZW5ndGggLSAxXG4gICAgICAgICkge1xuICAgICAgICAgIHNldF9zZWxlY3Rpb25fYWxsKGlucC5uZXh0RWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgLy9DaGVjayBmb3IgdmFsaWQgY2hhcmFjdGVyc1xuICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAhZXYuZGF0YS5tYXRjaChcbiAgICAgICAgICAgIHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNCA/IC9eW1xcZF0qJC8gOiAvXltcXGRBLUZhLWZdKiQvLFxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIC8vUHJldmVudCB0b28gbG9uZyB2YWx1ZXNcbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgaW5wLnRleHRDb250ZW50Lmxlbmd0aCA+PSAodGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0ID8gMyA6IDQpXG4gICAgICAgICkge1xuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgLy9QcmV2ZW50IHRvbyBiaWcgdmFsdWVzXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcG9zID0gZ2V0X2N1cnNvcl9wb3NpdGlvbihpbnApO1xuICAgICAgICAgIGNvbnN0IHBvdGVudGlhbCA9XG4gICAgICAgICAgICBpbnAudGV4dENvbnRlbnQuc2xpY2UoMCwgcG9zKSArXG4gICAgICAgICAgICBldi5kYXRhICtcbiAgICAgICAgICAgIGlucC50ZXh0Q29udGVudC5zbGljZShwb3MpO1xuICAgICAgICAgIGNvbnN0IG51bSA9XG4gICAgICAgICAgICB0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjRcbiAgICAgICAgICAgICAgPyBwYXJzZUludChwb3RlbnRpYWwsIDEwKVxuICAgICAgICAgICAgICA6IHBhcnNlSW50KHBvdGVudGlhbCwgMTYpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICh0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjQgJiYgbnVtID4gMjU1KSB8fFxuICAgICAgICAgICAgKHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNiAmJiBudW0gPiA2NTUzNSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChpIDwgdGhpcy4jcGFydHMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgc2V0X3NlbGVjdGlvbl9hbGwoaW5wLm5leHRFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICBlbHNlIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBpbnAub25pbnB1dCA9ICgpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaW5wLnRleHRDb250ZW50Lmxlbmd0aCA9PT0gKHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNCA/IDMgOiA0KSAmJlxuICAgICAgICBnZXRfY3Vyc29yX3Bvc2l0aW9uKGlucCkgPT09IGlucC50ZXh0Q29udGVudC5sZW5ndGggJiZcbiAgICAgICAgaSA8IHRoaXMuI3BhcnRzLmxlbmd0aCAtIDFcbiAgICAgICkge1xuICAgICAgICBzZXRfc2VsZWN0aW9uX2FsbChpbnAubmV4dEVsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlucC5vbmtleWRvd24gPSBhc3luYyAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkFycm93VXBcIikge1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0Rvd25cIikge1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0xlZnRcIiAmJiBpID4gMCkge1xuICAgICAgICBpZiAoZ2V0X2N1cnNvcl9wb3NpdGlvbihpbnApID09PSAwIHx8IGlucC50ZXh0Q29udGVudC5sZW5ndGggPT09IDApXG4gICAgICAgICAgc2V0X2N1cnNvcl9lbmQoaW5wLnByZXZpb3VzRWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICBlbHNlIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dSaWdodFwiICYmIGkgPCB0aGlzLiNwYXJ0cy5sZW5ndGggLSAxKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBnZXRfY3Vyc29yX3Bvc2l0aW9uKGlucCkgPT09IGlucC50ZXh0Q29udGVudC5sZW5ndGggfHxcbiAgICAgICAgICBpbnAudGV4dENvbnRlbnQubGVuZ3RoID09PSAwXG4gICAgICAgIClcbiAgICAgICAgICAoaW5wLm5leHRFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudCk/LmZvY3VzKCk7XG4gICAgICAgIGVsc2UgcmV0dXJuO1xuICAgICAgfSBlbHNlIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgICByZXR1cm4gaW5wO1xuICB9KTtcblxuICBjb25zdHJ1Y3Rvcih0eXBlOiBJUFZlcnNpb24sIGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLiN0eXBlID0gdHlwZTtcbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgdGhpcy5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmICghdGhpcy4jcGFydHMuaW5jbHVkZXMoZS50YXJnZXQgYXMgSFRNTERpdkVsZW1lbnQpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2V0X2N1cnNvcl9lbmQodGhpcy4jcGFydHNbdGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0ID8gMyA6IDddKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub25kYmxjbGljayA9IChlKSA9PiB7XG4gICAgICBpZiAoZS50YXJnZXQgIT09IHRoaXMpIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNldF9zZWxlY3Rpb25fYWxsKHRoaXMuI3BhcnRzWzBdKTtcbiAgICB9O1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c291dFwiLCAoZSkgPT4ge1xuICAgICAgaWYgKGUucmVsYXRlZFRhcmdldCAmJiB0aGlzLmNvbnRhaW5zKGUucmVsYXRlZFRhcmdldCBhcyBOb2RlKSkgcmV0dXJuO1xuICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy52YWx1ZV9hc19pcCk7XG4gICAgfSk7XG4gICAgdGhpcy5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkVudGVyXCIpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMudmFsdWVfYXNfaXApO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGVsc2UgdGhpcy5jbGVhcl92YWx1ZSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5vbmNvcHkgPSAoZSkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5jbGlwYm9hcmREYXRhPy5zZXREYXRhKFwidGV4dC9wbGFpblwiLCB0aGlzLnZhbHVlX2FzX2lwLnRvX3N0cmluZygpKTtcbiAgICB9O1xuICAgIHRoaXMub25wYXN0ZSA9IChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBwYXN0ZSA9IGUuY2xpcGJvYXJkRGF0YT8uZ2V0RGF0YShcInRleHQvcGxhaW5cIikgfHwgXCJcIjtcbiAgICAgIGNvbnN0IG5ld19pcCA9IG5ldyBJUEFkZHJlc3MocGFzdGUpO1xuICAgICAgaWYgKG5ld19pcC52ZXJzaW9uICE9PSB0aGlzLiN0eXBlKSByZXR1cm47XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayhuZXdfaXApO1xuICAgIH07XG4gIH1cblxuICBnZXQgdmFsdWVfYXNfaXAoKTogSVBBZGRyZXNzIHtcbiAgICByZXR1cm4gbmV3IElQQWRkcmVzcyhcbiAgICAgIHRoaXMuI3BhcnRzXG4gICAgICAgIC5zbGljZSgwLCB0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjQgPyA0IDogOClcbiAgICAgICAgLnJlZHVjZSgoYWNjLCBwYXJ0LCBpKSA9PiB7XG4gICAgICAgICAgYWNjICs9IHBhcnQuaW5uZXJUZXh0O1xuICAgICAgICAgIGlmIChpIDwgKHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNCA/IDQgOiA4KSAtIDEpXG4gICAgICAgICAgICBhY2MgKz0gdGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0ID8gXCIuXCIgOiBcIjpcIjtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCBcIlwiKSxcbiAgICApO1xuICB9XG5cbiAgc2V0IHR5cGUodmFsOiBJUFZlcnNpb24pIHtcbiAgICBpZiAodGhpcy4jdHlwZSA9PT0gdmFsKSByZXR1cm47XG4gICAgdGhpcy4jdHlwZSA9IHZhbDtcbiAgICB0aGlzLmNsYXNzTGlzdC50b2dnbGUoXCJpcHY0XCIsIHZhbCA9PT0gSVBWZXJzaW9uLlY0KTtcbiAgICB0aGlzLmNsYXNzTGlzdC50b2dnbGUoXCJpcHY2XCIsIHZhbCA9PT0gSVBWZXJzaW9uLlY2KTtcbiAgICB0aGlzLnJlcGxhY2VDaGlsZHJlbihcbiAgICAgIC4uLnRoaXMuI3BhcnRzXG4gICAgICAgIC5zbGljZSgwLCB2YWwgPT09IElQVmVyc2lvbi5WNCA/IDQgOiA4KVxuICAgICAgICAuZmxhdE1hcCgodiwgaSkgPT5cbiAgICAgICAgICBpIDwgKHZhbCA9PT0gSVBWZXJzaW9uLlY0ID8gNCA6IDgpIC0gMVxuICAgICAgICAgICAgPyBbdiwgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsID09PSBJUFZlcnNpb24uVjQgPyBcIi5cIiA6IFwiOlwiKV1cbiAgICAgICAgICAgIDogW3ZdLFxuICAgICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbDogSVBBZGRyZXNzKTogdm9pZCB7XG4gICAgdGhpcy50eXBlID0gdmFsLnZlcnNpb247XG4gICAgdmFsLmFzX2FycmF5LmZvckVhY2goKHBhcnQsIGkpID0+IHtcbiAgICAgIHRoaXMuI3BhcnRzW2ldLnRleHRDb250ZW50ID1cbiAgICAgICAgdmFsLnZlcnNpb24gPT09IElQVmVyc2lvbi5WNCA/IHBhcnQudG9TdHJpbmcoKSA6IHBhcnQudG9TdHJpbmcoMTYpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuI3BhcnRzLmZvckVhY2goKHBhcnQpID0+IHtcbiAgICAgIHBhcnQudGV4dENvbnRlbnQgPSBcIlwiO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihfdmFsOiBzdHJpbmcpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChfcmVsYXRlZDogT3B0aW9uPHt9Pik6IHZvaWQge31cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1JcElucHV0KTtcblxuLyoqQ3JlYXRlcyBhIGNvbG9yIGlucHV0IGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1faXBfaW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zOiBJcElucHV0T3B0aW9uczxJRD4sXG4pOiBGb3JtSXBJbnB1dDxJRD4ge1xuICBjb25zdCBpbnB1dCA9IG5ldyBGb3JtSXBJbnB1dDxJRD4ob3B0aW9ucy50eXBlLCBvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgRm9ybVZhbHVlV3JpdGUuYXBwbHlfb3B0aW9ucyhpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHsgRm9ybVZhbHVlLCBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vcGFzc3dvcmRfaW5wdXQuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1QYXNzd29yZElucHV0T3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxzdHJpbmcsIElEPiB7XG4gIC8qKkFsbG93ZWQgY2hhcmFjdGVycyBmb3IgdGhlIHBhc3N3b3JkIGlucHV0ICovXG4gIGZpbHRlcj86IFJlZ0V4cDtcbn1cblxuY2xhc3MgRm9ybVBhc3N3b3JkSW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIHN0cmluZyxcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInBhc3N3b3JkaW5wdXRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI2ZpbHRlcj86IFJlZ0V4cDtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwicGFzc3dvcmRcIjtcbiAgICB0aGlzLndhcm5faW5wdXQub25jaGFuZ2UgPSAoKSA9PiB7XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLndhcm5faW5wdXQudmFsdWUpO1xuICAgIH07XG4gICAgdGhpcy53YXJuX2lucHV0Lm9uYmVmb3JlaW5wdXQgPSAoZXYpID0+IHtcbiAgICAgIGlmIChldi5kYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLiNmaWx0ZXIgJiYgIXRoaXMuI2ZpbHRlci50ZXN0KGV2LmRhdGEpKSB7XG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLndhcm4oXCJJbnZhbGlkIGNoYXJhY3RlciBlbnRlcmVkXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHNldCBmaWx0ZXIodmFsOiBSZWdFeHAgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNmaWx0ZXIgPSB2YWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy53YXJuX2lucHV0LnZhbHVlID0gdmFsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZSA9IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKF9yZWxhdGVkOiBPcHRpb248e30+KTogdm9pZCB7fVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybVBhc3N3b3JkSW5wdXQpO1xuXG4vKipDcmVhdGVzIGEgZHJvcGRvd24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9wYXNzd29yZF9pbnB1dDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtUGFzc3dvcmRJbnB1dE9wdGlvbnM8SUQ+LFxuKTogRm9ybVBhc3N3b3JkSW5wdXQ8SUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgRm9ybVBhc3N3b3JkSW5wdXQ8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5maWx0ZXIpIGlucHV0LmZpbHRlciA9IG9wdGlvbnMuZmlsdGVyO1xuICAgIEZvcm1WYWx1ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IHNldF9jdXJzb3JfZW5kLCBzeW5jX3Jlc29sdmUgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1jb21tb25cIjtcbmltcG9ydCB7IGVyciwgbm9uZSwgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU3RhdGVTdHJpbmdSZWxhdGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RhdGVcIjtcbmltcG9ydCB7IHN0cmluZ19ieXRlX2xlbmd0aCwgc3RyaW5nX2J5dGVfbGltaXQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdHJpbmdcIjtcbmltcG9ydCB7IEZvcm1WYWx1ZVdyaXRlLCB0eXBlIEZvcm1WYWx1ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi90ZXh0X2lucHV0LnNjc3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtVGV4dElucHV0T3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFJUID0gc3RyaW5nLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8UlQsIElEPiB7XG4gIC8qKlBsYWNlaG9sZGVyIHRleHQgd2hlbiBpbnB1dCBpcyBlbXB0eSAqL1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgLyoqTWF4aW11bSBsZW5ndGggb2YgdGhlIGlucHV0ICovXG4gIG1heF9sZW5ndGg/OiBudW1iZXI7XG4gIC8qKk1heGltdW0gYnl0ZXMgb2YgdGhlIGlucHV0ICovXG4gIG1heF9ieXRlcz86IG51bWJlcjtcbiAgLyoqQWxsb3dlZCBjaGFyYWN0ZXJzIGZvciB0aGUgdGV4dCBpbnB1dCAqL1xuICBmaWx0ZXI/OiBSZWdFeHA7XG59XG5cbmNsYXNzIEZvcm1UZXh0SW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIHN0cmluZyxcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInRleHRpbnB1dFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjZmlsdGVyPzogUmVnRXhwO1xuICAjbWF4X2xlbmd0aD86IG51bWJlcjtcbiAgI21heF9ieXRlcz86IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMud2Fybl9pbnB1dC50eXBlID0gXCJ0ZXh0XCI7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMud2Fybl9pbnB1dC5vbmNoYW5nZSA9ICgpID0+IHRoaXMuI3NldCgpO1xuICAgIHRoaXMub25iZWZvcmVpbnB1dCA9IChlKSA9PiB7XG4gICAgICB0aGlzLndhcm4oXCJcIik7XG4gICAgICBjb25zdCBkYXRhID0gZS5kYXRhIHx8IGUuZGF0YVRyYW5zZmVyPy5nZXREYXRhKFwidGV4dC9wbGFpblwiKTtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLiNmaWx0ZXIgJiYgIXRoaXMuI2ZpbHRlci50ZXN0KGRhdGEpKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMud2FybihcIkludmFsaWQgY2hhcmFjdGVyIGVudGVyZWRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy4jbWF4X2xlbmd0aCAmJlxuICAgICAgICAgICAgdGhpcy53YXJuX2lucHV0LnZhbHVlLmxlbmd0aCArIGRhdGEubGVuZ3RoID4gdGhpcy4jbWF4X2xlbmd0aFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy53YXJuKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfbGVuZ3RofSBjaGFyYWN0ZXJzIGlzIGFsbG93ZWRgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy4jbWF4X2J5dGVzICYmXG4gICAgICAgICAgICBzdHJpbmdfYnl0ZV9sZW5ndGgodGhpcy53YXJuX2lucHV0LnZhbHVlKSArXG4gICAgICAgICAgICAgIHN0cmluZ19ieXRlX2xlbmd0aChkYXRhKSA+XG4gICAgICAgICAgICAgIHRoaXMuI21heF9ieXRlc1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy53YXJuKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfYnl0ZXN9IGJ5dGVzIGlzIGFsbG93ZWRgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlcikgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICBlbHNlIHRoaXMuY2xlYXJfdmFsdWUoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgI3NldCgpIHtcbiAgICBjb25zdCBidWZmID0gdGhpcy5idWZmZXI7XG4gICAgKGF3YWl0IHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMud2Fybl9pbnB1dC52YWx1ZSB8fCBcIlwiKSkubWFwX2VycigoKSA9PiB7XG4gICAgICB0aGlzLm5ld192YWx1ZShidWZmIHx8IFwiXCIpO1xuICAgICAgc2V0X2N1cnNvcl9lbmQodGhpcy53YXJuX2lucHV0KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldCBmaWx0ZXIodmFsOiBSZWdFeHAgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNmaWx0ZXIgPSB2YWw7XG4gIH1cbiAgZ2V0IGZpbHRlcigpOiBSZWdFeHAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNmaWx0ZXI7XG4gIH1cblxuICBzZXQgcGxhY2Vob2xkZXIodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLndhcm5faW5wdXQucGxhY2Vob2xkZXIgPSB2YWw7XG4gIH1cbiAgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMud2Fybl9pbnB1dC5wbGFjZWhvbGRlcjtcbiAgfVxuXG4gIHNldCBtYXhfbGVuZ3RoKHZhbDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWF4X2xlbmd0aCA9IHZhbDtcbiAgICB0aGlzLndhcm5faW5wdXQubWF4TGVuZ3RoID0gdmFsID8/IC0xO1xuICB9XG4gIGdldCBtYXhfbGVuZ3RoKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI21heF9sZW5ndGg7XG4gIH1cblxuICBzZXQgbWF4X2J5dGVzKHZhbDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWF4X2J5dGVzID0gdmFsO1xuICB9XG4gIGdldCBtYXhfYnl0ZXMoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jbWF4X2J5dGVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZSA9IHZhbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLndhcm5faW5wdXQudmFsdWUgPSBcIlwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihfdmFsOiBzdHJpbmcpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgbGltaXRfdmFsdWUodmFsOiBzdHJpbmcpOiBQcm9taXNlTGlrZTxSZXN1bHQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgaWYgKHRoaXMuI21heF9sZW5ndGggJiYgdmFsLmxlbmd0aCA+IHRoaXMuI21heF9sZW5ndGgpXG4gICAgICB2YWwgPSB2YWwuc2xpY2UoMCwgdGhpcy4jbWF4X2xlbmd0aCk7XG4gICAgaWYgKHRoaXMuI21heF9ieXRlcykgdmFsID0gc3RyaW5nX2J5dGVfbGltaXQodmFsLCB0aGlzLiNtYXhfYnl0ZXMpO1xuICAgIHJldHVybiBzdXBlci5saW1pdF92YWx1ZSh2YWwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrX3ZhbHVlKHZhbDogc3RyaW5nKTogUHJvbWlzZUxpa2U8UmVzdWx0PHN0cmluZywgc3RyaW5nPj4ge1xuICAgIGlmICh0aGlzLiNtYXhfbGVuZ3RoICYmIHZhbC5sZW5ndGggPiB0aGlzLiNtYXhfbGVuZ3RoKVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfbGVuZ3RofSBjaGFyYWN0ZXJzIGlzIGFsbG93ZWRgKSxcbiAgICAgICk7XG4gICAgaWYgKHRoaXMuI21heF9ieXRlcyAmJiBzdHJpbmdfYnl0ZV9sZW5ndGgodmFsKSA+IHRoaXMuI21heF9ieXRlcylcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihgQSBtYXhpbXVtIG9mICR7dGhpcy4jbWF4X2J5dGVzfSBieXRlcyBpcyBhbGxvd2VkYCksXG4gICAgICApO1xuICAgIHJldHVybiBzdXBlci5jaGVja192YWx1ZSh2YWwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQocmVsYXRlZDogUGFydGlhbDxTdGF0ZVN0cmluZ1JlbGF0ZWQ+KTogdm9pZCB7XG4gICAgaWYgKHJlbGF0ZWQubWF4X2xlbmd0aClcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJtYXhfbGVuZ3RoXCIsIHJlbGF0ZWQubWF4X2xlbmd0aCwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcIm1heF9sZW5ndGhcIik7XG4gICAgaWYgKHJlbGF0ZWQubWF4X2xlbmd0aF9ieXRlcylcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJtYXhfYnl0ZXNcIiwgcmVsYXRlZC5tYXhfbGVuZ3RoX2J5dGVzLCAoKSA9PlxuICAgICAgICBub25lKCksXG4gICAgICApO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwibWF4X2J5dGVzXCIpO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtVGV4dElucHV0KTtcblxuLyoqQ3JlYXRlcyBhIHNpbmdsZSBsaW5lIHRleHQgaW5wdXQgZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV90ZXh0X2lucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1UZXh0SW5wdXRPcHRpb25zPElEPixcbik6IEZvcm1UZXh0SW5wdXQ8SUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgRm9ybVRleHRJbnB1dDxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmZpbHRlcikgaW5wdXQuZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgaWYgKG9wdGlvbnMucGxhY2Vob2xkZXIpIGlucHV0LnBsYWNlaG9sZGVyID0gb3B0aW9ucy5wbGFjZWhvbGRlcjtcbiAgICBpZiAob3B0aW9ucy5tYXhfbGVuZ3RoKSBpbnB1dC5tYXhfbGVuZ3RoID0gb3B0aW9ucy5tYXhfbGVuZ3RoO1xuICAgIGlmIChvcHRpb25zLm1heF9ieXRlcykgaW5wdXQubWF4X2J5dGVzID0gb3B0aW9ucy5tYXhfYnl0ZXM7XG4gICAgRm9ybVZhbHVlV3JpdGUuYXBwbHlfb3B0aW9ucyhpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBzZXRfY3Vyc29yX2VuZCwgc3luY19yZXNvbHZlIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29tbW9uXCI7XG5pbXBvcnQgeyBtYXRlcmlhbF9kcmFnX2hhbmRsZV9yb3VuZGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItaWNvbnNcIjtcbmltcG9ydCB7IGVyciwgbm9uZSwgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU3RhdGVTdHJpbmdSZWxhdGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RhdGVcIjtcbmltcG9ydCB7IHN0cmluZ19ieXRlX2xlbmd0aCwgc3RyaW5nX2J5dGVfbGltaXQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdHJpbmdcIjtcbmltcG9ydCB7IEZvcm1WYWx1ZVdyaXRlLCB0eXBlIEZvcm1WYWx1ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi90ZXh0X211bHRpX2xpbmUuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1UZXh0SW5wdXRPcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgUlQgPSBzdHJpbmcsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxSVCwgSUQ+IHtcbiAgLyoqUGxhY2Vob2xkZXIgdGV4dCB3aGVuIGlucHV0IGlzIGVtcHR5ICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKipNYXhpbXVtIGxlbmd0aCBvZiB0aGUgaW5wdXQgKi9cbiAgbWF4X2xlbmd0aD86IG51bWJlcjtcbiAgLyoqTWF4aW11bSBieXRlcyBvZiB0aGUgaW5wdXQgKi9cbiAgbWF4X2J5dGVzPzogbnVtYmVyO1xuICAvKipBbGxvd2VkIGNoYXJhY3RlcnMgZm9yIHRoZSB0ZXh0IGlucHV0ICovXG4gIGZpbHRlcj86IFJlZ0V4cDtcbn1cblxuY2xhc3MgRm9ybVRleHRNdWx0aWxpbmU8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIHN0cmluZyxcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInRleHRtdWx0aWxpbmVcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI2ZpbHRlcj86IFJlZ0V4cDtcbiAgI21heF9sZW5ndGg/OiBudW1iZXI7XG4gICNtYXhfYnl0ZXM/OiBudW1iZXI7XG4gICN2YWx1ZV9ib3g6IEhUTUxUZXh0QXJlYUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKFxuICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKSxcbiAgKTtcbiAgI3Jlc2l6ZXI6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLiNyZXNpemVyLmFwcGVuZENoaWxkKG1hdGVyaWFsX2RyYWdfaGFuZGxlX3JvdW5kZWQoKSk7XG4gICAgdGhpcy4jcmVzaXplci5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuI3ZhbHVlX2JveC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICBjb25zdCBzdGFydF95ID0gZS5jbGllbnRZO1xuICAgICAgdGhpcy4jcmVzaXplci5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICB0aGlzLiNyZXNpemVyLm9ucG9pbnRlcm1vdmUgPSAoZXYpID0+IHtcbiAgICAgICAgY29uc3QgZHkgPSBldi5jbGllbnRZIC0gc3RhcnRfeTtcbiAgICAgICAgdGhpcy4jdmFsdWVfYm94LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodCArIGR5fXB4YDtcbiAgICAgIH07XG4gICAgICB0aGlzLiNyZXNpemVyLm9ucG9pbnRlcnVwID0gKF9ldikgPT4ge1xuICAgICAgICB0aGlzLiNyZXNpemVyLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgIHRoaXMuI3Jlc2l6ZXIub25wb2ludGVybW92ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuI3Jlc2l6ZXIub25wb2ludGVydXAgPSBudWxsO1xuICAgICAgfTtcbiAgICB9O1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkVudGVyXCIgJiYgIWUuc2hpZnRLZXkpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmNoYW5nZSA9ICgpID0+IHRoaXMuI3NldCgpO1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmJlZm9yZWlucHV0ID0gKGUpID0+IHtcbiAgICAgIHRoaXMud2FybihcIlwiKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBlLmRhdGEgfHwgZS5kYXRhVHJhbnNmZXI/LmdldERhdGEoXCJ0ZXh0L3BsYWluXCIpO1xuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMuI2ZpbHRlciAmJiAhdGhpcy4jZmlsdGVyLnRlc3QoZGF0YSkpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy53YXJuKFwiSW52YWxpZCBjaGFyYWN0ZXIgZW50ZXJlZFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLiNtYXhfbGVuZ3RoICYmXG4gICAgICAgICAgICB0aGlzLiN2YWx1ZV9ib3gudmFsdWUubGVuZ3RoICsgZGF0YS5sZW5ndGggPiB0aGlzLiNtYXhfbGVuZ3RoXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLndhcm4oYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9sZW5ndGh9IGNoYXJhY3RlcnMgaXMgYWxsb3dlZGApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLiNtYXhfYnl0ZXMgJiZcbiAgICAgICAgICAgIHN0cmluZ19ieXRlX2xlbmd0aCh0aGlzLiN2YWx1ZV9ib3gudmFsdWUpICtcbiAgICAgICAgICAgICAgc3RyaW5nX2J5dGVfbGVuZ3RoKGRhdGEpID5cbiAgICAgICAgICAgICAgdGhpcy4jbWF4X2J5dGVzXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLndhcm4oYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9ieXRlc30gYnl0ZXMgaXMgYWxsb3dlZGApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy4jdmFsdWVfYm94Lm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5idWZmZXIpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBcIkVudGVyXCIgJiYgZS5jdHJsS2V5KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy4jc2V0KCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jICNzZXQoKSB7XG4gICAgY29uc3QgYnVmZiA9IHRoaXMuYnVmZmVyO1xuICAgIChhd2FpdCB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLiN2YWx1ZV9ib3gudmFsdWUgfHwgXCJcIikpLm1hcF9lcnIoKCkgPT4ge1xuICAgICAgdGhpcy5uZXdfdmFsdWUoYnVmZiB8fCBcIlwiKTtcbiAgICAgIHNldF9jdXJzb3JfZW5kKHRoaXMuI3ZhbHVlX2JveCk7XG4gICAgfSk7XG4gIH1cblxuICBzZXQgZmlsdGVyKHZhbDogUmVnRXhwIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jZmlsdGVyID0gdmFsO1xuICB9XG4gIGdldCBmaWx0ZXIoKTogUmVnRXhwIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jZmlsdGVyO1xuICB9XG5cbiAgc2V0IHBsYWNlaG9sZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnBsYWNlaG9sZGVyID0gdmFsO1xuICB9XG4gIGdldCBwbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLiN2YWx1ZV9ib3gucGxhY2Vob2xkZXI7XG4gIH1cblxuICBzZXQgbWF4X2xlbmd0aCh2YWw6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI21heF9sZW5ndGggPSB2YWw7XG4gICAgdGhpcy4jdmFsdWVfYm94Lm1heExlbmd0aCA9IHZhbCA/PyAtMTtcbiAgfVxuICBnZXQgbWF4X2xlbmd0aCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNtYXhfbGVuZ3RoO1xuICB9XG5cbiAgc2V0IG1heF9ieXRlcyh2YWw6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI21heF9ieXRlcyA9IHZhbDtcbiAgfVxuICBnZXQgbWF4X2J5dGVzKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI21heF9ieXRlcztcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLiN2YWx1ZV9ib3gudmFsdWUgPSB2YWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnZhbHVlID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGxpbWl0X3ZhbHVlKHZhbDogc3RyaW5nKTogUHJvbWlzZUxpa2U8UmVzdWx0PHN0cmluZywgc3RyaW5nPj4ge1xuICAgIGlmICh0aGlzLiNtYXhfbGVuZ3RoICYmIHZhbC5sZW5ndGggPiB0aGlzLiNtYXhfbGVuZ3RoKVxuICAgICAgdmFsID0gdmFsLnNsaWNlKDAsIHRoaXMuI21heF9sZW5ndGgpO1xuICAgIGlmICh0aGlzLiNtYXhfYnl0ZXMpIHZhbCA9IHN0cmluZ19ieXRlX2xpbWl0KHZhbCwgdGhpcy4jbWF4X2J5dGVzKTtcbiAgICByZXR1cm4gc3VwZXIubGltaXRfdmFsdWUodmFsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja192YWx1ZSh2YWw6IHN0cmluZyk6IFByb21pc2VMaWtlPFJlc3VsdDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICBpZiAodGhpcy4jbWF4X2xlbmd0aCAmJiB2YWwubGVuZ3RoID4gdGhpcy4jbWF4X2xlbmd0aClcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihgQSBtYXhpbXVtIG9mICR7dGhpcy4jbWF4X2xlbmd0aH0gY2hhcmFjdGVycyBpcyBhbGxvd2VkYCksXG4gICAgICApO1xuICAgIGlmICh0aGlzLiNtYXhfYnl0ZXMgJiYgc3RyaW5nX2J5dGVfbGVuZ3RoKHZhbCkgPiB0aGlzLiNtYXhfYnl0ZXMpXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9ieXRlc30gYnl0ZXMgaXMgYWxsb3dlZGApLFxuICAgICAgKTtcbiAgICByZXR1cm4gc3VwZXIuY2hlY2tfdmFsdWUodmFsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKHJlbGF0ZWQ6IFBhcnRpYWw8U3RhdGVTdHJpbmdSZWxhdGVkPik6IHZvaWQge1xuICAgIGlmIChyZWxhdGVkLm1heF9sZW5ndGgpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwibWF4X2xlbmd0aFwiLCByZWxhdGVkLm1heF9sZW5ndGgsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtYXhfbGVuZ3RoXCIpO1xuICAgIGlmIChyZWxhdGVkLm1heF9sZW5ndGhfYnl0ZXMpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwibWF4X2J5dGVzXCIsIHJlbGF0ZWQubWF4X2xlbmd0aF9ieXRlcywgKCkgPT5cbiAgICAgICAgbm9uZSgpLFxuICAgICAgKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcIm1heF9ieXRlc1wiKTtcbiAgfVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybVRleHRNdWx0aWxpbmUpO1xuXG4vKipDcmVhdGVzIGEgbXVsdGkgbGluZSB0ZXh0IGlucHV0IGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fdGV4dF9tdWx0aWxpbmU8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybVRleHRJbnB1dE9wdGlvbnM8SUQ+LFxuKTogRm9ybVRleHRNdWx0aWxpbmU8SUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgRm9ybVRleHRNdWx0aWxpbmU8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5wbGFjZWhvbGRlcikgaW5wdXQucGxhY2Vob2xkZXIgPSBvcHRpb25zLnBsYWNlaG9sZGVyO1xuICAgIGlmIChvcHRpb25zLm1heF9sZW5ndGgpIGlucHV0Lm1heF9sZW5ndGggPSBvcHRpb25zLm1heF9sZW5ndGg7XG4gICAgaWYgKG9wdGlvbnMubWF4X2J5dGVzKSBpbnB1dC5tYXhfYnl0ZXMgPSBvcHRpb25zLm1heF9ieXRlcztcbiAgICBGb3JtVmFsdWVXcml0ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IEZvcm1FbGVtZW50IH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vdGV4dC5zY3NzXCI7XG5cbmludGVyZmFjZSBGb3JtVGV4dE9wdGlvbnMge1xuICAvKipCdXR0b25zIHRleHQgKi9cbiAgdGV4dD86IHN0cmluZztcbiAgLyoqVGV4dCBzaXplICovXG4gIHNpemU/OiBudW1iZXI7XG59XG5cbi8qKkNvbXBvbmVudCBmb3Igc2ltcGxlIHRleHQgKi9cbmNsYXNzIEZvcm1UZXh0IGV4dGVuZHMgRm9ybUVsZW1lbnQge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInRleHRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRm9ybVRleHRPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAob3B0aW9ucy50ZXh0KSB0aGlzLnRleHQgPSBvcHRpb25zLnRleHQ7XG4gICAgaWYgKG9wdGlvbnMuc2l6ZSkgdGhpcy5zaXplID0gb3B0aW9ucy5zaXplO1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgY3VycmVudCB0ZXh0IG9mIHRoZSBlbGVtZW50Ki9cbiAgc2V0IHRleHQodGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH1cbiAgZ2V0IHRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGV4dENvbnRlbnQ7XG4gIH1cblxuICAvKipTZXRzIHRoZSBjdXJyZW50IHRleHQgb2YgdGhlIGVsZW1lbnQqL1xuICBzZXQgc2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICB0aGlzLnN0eWxlLmZvbnRTaXplID0gYCR7c2l6ZX1yZW1gO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtVGV4dCk7XG5cbi8qKkNyZWF0ZXMgYSBidXR0b24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV90ZXh0KG9wdGlvbnM6IEZvcm1UZXh0T3B0aW9ucyk6IEZvcm1UZXh0IHtcbiAgcmV0dXJuIG5ldyBGb3JtVGV4dChvcHRpb25zKTtcbn1cbiIsImltcG9ydCB7IEZvcm1Db2xvcnMgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBmb3JtX2J1dHRvbiB9IGZyb20gXCIuL2Jvb2xlYW4vYnV0dG9uL2J1dHRvblwiO1xuaW1wb3J0IHsgZm9ybV9sYW1wIH0gZnJvbSBcIi4vYm9vbGVhbi9sYW1wL2xhbXBcIjtcbmltcG9ydCB7IGZvcm1fc3dpdGNoIH0gZnJvbSBcIi4vYm9vbGVhbi9zd2l0Y2gvc3dpdGNoXCI7XG5pbXBvcnQgeyBmb3JtX2dyb3VwIH0gZnJvbSBcIi4vZ3JvdXAvZ3JvdXBcIjtcbmltcG9ydCB7IGZvcm1fbGlzdF9maWVsZCB9IGZyb20gXCIuL2xpc3QvbGlzdF9maWVsZFwiO1xuaW1wb3J0IHsgZm9ybV9udW1iZXJfaW5wdXQgfSBmcm9tIFwiLi9udW1iZXIvbnVtYmVySW5wdXQvbnVtYmVyX2lucHV0XCI7XG5pbXBvcnQgeyBmb3JtX3Byb2dyZXNzIH0gZnJvbSBcIi4vbnVtYmVyL3Byb2dyZXNzL3Byb2dyZXNzXCI7XG5pbXBvcnQgeyBmb3JtX3NsaWRlciB9IGZyb20gXCIuL251bWJlci9zbGlkZXIvc2xpZGVyXCI7XG5pbXBvcnQgeyBmb3JtX3N0ZXBwZXIgfSBmcm9tIFwiLi9udW1iZXIvc3RlcHBlci9zdGVwcGVyXCI7XG5pbXBvcnQgeyBmb3JtX2Ryb3Bkb3duIH0gZnJvbSBcIi4vc2VsZWN0b3JzL2Ryb3BfZG93bi9kcm9wX2Rvd25cIjtcbmltcG9ydCB7IGZvcm1fdG9nZ2xlX2J1dHRvbiB9IGZyb20gXCIuL3NlbGVjdG9ycy90b2dnbGVfYnV0dG9uL3RvZ2dsZV9idXR0b25cIjtcbmltcG9ydCB7IGZvcm1fc3BhY2VyIH0gZnJvbSBcIi4vc3BhY2luZy9zcGFjZXJcIjtcbmltcG9ydCB7IGZvcm1fY29sb3JfaW5wdXQgfSBmcm9tIFwiLi9zcGVjaWFsL2NvbG9yL2NvbG9yX2lucHV0XCI7XG5pbXBvcnQge1xuICBmb3JtX2RhdGVfdGltZV9pbnB1dCxcbiAgRm9ybURhdGVUaW1lVHlwZSxcbn0gZnJvbSBcIi4vc3BlY2lhbC9kYXRlX3RpbWUvZGF0ZV90aW1lX2lucHV0XCI7XG5pbXBvcnQgeyBmb3JtX2lwX2lucHV0IH0gZnJvbSBcIi4vc3BlY2lhbC9pcC9pcF9pbnB1dFwiO1xuaW1wb3J0IHsgZm9ybV9wYXNzd29yZF9pbnB1dCB9IGZyb20gXCIuL3NwZWNpYWwvcGFzc3dvcmQvcGFzc3dvcmRfaW5wdXRcIjtcbmltcG9ydCB7IGZvcm1fdGV4dF9pbnB1dCB9IGZyb20gXCIuL3RleHQvaW5wdXQvdGV4dF9pbnB1dFwiO1xuaW1wb3J0IHsgZm9ybV90ZXh0X211bHRpbGluZSB9IGZyb20gXCIuL3RleHQvbXVsdGlMaW5lL3RleHRfbXVsdGlfbGluZVwiO1xuaW1wb3J0IHsgZm9ybV90ZXh0IH0gZnJvbSBcIi4vdGV4dC90ZXh0L3RleHRcIjtcblxuLyoqRm9ybSBlbGVtZW50cyB3aXRoIGxhYmVsICovXG5leHBvcnQgY29uc3QgZm9ybSA9IHtcbiAgRm9ybUNvbG9ycyxcblxuICAvL0Jvb2xlYW5cbiAgYnV0dG9uOiBmb3JtX2J1dHRvbixcbiAgc3dpdGNoOiBmb3JtX3N3aXRjaCxcbiAgbGFtcDogZm9ybV9sYW1wLFxuICAvL0dyb3VwXG4gIGdyb3VwOiBmb3JtX2dyb3VwLFxuXG4gIC8vU3BlY2lhbFxuICBjb2xvcl9pbnB1dDogZm9ybV9jb2xvcl9pbnB1dCxcbiAgZGF0ZV90aW1lX2lucHV0OiBmb3JtX2RhdGVfdGltZV9pbnB1dCxcbiAgRm9ybURhdGVUaW1lVHlwZSxcbiAgaXBfaW5wdXQ6IGZvcm1faXBfaW5wdXQsXG4gIHBhc3N3b3JkX2lucHV0OiBmb3JtX3Bhc3N3b3JkX2lucHV0LFxuXG4gIC8vTnVtYmVyXG4gIHByb2dyZXNzOiBmb3JtX3Byb2dyZXNzLFxuICBpbnB1dF9udW1iZXI6IGZvcm1fbnVtYmVyX2lucHV0LFxuICBzbGlkZXI6IGZvcm1fc2xpZGVyLFxuICBzdGVwcGVyOiBmb3JtX3N0ZXBwZXIsXG5cbiAgLy9TZWxlY3RvcnNcbiAgZHJvcGRvd246IGZvcm1fZHJvcGRvd24sXG4gIHRvZ2dsZV9idXR0b246IGZvcm1fdG9nZ2xlX2J1dHRvbixcblxuICAvL1NwYWNpbmdcbiAgc3BhY2VyOiBmb3JtX3NwYWNlcixcblxuICAvL1RleHRcbiAgdGV4dDogZm9ybV90ZXh0LFxuICBpbnB1dF90ZXh0OiBmb3JtX3RleHRfaW5wdXQsXG4gIG11bHRpbGluZV90ZXh0OiBmb3JtX3RleHRfbXVsdGlsaW5lLFxuXG4gIC8vTGlzdFxuICBsaXN0X2ZpZWxkOiBmb3JtX2xpc3RfZmllbGQsXG59O1xuZXhwb3J0IGRlZmF1bHQgZm9ybTtcblxuZXhwb3J0IHsgRm9ybUNvbG9ycyB9IGZyb20gXCIuL2Jhc2VcIjtcbmV4cG9ydCB7IEZvcm1EYXRlVGltZVR5cGUgfSBmcm9tIFwiLi9zcGVjaWFsL2RhdGVfdGltZS9kYXRlX3RpbWVfaW5wdXRcIjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBVUEsTUFBTSxhQUFhLHlCQUNqQixRQUNBLG9CQUNBLHVDQUNEO0FBUWlCLFdBQVcsZUFDM0IsUUFDQSxhQUNBLCtDQUVPLENBQUMsY0FDUixVQUNBLG9CQUNBLHFEQUNBLGdCQUNBLGdCQUNBLFVBQ0EsS0FBQSxFQUNEO0FBVUQsTUFBTSxTQUFTLFdBQVcsZUFDeEIsVUFDQSxVQUNBLG1DQUNEO0FBUUQsTUFBTSxjQUFjLE9BQU8sZUFDekIsUUFDQSxlQUNBLHdDQUNEO0FBQ0QsWUFBWSxjQUNWLFNBQ0EsZUFDQSxpQ0FDQSxLQUFLLFFBQ0wsS0FBSyxRQUNMLFNBQ0EsS0FBQSxFQUNEO0FBQ0QsWUFBWSxjQUNWLFVBQ0EscUJBQ0Esc0NBQ0EsS0FBSyxRQUNMLEtBQUssUUFDTCxTQUNBLEtBQUEsRUFDRDtBQUNELFlBQVksY0FDVixZQUNBLHVCQUNBLHdDQUNBLEtBQUssUUFDTCxLQUFLLE9BQ0wsU0FDQSxLQUFBLEVBQ0Q7QUFDRCxZQUFZLGNBQ1YsY0FDQSx5QkFDQSwwQ0FDQSxLQUFLLFFBQ0wsS0FBSyxRQUNMLFNBQ0EsS0FBQSxFQUNEO0FBVUQsTUFBTSxvQkFBb0IsT0FBTyxlQUMvQixhQUNBLGdDQUNBLDZEQUNEO0FBQ0Qsa0JBQWtCLGNBQ2hCLFVB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
2606
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiI2Z1bmMiLCIjZXJyb3IiLCIjY2hhbmdlIiwiI2NoYW5nZWQiLCIjd2Fybl90aW1lb3V0IiwiI3NldF92YWx1ZSIsIiNvbl9jbGljayIsIiN0b2dnbGUiLCIjdGV4dCIsIiNpY29uIiwiI3RleHQiLCIjaWNvbiIsIiNjb2xvcnMiLCIjc3dpdGNoIiwiI3ByZXZlbnRfY2xpY2siLCIjaWNvbiIsIiNncm91cCIsIiNjb2xsYXBzZWQiLCIjY29sbGFwc2VfYnV0dG9uIiwiI2Nsb3NlX3RleHQiLCIjb3Blbl90ZXh0IiwiI2xlZ2VuZCIsIiN2YWx1ZV9ib3giLCIjc2VsZWN0ZWQiLCIjc2V0IiwiI3N0ZXBfdmFsdWUiLCIjZGVjaW1hbHMiLCIjbWluIiwiI21heCIsIiN1bml0IiwiI3VuaXRfYm94IiwiI3VwZGF0ZV9taW5fbGVnZW5kIiwiI3VwZGF0ZV9tYXhfbGVuZ2VuZCIsIiNtaW5fbGVnZW5kIiwiI21heF9sZWdlbmQiLCIjc3RlcCIsIiNzdGFydCIsIiNtaW4iLCIjc3BhbiIsIiNtYXgiLCIjZGVjaW1hbHMiLCIjdW5pdCIsIiNiYXIiLCIjdmFsIiwiI3N0ZXBwZXJfZnVuYyIsIiNsZWdlbmQiLCIjc2xpZGUiLCIjc2xpZGVyIiwiI21pbiIsIiNtYXgiLCIjbGl2ZSIsIiNtb3ZlX3ZhbHVlIiwiI3hfdG9fcGVyYyIsIiNtb3ZlX3NsaWRlIiwiI3N0ZXAiLCIjbW92ZV9hYnNvbHV0ZSIsIiNzdGVwX3ZhbHVlIiwiI3VuaXQiLCIjdW5pdF9ib3giLCIjdXBkYXRlX21pbl9sZWdlbmQiLCIjdXBkYXRlX21heF9sZWdlbmQiLCIjdXBkYXRlX21pbl9tYXgiLCIjbGVmdF9sZWdlbmQiLCIjZGVjaW1hbHMiLCIjcmlnaHRfbGVnZW5kIiwiI3NwYW4iLCIjc3RhcnQiLCIjaWNvbl9kZWMiLCIjaWNvbl9pbmMiLCIjdmFsdWVfYm94IiwiI3BlcmNfdG9fdmFsdWUiLCIjc3RlcHBlcl9mdW5jIiwiI3RleHQiLCIjbGVnZW5kIiwiI3ZhbHVlX2JveCIsIiNtb3ZlX2RpZmYiLCIjc3RlcCIsIiNzdGVwX3ZhbHVlIiwiI2RlY2ltYWxzIiwiI21pbiIsIiN1bml0IiwiI3VuaXRfYm94IiwiI3VwZGF0ZV9taW5fbGVnZW5kIiwiI3VwZGF0ZV9tYXhfbGVuZ2VuZCIsIiNtaW5fbGVnZW5kIiwiI21heCIsIiNtYXhfbGVnZW5kIiwiI3N0YXJ0IiwiI2xpdmUiLCIjaWNvbl9kZWMiLCIjaWNvbl9pbmMiLCIjbW92ZV92YWx1ZSIsIiN0ZXh0IiwiI2RlZmF1bHQiLCIjc2VsZWN0X2FkamFjZW50IiwiI2RlZmF1bHRfaWNvbiIsIiNzZWxlY3RlZCIsIiNzZXRfaWNvbiIsIiNtYXAiLCIjdmFsdWVzIiwiI29wZW4iLCIjaWNvbiIsIiNjbGVhciIsIiNjb250YWluZXIiLCIjc2Nyb2xsIiwiI3RhYmxlIiwiI2Nsb3NlciIsIiNmb2N1c19vdXRfaGFuZGxlciIsIiNkcm9wZG93biIsIiNzZXRfdmFsdWUiLCIjd2luZG93X3Jlc2l6ZV9oYW5kbGVyIiwiI2lzX29wZW4iLCIjbWFwIiwiI3ZhbHVlcyIsIiNzZWxlY3RlZCIsIiNhZGRfc2VsZWN0aW9uIiwiI3NlbGVjdF9hZGphY2VudCIsIiNsaXZlIiwiI21vZGUiLCIjdHlwZSIsIiN0eXBlIiwiI3BhcnRzIiwiI2ZpbHRlciIsIiNzZXQiLCIjZmlsdGVyIiwiI21heF9sZW5ndGgiLCIjbWF4X2J5dGVzIiwiI3Jlc2l6ZXIiLCIjdmFsdWVfYm94IiwiI3NldCIsIiNmaWx0ZXIiLCIjbWF4X2xlbmd0aCIsIiNtYXhfYnl0ZXMiXSwic291cmNlcyI6WyIuLi9zcmMvc2hhcmVkLnRzIiwiLi4vc3JjL2Jhc2UudHMiLCIuLi9zcmMvYm9vbGVhbi9idXR0b24vYnV0dG9uLnRzIiwiLi4vc3JjL2Jvb2xlYW4vbGFtcC9sYW1wLnRzIiwiLi4vc3JjL2Jvb2xlYW4vc3dpdGNoL3N3aXRjaC50cyIsIi4uL3NyYy9ncm91cC9ncm91cF9iYXNlLnRzIiwiLi4vc3JjL2dyb3VwL2dyb3VwLnRzIiwiLi4vc3JjL2dyb3VwL2dyb3VwX2NvbGxhcHNlci50cyIsIi4uL3NyYy9saXN0L2xpc3RfZmllbGQudHMiLCIuLi9zcmMvbnVtYmVyL251bWJlcl9iYXNlLnRzIiwiLi4vc3JjL251bWJlci9udW1iZXJfaW5wdXQvbnVtYmVyX2lucHV0LnRzIiwiLi4vc3JjL251bWJlci9wcm9ncmVzcy9wcm9ncmVzcy50cyIsIi4uL3NyYy9udW1iZXIvc2xpZGVyL3NsaWRlci50cyIsIi4uL3NyYy9udW1iZXIvc3RlcHBlci9zdGVwcGVyLnRzIiwiLi4vc3JjL3NlbGVjdG9ycy9zZWxlY3Rvcl9iYXNlLnRzIiwiLi4vc3JjL3NlbGVjdG9ycy9kcm9wX2Rvd24vZHJvcF9kb3duLnRzIiwiLi4vc3JjL3NlbGVjdG9ycy90b2dnbGVfYnV0dG9uL3RvZ2dsZV9idXR0b24udHMiLCIuLi9zcmMvc3BhY2luZy9zcGFjZXIudHMiLCIuLi9zcmMvc3BlY2lhbC9jb2xvci9jb2xvcl9pbnB1dC50cyIsIi4uL3NyYy9zcGVjaWFsL2RhdGVfdGltZS9kYXRlX3RpbWVfaW5wdXQudHMiLCIuLi9zcmMvc3BlY2lhbC9pcC9pcF9pbnB1dC50cyIsIi4uL3NyYy9zcGVjaWFsL3Bhc3N3b3JkL3Bhc3N3b3JkX2lucHV0LnRzIiwiLi4vc3JjL3RleHQvaW5wdXQvdGV4dF9pbnB1dC50cyIsIi4uL3NyYy90ZXh0L211bHRpX2xpbmUvdGV4dF9tdWx0aV9saW5lLnRzIiwiLi4vc3JjL3RleHQvdGV4dC90ZXh0LnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJMVUUsXG4gIEdSRUVOLFxuICBHUkVZLFxuICBPUkFOR0UsXG4gIFJFRCxcbiAgWUVMTE9XLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1jb2xvcnNcIjtcbmltcG9ydCB7IHRoZW1lX2luaXRfdmFyaWFibGVfcm9vdCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXRoZW1lXCI7XG5cbmNvbnN0IHRoZW1lX3Jvb3QgPSB0aGVtZV9pbml0X3ZhcmlhYmxlX3Jvb3QoXG4gIFwiZm9ybVwiLFxuICBcIlVJIEZvcm0gRWxlbWVudHNcIixcbiAgXCJUaGVtZSB2YXJpYWJsZXMgZm9yIFVJIGZvcm0gRWxlbWVudHNcIixcbik7XG5cbi8vICAgICAgX19fX18gIF9fX19fXyAgICAgICAgICBfX19fXyAgICAgX19fXyAgXyAgIF8gXyAgX18gICAgIF9fXG4vLyAgICAgfCAgX18gXFx8ICBfX19ffCAgIC9cXCAgIHwgIF9fIFxcICAgLyBfXyBcXHwgXFwgfCB8IHwgXFwgXFwgICAvIC9cbi8vICAgICB8IHxfXykgfCB8X18gICAgIC8gIFxcICB8IHwgIHwgfCB8IHwgIHwgfCAgXFx8IHwgfCAgXFwgXFxfLyAvXG4vLyAgICAgfCAgXyAgL3wgIF9ffCAgIC8gL1xcIFxcIHwgfCAgfCB8IHwgfCAgfCB8IC4gYCB8IHwgICBcXCAgIC9cbi8vICAgICB8IHwgXFwgXFx8IHxfX19fIC8gX19fXyBcXHwgfF9ffCB8IHwgfF9ffCB8IHxcXCAgfCB8X19fX3wgfFxuLy8gICAgIHxffCAgXFxfXFxfX19fX18vXy8gICAgXFxfXFxfX19fXy8gICBcXF9fX18vfF98IFxcX3xfX19fX198X3xcbmNvbnN0IHJlYWRfb25seSA9IHRoZW1lX3Jvb3QubWFrZV9zdWJfZ3JvdXAoXG4gIFwicmVhZFwiLFxuICBcIlJlYWQgT25seVwiLFxuICBcIlNldHRpbmdzIGZvciBmb3JtIGVsZW1lbnRzIGluIHJlYWQgb25seSBtb2RlXCIsXG4pO1xucmVhZF9vbmx5Lm1ha2VfdmFyaWFibGUoXG4gIFwiZmlsdGVyXCIsXG4gIFwiUmVhZCBPbmx5IEZpbHRlclwiLFxuICBcIkZpbHRlciBhcHBsaWVkIHRvIGZvcm0gZWxlbWVudHMgaW4gcmVhZCBvbmx5IG1vZGVcIixcbiAgXCJvcGFjaXR5KDAuNilcIixcbiAgXCJvcGFjaXR5KDAuNilcIixcbiAgXCJGaWx0ZXJcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMzXG4vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIzNcbi8vICAgICAgIF9fX19fIF9fX18gIF8gICAgICBfX19fICBfX19fXyAgIF9fX19fXG4vLyAgICAgIC8gX19fXy8gX18gXFx8IHwgICAgLyBfXyBcXHwgIF9fIFxcIC8gX19fX3xcbi8vICAgICB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgfF9fKSB8IChfX19cbi8vICAgICB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgIF8gIC8gXFxfX18gXFxcbi8vICAgICB8IHxfX198IHxfX3wgfCB8X19ffCB8X198IHwgfCBcXCBcXCBfX19fKSB8XG4vLyAgICAgIFxcX19fX19cXF9fX18vfF9fX19fX1xcX19fXy98X3wgIFxcX1xcX19fX18vXG5jb25zdCBjb2xvcnMgPSB0aGVtZV9yb290Lm1ha2Vfc3ViX2dyb3VwKFxuICBcImNvbG9yc1wiLFxuICBcIkNvbG9yc1wiLFxuICBcIkNvbG9ycyB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4pO1xuXG4vLyAgICAgIF9fX19fX18gX19fX19fX18gICBfX19fX19fX18gICAgX19fX18gX19fXyAgXyAgICAgIF9fX18gIF9fX19fICAgX19fX19cbi8vICAgICB8X18gICBfX3wgIF9fX19cXCBcXCAvIC9fXyAgIF9ffCAgLyBfX19fLyBfXyBcXHwgfCAgICAvIF9fIFxcfCAgX18gXFwgLyBfX19ffFxuLy8gICAgICAgIHwgfCAgfCB8X18gICBcXCBWIC8gICB8IHwgICAgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8IHxfXykgfCAoX19fXG4vLyAgICAgICAgfCB8ICB8ICBfX3wgICA+IDwgICAgfCB8ICAgIHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCAgXyAgLyBcXF9fXyBcXFxuLy8gICAgICAgIHwgfCAgfCB8X19fXyAvIC4gXFwgICB8IHwgICAgfCB8X19ffCB8X198IHwgfF9fX3wgfF9ffCB8IHwgXFwgXFwgX19fXykgfFxuLy8gICAgICAgIHxffCAgfF9fX19fXy9fLyBcXF9cXCAgfF98ICAgICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzX3RleHQgPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwidGV4dFwiLFxuICBcIlRleHQgQ29sb3JzXCIsXG4gIFwiVGV4dCBjb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcbmNvbG9yc190ZXh0Lm1ha2VfdmFyaWFibGUoXG4gIFwibGFiZWxcIixcbiAgXCJMYWJlbCBDb2xvclwiLFxuICBcIkNvbG9yIG9mIGZvcm0gZWxlbWVudHMgbGFiZWxzXCIsXG4gIEdSRVlbXCI3MDBcIl0sXG4gIEdSRVlbXCIzMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc190ZXh0Lm1ha2VfdmFyaWFibGUoXG4gIFwibm9ybWFsXCIsXG4gIFwiTm9ybWFsIFRleHQgQ29sb3JcIixcbiAgXCJOb3JtYWwgdGV4dCBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRVlbXCI4MDBcIl0sXG4gIEdSRVlbXCIyMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc190ZXh0Lm1ha2VfdmFyaWFibGUoXG4gIFwic2VsZWN0ZWRcIixcbiAgXCJTZWxlY3RlZCBUZXh0IENvbG9yXCIsXG4gIFwiU2VsZWN0ZWQgdGV4dCBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRVlbXCI5MDBcIl0sXG4gIEdSRVlbXCI1MFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX3RleHQubWFrZV92YXJpYWJsZShcbiAgXCJ1bnNlbGVjdGVkXCIsXG4gIFwiVW5zZWxlY3RlZCBUZXh0IENvbG9yXCIsXG4gIFwiVW5zZWxlY3RlZCB0ZXh0IGNvbG9yIGluIGZvcm0gZWxlbWVudHNcIixcbiAgR1JFWVtcIjYwMFwiXSxcbiAgR1JFWVtcIjQwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuXG4vLyAgICAgIF9fX19fX18gX19fX19fX18gICBfX19fX19fX18gICBfX19fICBfICAgICAgICAgICAgICAgX19fX18gXyAgX19cbi8vICAgICB8X18gICBfX3wgIF9fX19cXCBcXCAvIC9fXyAgIF9ffCB8ICBfIFxcfCB8ICAgICAgICAvXFwgICAvIF9fX198IHwvIC9cbi8vICAgICAgICB8IHwgIHwgfF9fICAgXFwgViAvICAgfCB8ICAgIHwgfF8pIHwgfCAgICAgICAvICBcXCB8IHwgICAgfCAnIC9cbi8vICAgICAgICB8IHwgIHwgIF9ffCAgID4gPCAgICB8IHwgICAgfCAgXyA8fCB8ICAgICAgLyAvXFwgXFx8IHwgICAgfCAgPFxuLy8gICAgICAgIHwgfCAgfCB8X19fXyAvIC4gXFwgICB8IHwgICAgfCB8XykgfCB8X19fXyAvIF9fX18gXFwgfF9fX198IC4gXFxcbi8vICAgICAgICB8X3wgIHxfX19fX18vXy8gXFxfXFwgIHxffCAgICB8X19fXy98X19fX19fL18vICAgIFxcX1xcX19fX198X3xcXF9cXFxuLy9cbi8vXG5jb25zdCBjb2xvcnNfdGV4dF9ibGFjayA9IGNvbG9ycy5tYWtlX3N1Yl9ncm91cChcbiAgXCJ0ZXh0QmxhY2tcIixcbiAgXCJUZXh0IENvbG9ycyBCbGFjayBCYWNrZ3JvdW5kXCIsXG4gIFwiVGV4dCBjb2xvcnMgdXNlZCBmb3IgYmxhY2sgYmFja2dyb3VuZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcbmNvbG9yc190ZXh0X2JsYWNrLm1ha2VfdmFyaWFibGUoXG4gIFwibm9ybWFsXCIsXG4gIFwiTm9ybWFsIFRleHQgQ29sb3JcIixcbiAgXCJOb3JtYWwgdGV4dCBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRVlbXCIyMDBcIl0sXG4gIEdSRVlbXCIyMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc190ZXh0X2JsYWNrLm1ha2VfdmFyaWFibGUoXG4gIFwic2VsZWN0ZWRcIixcbiAgXCJTZWxlY3RlZCBUZXh0IENvbG9yXCIsXG4gIFwiU2VsZWN0ZWQgdGV4dCBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRVlbXCI1MFwiXSxcbiAgR1JFWVtcIjUwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfdGV4dF9ibGFjay5tYWtlX3ZhcmlhYmxlKFxuICBcInVuc2VsZWN0ZWRcIixcbiAgXCJVbnNlbGVjdGVkIFRleHQgQ29sb3JcIixcbiAgXCJVbnNlbGVjdGVkIHRleHQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiNjAwXCJdLFxuICBHUkVZW1wiNDAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5cbi8vICAgICAgX19fX18gX19fX18gX19fXyAgXyAgIF8gICAgX19fX18gX19fXyAgXyAgICAgIF9fX18gIF9fX19fICAgX19fX19cbi8vICAgICB8XyAgIF8vIF9fX18vIF9fIFxcfCBcXCB8IHwgIC8gX19fXy8gX18gXFx8IHwgICAgLyBfXyBcXHwgIF9fIFxcIC8gX19fX3xcbi8vICAgICAgIHwgfHwgfCAgIHwgfCAgfCB8ICBcXHwgfCB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgfF9fKSB8IChfX19cbi8vICAgICAgIHwgfHwgfCAgIHwgfCAgfCB8IC4gYCB8IHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCAgXyAgLyBcXF9fXyBcXFxuLy8gICAgICBffCB8fCB8X19ffCB8X198IHwgfFxcICB8IHwgfF9fX3wgfF9ffCB8IHxfX198IHxfX3wgfCB8IFxcIFxcIF9fX18pIHxcbi8vICAgICB8X19fX19cXF9fX19fXFxfX19fL3xffCBcXF98ICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzX2ljb24gPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwiaWNvblwiLFxuICBcIkljb24gQ29sb3JzXCIsXG4gIFwiSWNvbiBjb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcbmNvbG9yc19pY29uLm1ha2VfdmFyaWFibGUoXG4gIFwibm9ybWFsXCIsXG4gIFwiTm9ybWFsIEljb24gQ29sb3JcIixcbiAgXCJDb2xvciBvZiBpY29ucyBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRVlbXCI4MDBcIl0sXG4gIEdSRVlbXCIyMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc19pY29uLm1ha2VfdmFyaWFibGUoXG4gIFwic2VsZWN0ZWRcIixcbiAgXCJTZWxlY3RlZCBJY29uIENvbG9yXCIsXG4gIFwiQ29sb3Igb2Ygc2VsZWN0ZWQgaWNvbnMgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiOTAwXCJdLFxuICBHUkVZW1wiNTBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc19pY29uLm1ha2VfdmFyaWFibGUoXG4gIFwidW5zZWxlY3RlZFwiLFxuICBcIlVuc2VsZWN0ZWQgSWNvbiBDb2xvclwiLFxuICBcIkNvbG9yIG9mIHVuc2VsZWN0ZWQgaWNvbnMgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiNjAwXCJdLFxuICBHUkVZW1wiNDAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5cbi8vICAgICAgX19fXyAgICAgICAgICBfX19fXyBfICBfX19fX19fIF9fX19fICAgX19fXyAgXyAgICBfIF8gICBfIF9fX19fICAgICBfX19fXyBfX19fICBfICAgICAgX19fXyAgX19fX18gICBfX19fX1xuLy8gICAgIHwgIF8gXFwgICAvXFwgICAvIF9fX198IHwvIC8gX19fX3wgIF9fIFxcIC8gX18gXFx8IHwgIHwgfCBcXCB8IHwgIF9fIFxcICAgLyBfX19fLyBfXyBcXHwgfCAgICAvIF9fIFxcfCAgX18gXFwgLyBfX19ffFxuLy8gICAgIHwgfF8pIHwgLyAgXFwgfCB8ICAgIHwgJyAvIHwgIF9ffCB8X18pIHwgfCAgfCB8IHwgIHwgfCAgXFx8IHwgfCAgfCB8IHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCB8X18pIHwgKF9fX1xuLy8gICAgIHwgIF8gPCAvIC9cXCBcXHwgfCAgICB8ICA8fCB8IHxfIHwgIF8gIC98IHwgIHwgfCB8ICB8IHwgLiBgIHwgfCAgfCB8IHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCAgXyAgLyBcXF9fXyBcXFxuLy8gICAgIHwgfF8pIC8gX19fXyBcXCB8X19fX3wgLiBcXCB8X198IHwgfCBcXCBcXHwgfF9ffCB8IHxfX3wgfCB8XFwgIHwgfF9ffCB8IHwgfF9fX3wgfF9ffCB8IHxfX198IHxfX3wgfCB8IFxcIFxcIF9fX18pIHxcbi8vICAgICB8X19fXy9fLyAgICBcXF9cXF9fX19ffF98XFxfXFxfX19fX3xffCAgXFxfXFxcXF9fX18vIFxcX19fXy98X3wgXFxffF9fX19fLyAgIFxcX19fX19cXF9fX18vfF9fX19fX1xcX19fXy98X3wgIFxcX1xcX19fX18vXG5jb25zdCBjb2xvcnNfYmFja2dyb3VuZCA9IGNvbG9ycy5tYWtlX3N1Yl9ncm91cChcbiAgXCJiYWNrZ3JvdW5kXCIsXG4gIFwiQmFja2dyb3VuZCBDb2xvcnNcIixcbiAgXCJCYWNrZ3JvdW5kIGNvbG9ycyB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4pO1xuY29sb3JzX2JhY2tncm91bmQubWFrZV92YXJpYWJsZShcbiAgXCJub3JtYWxcIixcbiAgXCJOb3JtYWwgQmFja2dyb3VuZCBDb2xvclwiLFxuICBcIkNvbG9yIG9mIG5vcm1hbCBmb3JtIGVsZW1lbnQgYmFja2dyb3VuZHNcIixcbiAgR1JFWVtcIjUwXCJdLFxuICBHUkVZW1wiOTAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfYmFja2dyb3VuZC5tYWtlX3ZhcmlhYmxlKFxuICBcImhvdmVyXCIsXG4gIFwiSG92ZXIgQmFja2dyb3VuZCBDb2xvclwiLFxuICBcIkNvbG9yIG9mIGZvcm0gZWxlbWVudCBiYWNrZ3JvdW5kcyB3aGVuIGhvdmVyaW5nXCIsXG4gIEdSRVlbXCI0MDBcIl0sXG4gIEdSRVlbXCI3MDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc19iYWNrZ3JvdW5kLm1ha2VfdmFyaWFibGUoXG4gIFwidW5zZWxlY3RlZFwiLFxuICBcIlVuc2VsZWN0ZWQgQmFja2dyb3VuZCBDb2xvclwiLFxuICBcIkNvbG9yIG9mIHVuc2VsZWN0ZWQgZm9ybSBlbGVtZW50IGJhY2tncm91bmRzXCIsXG4gIEdSRVlbXCIzMDBcIl0sXG4gIEdSRVlbXCI4MDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8gICAgICBfX19fICAgX19fXyAgX19fX18gIF9fX19fICBfX19fX18gX19fX18gICAgIF9fX19fIF9fX18gIF8gICAgICBfX19fICBfX19fXyAgIF9fX19fXG4vLyAgICAgfCAgXyBcXCAvIF9fIFxcfCAgX18gXFx8ICBfXyBcXHwgIF9fX198ICBfXyBcXCAgIC8gX19fXy8gX18gXFx8IHwgICAgLyBfXyBcXHwgIF9fIFxcIC8gX19fX3xcbi8vICAgICB8IHxfKSB8IHwgIHwgfCB8X18pIHwgfCAgfCB8IHxfXyAgfCB8X18pIHwgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8IHxfXykgfCAoX19fXG4vLyAgICAgfCAgXyA8fCB8ICB8IHwgIF8gIC98IHwgIHwgfCAgX198IHwgIF8gIC8gIHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCAgXyAgLyBcXF9fXyBcXFxuLy8gICAgIHwgfF8pIHwgfF9ffCB8IHwgXFwgXFx8IHxfX3wgfCB8X19fX3wgfCBcXCBcXCAgfCB8X19ffCB8X198IHwgfF9fX3wgfF9ffCB8IHwgXFwgXFwgX19fXykgfFxuLy8gICAgIHxfX19fLyBcXF9fX18vfF98ICBcXF9cXF9fX19fL3xfX19fX198X3wgIFxcX1xcICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzX2JvcmRlciA9IGNvbG9ycy5tYWtlX3N1Yl9ncm91cChcbiAgXCJib3JkZXJcIixcbiAgXCJCb3JkZXIgQ29sb3JzXCIsXG4gIFwiQm9yZGVyIGNvbG9ycyB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4pO1xuY29sb3JzX2JvcmRlci5tYWtlX3ZhcmlhYmxlKFxuICBcIm5vcm1hbFwiLFxuICBcIk5vcm1hbCBCb3JkZXIgQ29sb3JcIixcbiAgXCJDb2xvciBvZiBub3JtYWwgZm9ybSBlbGVtZW50IGJvcmRlcnNcIixcbiAgR1JFWVtcIjcwMFwiXSxcbiAgR1JFWVtcIjMwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX2JvcmRlci5tYWtlX3ZhcmlhYmxlKFxuICBcInVuc2VsZWN0ZWRcIixcbiAgXCJVbnNlbGVjdGVkIEJvcmRlciBDb2xvclwiLFxuICBcIkNvbG9yIG9mIHVuc2VsZWN0ZWQgZm9ybSBlbGVtZW50IGJvcmRlcnNcIixcbiAgR1JFWVtcIjcwMFwiXSxcbiAgR1JFWVtcIjMwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuXG4vLyAgICAgIF9fX19fXyBfX19fICAgX19fX18gXyAgICBfICBfX19fX1xuLy8gICAgIHwgIF9fX18vIF9fIFxcIC8gX19fX3wgfCAgfCB8LyBfX19ffFxuLy8gICAgIHwgfF9fIHwgfCAgfCB8IHwgICAgfCB8ICB8IHwgKF9fX1xuLy8gICAgIHwgIF9ffHwgfCAgfCB8IHwgICAgfCB8ICB8IHxcXF9fXyBcXFxuLy8gICAgIHwgfCAgIHwgfF9ffCB8IHxfX19ffCB8X198IHxfX19fKSB8XG4vLyAgICAgfF98ICAgIFxcX19fXy8gXFxfX19fX3xcXF9fX18vfF9fX19fL1xuY29uc3QgY29sb3JzX2ZvY3VzID0gY29sb3JzLm1ha2Vfc3ViX2dyb3VwKFxuICBcImZvY3VzXCIsXG4gIFwiRm9jdXMgQ29sb3JzXCIsXG4gIFwiRm9jdXMgY29sb3JzIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5jb2xvcnNfZm9jdXMubWFrZV92YXJpYWJsZShcbiAgXCJub3JtYWxcIixcbiAgXCJGb2N1cyBDb2xvclwiLFxuICBcIkNvbG9yIG9mIGZvY3Vzc2VkIGZvcm0gZWxlbWVudFwiLFxuICBPUkFOR0VbXCI2MDBcIl0sXG4gIE9SQU5HRVtcIjMwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuXG4vLyAgICAgIF9fX18gICAgICAgICAgIF9fX19fIF9fX19fIF9fX19fICAgIF9fX19fIF9fX18gIF8gICAgICBfX19fICBfX19fXyAgIF9fX19fXG4vLyAgICAgfCAgXyBcXCAgIC9cXCAgICAvIF9fX198XyAgIF8vIF9fX198ICAvIF9fX18vIF9fIFxcfCB8ICAgIC8gX18gXFx8ICBfXyBcXCAvIF9fX198XG4vLyAgICAgfCB8XykgfCAvICBcXCAgfCAoX19fICAgfCB8fCB8ICAgICAgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8IHxfXykgfCAoX19fXG4vLyAgICAgfCAgXyA8IC8gL1xcIFxcICBcXF9fXyBcXCAgfCB8fCB8ICAgICAgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8ICBfICAvIFxcX19fIFxcXG4vLyAgICAgfCB8XykgLyBfX19fIFxcIF9fX18pIHxffCB8fCB8X19fXyAgfCB8X19ffCB8X198IHwgfF9fX3wgfF9ffCB8IHwgXFwgXFwgX19fXykgfFxuLy8gICAgIHxfX19fL18vICAgIFxcX1xcX19fX18vfF9fX19fXFxfX19fX3wgIFxcX19fX19cXF9fX18vfF9fX19fX1xcX19fXy98X3wgIFxcX1xcX19fX18vXG5jb25zdCBjb2xvcnNfYmFzaWMgPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwiYmFzaWNcIixcbiAgXCJCYXNpYyBDb2xvcnNcIixcbiAgXCJCYXNpYyBjb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcbmNvbG9yc19iYXNpYy5tYWtlX3ZhcmlhYmxlKFxuICBcImdyZWVuXCIsXG4gIFwiQmFzaWMgR3JlZW4gQ29sb3JcIixcbiAgXCJDb21tb25seSB1c2VkIGdyZWVuIGNvbG9yIGluIGZvcm0gZWxlbWVudHNcIixcbiAgR1JFRU5bXCIzMDBcIl0sXG4gIEdSRUVOW1wiOTAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfYmFzaWMubWFrZV92YXJpYWJsZShcbiAgXCJyZWRcIixcbiAgXCJCYXNpYyBSZWQgQ29sb3JcIixcbiAgXCJDb21tb25seSB1c2VkIHJlZCBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIFJFRFtcIjMwMFwiXSxcbiAgUkVEW1wiOTAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfYmFzaWMubWFrZV92YXJpYWJsZShcbiAgXCJibHVlXCIsXG4gIFwiQmFzaWMgQmx1ZSBDb2xvclwiLFxuICBcIkNvbW1vbmx5IHVzZWQgYmx1ZSBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEJMVUVbXCIzMDBcIl0sXG4gIEJMVUVbXCI5MDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc19iYXNpYy5tYWtlX3ZhcmlhYmxlKFxuICBcInllbGxvd1wiLFxuICBcIkJhc2ljIFllbGxvdyBDb2xvclwiLFxuICBcIkNvbW1vbmx5IHVzZWQgeWVsbG93IGNvbG9yIGluIGZvcm0gZWxlbWVudHNcIixcbiAgWUVMTE9XW1wiMzAwXCJdLFxuICBPUkFOR0VbXCI5MDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMzXG4vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIzNcbi8vICAgICAgIF9fX19fIF9fX19fIF9fX19fX19fX19fXyAgX19fX19cbi8vICAgICAgLyBfX19ffF8gICBffF9fXyAgLyAgX19fX3wvIF9fX198XG4vLyAgICAgfCAoX19fICAgfCB8ICAgIC8gL3wgfF9fICB8IChfX19cbi8vICAgICAgXFxfX18gXFwgIHwgfCAgIC8gLyB8ICBfX3wgIFxcX19fIFxcXG4vLyAgICAgIF9fX18pIHxffCB8XyAvIC9fX3wgfF9fX18gX19fXykgfFxuLy8gICAgIHxfX19fXy98X19fX18vX19fX198X19fX19ffF9fX19fL1xuY29uc3Qgc2l6ZXMgPSB0aGVtZV9yb290Lm1ha2Vfc3ViX2dyb3VwKFxuICBcInNpemVcIixcbiAgXCJTaXplXCIsXG4gIFwiU2l6ZXMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcblxuc2l6ZXMubWFrZV92YXJpYWJsZShcbiAgXCJoZWlnaHRcIixcbiAgXCJIZWlnaHRcIixcbiAgXCJEZWZhdWx0IGhlaWdodCB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4gIFwiMS4zcmVtXCIsXG4gIFwiMS4zcmVtXCIsXG4gIFwiTGVuZ3RoXCIsXG4gIHsgbWluOiAwLjEsIG1heDogMTAgfSxcbik7XG5cbnNpemVzLm1ha2VfdmFyaWFibGUoXG4gIFwidG91Y2hIZWlnaHRcIixcbiAgXCJUb3VjaCBIZWlnaHRcIixcbiAgXCJNaW5pbXVtIGhlaWdodCBmb3IgdG91Y2ggZGV2aWNlcyB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4gIFwiMi4wcmVtXCIsXG4gIFwiMi4wcmVtXCIsXG4gIFwiTGVuZ3RoXCIsXG4gIHsgbWluOiAwLjEsIG1heDogMTAgfSxcbik7XG5cbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjM1xuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMzXG4vLyAgICAgIF9fX19fXyBfX19fICBfICAgXyBfX19fX19fXG4vLyAgICAgfCAgX19fXy8gX18gXFx8IFxcIHwgfF9fICAgX198XG4vLyAgICAgfCB8X18gfCB8ICB8IHwgIFxcfCB8ICB8IHxcbi8vICAgICB8ICBfX3x8IHwgIHwgfCAuIGAgfCAgfCB8XG4vLyAgICAgfCB8ICAgfCB8X198IHwgfFxcICB8ICB8IHxcbi8vICAgICB8X3wgICAgXFxfX19fL3xffCBcXF98ICB8X3xcbmNvbnN0IGZvbnQgPSB0aGVtZV9yb290Lm1ha2Vfc3ViX2dyb3VwKFxuICBcImZvbnRcIixcbiAgXCJGb250XCIsXG4gIFwiRm9udCBzZXR0aW5ncyB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4pO1xuXG5mb250Lm1ha2VfdmFyaWFibGUoXG4gIFwic2l6ZVwiLFxuICBcIkZvbnQgU2l6ZVwiLFxuICBcIkRlZmF1bHQgZm9udCBzaXplIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbiAgXCIwLjlyZW1cIixcbiAgXCIwLjlyZW1cIixcbiAgXCJMZW5ndGhcIixcbiAgeyBtaW46IDAuMSwgbWF4OiAxMCB9LFxuKTtcblxuZm9udC5tYWtlX3ZhcmlhYmxlKFxuICBcInRvdWNoX3NpemVcIixcbiAgXCJUb3VjaCBGb250IFNpemVcIixcbiAgXCJGb250IHNpemUgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50cyBmb3IgdG91Y2ggZGV2aWNlc1wiLFxuICBcIjEuMXJlbVwiLFxuICBcIjEuMXJlbVwiLFxuICBcIkxlbmd0aFwiLFxuICB7IG1pbjogMC4xLCBtYXg6IDEwIH0sXG4pO1xuIiwiaW1wb3J0IHsgQmFzZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IHN5bmNfcmVzb2x2ZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHsgZXJyLCBvaywgdHlwZSBPcHRpb24sIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgdHlwZSB7IFN0YXRlLCBTdGF0ZVN1YiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN0YXRlXCI7XG5pbXBvcnQgXCIuL3NoYXJlZFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1PcHRpb25zIHt9XG5cbi8qKkNvbG9ycyBmb3IgZm9ybSBlbGVtZW50cyB0aGF0IGhhdmUgc2VsZWN0YWJsZSBjb2xvcnMqL1xuZXhwb3J0IGNvbnN0IEZvcm1Db2xvcnMgPSB7XG4gIE5vbmU6IFwibm9uZVwiLFxuICBCbGFjazogXCJibGFja1wiLFxuICBHcmVlbjogXCJncmVlblwiLFxuICBSZWQ6IFwicmVkXCIsXG4gIEJsdWU6IFwiYmx1ZVwiLFxuICBZZWxsb3c6IFwieWVsbG93XCIsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgRm9ybUNvbG9ycyA9ICh0eXBlb2YgRm9ybUNvbG9ycylba2V5b2YgdHlwZW9mIEZvcm1Db2xvcnNdO1xuXG4vKipTaGFyZWQgY29tcG9uZW50IGNsYXNzIGZvciBvdGhlciBjb21wb25lbnRzIHRvIGluaGVyaXQgZnJvbSovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRm9ybUVsZW1lbnQgZXh0ZW5kcyBCYXNlIHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJAYWJzdHJhY3RAXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gIHN0YXRpYyBhcHBseV9vcHRpb25zKF9lbGVtZW50OiBGb3JtRWxlbWVudCwgX29wdGlvbnM6IEZvcm1PcHRpb25zKSB7fVxufVxuXG4vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4vLyAgICAgX18gICAgICBfXyAgICAgXyAgICAgXyAgICBfIF9fX19fXyAgIF9fX19fICBfX19fX18gICAgICAgICAgX19fX19cbi8vICAgICBcXCBcXCAgICAvIC9cXCAgIHwgfCAgIHwgfCAgfCB8ICBfX19ffCB8ICBfXyBcXHwgIF9fX198ICAgL1xcICAgfCAgX18gXFxcbi8vICAgICAgXFwgXFwgIC8gLyAgXFwgIHwgfCAgIHwgfCAgfCB8IHxfXyAgICB8IHxfXykgfCB8X18gICAgIC8gIFxcICB8IHwgIHwgfFxuLy8gICAgICAgXFwgXFwvIC8gL1xcIFxcIHwgfCAgIHwgfCAgfCB8ICBfX3wgICB8ICBfICAvfCAgX198ICAgLyAvXFwgXFwgfCB8ICB8IHxcbi8vICAgICAgICBcXCAgLyBfX19fIFxcfCB8X19ffCB8X198IHwgfF9fX18gIHwgfCBcXCBcXHwgfF9fX18gLyBfX19fIFxcfCB8X198IHxcbi8vICAgICAgICAgXFwvXy8gICAgXFxfXFxfX19fX19cXF9fX18vfF9fX19fX3wgfF98ICBcXF9cXF9fX19fXy9fLyAgICBcXF9cXF9fX19fL1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1WYWx1ZU9wdGlvbnM8XG4gIFJULFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtT3B0aW9ucyB7XG4gIC8qKklEIGZvcm0gZm9ybSBlbGVtZW50ICovXG4gIGlkPzogSUQ7XG4gIC8qKlZhbHVlIGZvciBmb3JtIGVsZW1lbnQgKi9cbiAgdmFsdWU/OiBSVDtcbiAgdmFsdWVfYnlfc3RhdGU/OiBTdGF0ZTxSVCwgT3B0aW9uPHt9PiwgUlQ+O1xuICAvKipMb25nZXIgZGVzY3JpcHRpb24gd2hhdCBmb3JtIGVsZW1lbnQgZG9lcyAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqQ2hhbmdlIGxpc3RlbmVyIGZ1bmN0aW9uKi9cbiAgY2hhbmdlPzogKHZhbDogUlQpID0+IHZvaWQ7XG59XG5cbi8qKlNoYXJlZCBjbGFzcyBmb3IgYWxsIGNvbXBvbmVudHMgd2l0aCB2YWx1ZXMqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZvcm1WYWx1ZTxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1FbGVtZW50IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJAYWJzdHJhY3RAXCI7XG4gIH1cblxuICBzdGF0aWMgYXBwbHlfb3B0aW9uczxSVCwgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICAgIGVsZW1lbnQ6IEZvcm1WYWx1ZTxSVCwgSUQ+LFxuICAgIG9wdGlvbnM6IEZvcm1WYWx1ZU9wdGlvbnM8UlQsIElEPixcbiAgKSB7XG4gICAgaWYgKG9wdGlvbnMuZGVzY3JpcHRpb24pIGVsZW1lbnQuZGVzY3JpcHRpb24gPSBvcHRpb25zLmRlc2NyaXB0aW9uO1xuICAgIGlmIChvcHRpb25zLnZhbHVlX2J5X3N0YXRlKSBlbGVtZW50LnZhbHVlX2J5X3N0YXRlID0gb3B0aW9ucy52YWx1ZV9ieV9zdGF0ZTtcbiAgICBlbHNlIGlmIChvcHRpb25zLnZhbHVlICE9PSB1bmRlZmluZWQpIGVsZW1lbnQudmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIHN1cGVyLmFwcGx5X29wdGlvbnMoZWxlbWVudCwgb3B0aW9ucyk7XG4gIH1cblxuICByZWFkb25seSBmb3JtX2lkOiBJRDtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmZvcm1faWQgPSBpZCBhcyBJRDtcbiAgfVxuXG4gIHByb3RlY3RlZCBfZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlNldHMgdGhlIGN1cnJlbnQgbGFiZWwgb2YgdGhlIGVsZW1lbnQqL1xuICBzZXQgZGVzY3JpcHRpb24odGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGVzY3JpcHRpb24gPSB0ZXh0O1xuICB9XG4gIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kZXNjcmlwdGlvbiB8fCBcIlwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9idWZmZXI/OiBSVDtcbiAgZ2V0IGJ1ZmZlcigpOiBSVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2J1ZmZlcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBfc3RhdGU/OiBTdGF0ZTxSVCwgT3B0aW9uPHt9PiwgUlQ+O1xuICAjZnVuYz86IFN0YXRlU3ViPFJlc3VsdDxSVCwgc3RyaW5nPj47XG4gIC8qKlRoaXMgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCovXG4gIHNldCB2YWx1ZV9ieV9zdGF0ZShzdGF0ZTogU3RhdGU8UlQsIE9wdGlvbjx7fT4sIFJUPiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh0aGlzLiNmdW5jKSB0aGlzLmRldGFjaF9zdGF0ZSh0aGlzLiNmdW5jKTtcbiAgICBpZiAoc3RhdGUpIHtcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlKHN0YXRlLCAodmFsKSA9PiB7XG4gICAgICAgIGlmICh2YWwub2spIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsLnZhbHVlO1xuICAgICAgICAgIGlmICh0aGlzLiNlcnJvcikgdGhpcy5lcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIHRoaXMuZXJyb3IgPSB2YWwuZXJyb3I7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlbGF0ZWQgPSBzdGF0ZS5yZWxhdGVkKCk7XG4gICAgICBpZiAocmVsYXRlZC5zb21lKSB0aGlzLnN0YXRlX3JlbGF0ZWQocmVsYXRlZC52YWx1ZSk7XG4gICAgfSBlbHNlIHRoaXMuc3RhdGVfcmVsYXRlZCh7fSk7XG4gICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTtcbiAgfVxuXG4gIC8qKlRoaXMgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCovXG4gIHNldCB2YWx1ZSh2YWw6IFJUKSB7XG4gICAgdGhpcy5fYnVmZmVyID0gdmFsO1xuICAgIHRoaXMubmV3X3ZhbHVlKHZhbCk7XG4gIH1cblxuICAvKipSZXR1cm5zIHZhbHVlIG9mIHRoZSBjb21wb25lbnQqL1xuICBnZXQgdmFsdWUoKTogUmVzdWx0PFJULCBzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVcbiAgICAgID8gZXJyKFwiU3RhdGUgYmFzZWQgY29tcG9uZW50XCIpXG4gICAgICA6IHR5cGVvZiB0aGlzLl9idWZmZXIgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyBlcnIoXCJObyB2YWx1ZSB5ZXRcIilcbiAgICAgICAgOiBvayh0aGlzLl9idWZmZXIpO1xuICB9XG5cbiAgI2Vycm9yID0gZmFsc2U7XG4gIHNldCBlcnJvcihlcnI6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHRoaXMubmV3X2Vycm9yKGVycik7XG4gICAgICB0aGlzLiNlcnJvciA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLiNlcnJvcikge1xuICAgICAgdGhpcy5jbGVhcl9lcnJvcigpO1xuICAgICAgdGhpcy4jZXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipDbGVhcnMgdGhlIHZhbHVlIGFuZCBlcnJvciBvZiB0aGUgY29tcG9uZW50IGlmIG5vdCBzdGF0ZSBiYXNlZCovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zdGF0ZSkgcmV0dXJuO1xuICAgIHRoaXMuX2J1ZmZlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgdGhpcy5jbGVhcl9lcnJvcigpO1xuICB9XG5cbiAgLyoqQ2FsbGVkIHdoZW4gdmFsdWUgaXMgc2V0IGJ5IHZhbHVlIHNldHRlciBvciBzdGF0ZSovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBuZXdfdmFsdWUodmFsOiBSVCk6IHZvaWQ7XG5cbiAgLyoqQ2xlYXJzIGZvcm0gZWxlbWVudCBncmFwaGljYWxseSovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjbGVhcl92YWx1ZSgpOiB2b2lkO1xuXG4gIC8qKkNhbGxlZCB3aGVuIGVycm9yIGlzIHNldCBieSBlcnJvciBvciBzdGF0ZSovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBuZXdfZXJyb3IodmFsOiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKkNhbGxlZCB3aGVuIGVycm9yIGlzIGNsZWFyZWQgYnkgZXJyb3Igb3Igc3RhdGUqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY2xlYXJfZXJyb3IoKTogdm9pZDtcblxuICAvKipDYWxsZWQgd2hlbiBzdGF0ZSBoYXMgcmVsYXRlZCBpbmZvcm1hdGlvbiAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhdGVfcmVsYXRlZChyZWxhdGVkOiB7fSk6IHZvaWQ7XG59XG5cbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbi8vICAgICBfXyAgICAgIF9fICAgICBfICAgICBfICAgIF8gX19fX19fICBfXyAgICAgICAgICBfX19fX19fICBfX19fXyBfX19fX19fIF9fX19fX1xuLy8gICAgIFxcIFxcICAgIC8gL1xcICAgfCB8ICAgfCB8ICB8IHwgIF9fX198IFxcIFxcICAgICAgICAvIC8gIF9fIFxcfF8gICBffF9fICAgX198ICBfX19ffFxuLy8gICAgICBcXCBcXCAgLyAvICBcXCAgfCB8ICAgfCB8ICB8IHwgfF9fICAgICBcXCBcXCAgL1xcICAvIC98IHxfXykgfCB8IHwgICAgfCB8ICB8IHxfX1xuLy8gICAgICAgXFwgXFwvIC8gL1xcIFxcIHwgfCAgIHwgfCAgfCB8ICBfX3wgICAgIFxcIFxcLyAgXFwvIC8gfCAgXyAgLyAgfCB8ICAgIHwgfCAgfCAgX198XG4vLyAgICAgICAgXFwgIC8gX19fXyBcXHwgfF9fX3wgfF9ffCB8IHxfX19fICAgICBcXCAgL1xcICAvICB8IHwgXFwgXFwgX3wgfF8gICB8IHwgIHwgfF9fX19cbi8vICAgICAgICAgXFwvXy8gICAgXFxfXFxfX19fX19cXF9fX18vfF9fX19fX3wgICAgIFxcLyAgXFwvICAgfF98ICBcXF9cXF9fX19ffCAgfF98ICB8X19fX19ffFxuLyoqU2hhcmVkIGNsYXNzIGZvciBhbGwgY29tcG9uZW50cyB3aXRoIHZhbHVlcyovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRm9ybVZhbHVlV3JpdGU8XG4gIFJULFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtVmFsdWU8UlQsIElEPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiQGFic3RyYWN0QFwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhcm5faW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICN3YXJuX3RpbWVvdXQ/OiBudW1iZXI7XG4gICNjaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7XG4gICNjaGFuZ2U/OiAodmFsOiBSVCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMud2Fybl9pbnB1dC5uYW1lID0gXCJ2YWxcIjtcbiAgfVxuXG4gIHNldCBjaGFuZ2UoZnVuYzogKHZhbDogUlQpID0+IHZvaWQpIHtcbiAgICB0aGlzLiNjaGFuZ2UgPSBmdW5jO1xuICB9XG4gIGdldCBjaGFuZ2UoKTogKCh2YWw6IFJUKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2NoYW5nZTtcbiAgfVxuXG4gIC8qKlJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBjb21wb25lbnQgaWYgaXQgaGFzIGNoYW5nZWQqL1xuICBnZXQgY2hhbmdlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jY2hhbmdlZDtcbiAgfVxuXG4gIHdhcm4obWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy53YXJuX2lucHV0LnNldEN1c3RvbVZhbGlkaXR5KG1lc3NhZ2UpO1xuICAgIHRoaXMud2Fybl9pbnB1dC5yZXBvcnRWYWxpZGl0eSgpO1xuICAgIGlmICh0aGlzLiN3YXJuX3RpbWVvdXQpIGNsZWFyVGltZW91dCh0aGlzLiN3YXJuX3RpbWVvdXQpO1xuICAgIHRoaXMuI3dhcm5fdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy53YXJuX2lucHV0LnNldEN1c3RvbVZhbGlkaXR5KFwiXCIpO1xuICAgICAgdGhpcy53YXJuX2lucHV0LnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgfSwgNTAwMCk7XG4gIH1cblxuICAvKipGdW5jdGlvbiB0byBsaW1pdCB2YWx1ZSBlbnRlcmVkICovXG4gIHByb3RlY3RlZCBsaW1pdF92YWx1ZSh2YWw6IFJUKTogUHJvbWlzZUxpa2U8UmVzdWx0PFJULCBzdHJpbmc+PiB7XG4gICAgaWYgKHRoaXMuX3N0YXRlKSB7XG4gICAgICBpZiAodGhpcy5fc3RhdGUud3JpdGFibGUpIHJldHVybiB0aGlzLl9zdGF0ZS5saW1pdCh2YWwpO1xuICAgICAgZWxzZSByZXR1cm4gc3luY19yZXNvbHZlKGVycihcIk5vdCB3cml0YWJsZVwiKSk7XG4gICAgfSBlbHNlIHJldHVybiBzeW5jX3Jlc29sdmUob2sodmFsKSk7XG4gIH1cblxuICAvKipGdW5jdGlvbiB0byBjaGVjayB2YWx1ZSAqL1xuICBwcm90ZWN0ZWQgY2hlY2tfdmFsdWUodmFsOiBSVCk6IFByb21pc2VMaWtlPFJlc3VsdDxSVCwgc3RyaW5nPj4ge1xuICAgIGlmICh0aGlzLl9zdGF0ZSkge1xuICAgICAgaWYgKHRoaXMuX3N0YXRlLndyaXRhYmxlKSByZXR1cm4gdGhpcy5fc3RhdGUuY2hlY2sodmFsKTtcbiAgICAgIGVsc2UgcmV0dXJuIHN5bmNfcmVzb2x2ZShlcnIoXCJOb3Qgd3JpdGFibGVcIikpO1xuICAgIH0gZWxzZSByZXR1cm4gc3luY19yZXNvbHZlKG9rKHZhbCkpO1xuICB9XG5cbiAgLyoqRnVuY3Rpb24gdG8gdXBkYXRlIHZhbHVlKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNldF92YWx1ZV9saW1pdCh2YWw6IFJUKTogUHJvbWlzZTxSZXN1bHQ8UlQsIHN0cmluZz4+IHtcbiAgICBjb25zdCBsaW1pdGVkID0gYXdhaXQgdGhpcy5saW1pdF92YWx1ZSh2YWwpO1xuICAgIGlmIChsaW1pdGVkLmVycikge1xuICAgICAgdGhpcy53YXJuKGxpbWl0ZWQuZXJyb3IpO1xuICAgICAgcmV0dXJuIGxpbWl0ZWQ7XG4gICAgfVxuICAgIHRoaXMuI3NldF92YWx1ZShsaW1pdGVkLnZhbHVlKTtcbiAgICByZXR1cm4gbGltaXRlZDtcbiAgfVxuXG4gIC8qKkZ1bmN0aW9uIHRvIHVwZGF0ZSB2YWx1ZSovXG4gIHByb3RlY3RlZCBhc3luYyBzZXRfdmFsdWVfY2hlY2sodmFsOiBSVCk6IFByb21pc2U8UmVzdWx0PFJULCBzdHJpbmc+PiB7XG4gICAgY29uc3QgY2hlY2tlZCA9IGF3YWl0IHRoaXMuY2hlY2tfdmFsdWUodmFsKTtcbiAgICBpZiAoY2hlY2tlZC5lcnIpIHtcbiAgICAgIHRoaXMud2FybihjaGVja2VkLmVycm9yKTtcbiAgICAgIHJldHVybiBjaGVja2VkO1xuICAgIH1cbiAgICB0aGlzLiNzZXRfdmFsdWUoY2hlY2tlZC52YWx1ZSk7XG4gICAgcmV0dXJuIGNoZWNrZWQ7XG4gIH1cblxuICAjc2V0X3ZhbHVlKHZhbDogUlQpIHtcbiAgICBpZiAodGhpcy5fYnVmZmVyID09PSB2YWwpIHRoaXMubmV3X3ZhbHVlKHZhbCk7XG4gICAgaWYgKHRoaXMuI2NoYW5nZSlcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuI2NoYW5nZSh2YWwpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHdoaWxlIHVwZGF0aW5nIGNoYW5nZSBsaXN0ZW5lclwiLCBlKTtcbiAgICAgIH1cbiAgICBpZiAodGhpcy5fc3RhdGUpIHtcbiAgICAgIGNvbnN0IGJ1ZmYgPSB0aGlzLl9idWZmZXI7XG4gICAgICB0aGlzLl9zdGF0ZS53cml0ZSEodmFsKS50aGVuKChlcnIpID0+IHtcbiAgICAgICAgaWYgKGVyci5lcnIpIHtcbiAgICAgICAgICBpZiAoYnVmZiAhPT0gdW5kZWZpbmVkKSB0aGlzLm5ld192YWx1ZShidWZmKTtcbiAgICAgICAgICB0aGlzLndhcm4oZXJyLmVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubmV3X3ZhbHVlKHZhbCk7XG4gICAgICB0aGlzLl9idWZmZXIgPSB2YWw7XG4gICAgICB0aGlzLiNjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb24gfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHtcbiAgRm9ybUNvbG9ycyxcbiAgRm9ybVZhbHVlLFxuICBGb3JtVmFsdWVXcml0ZSxcbiAgdHlwZSBGb3JtVmFsdWVPcHRpb25zLFxufSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi4vLi4vc2hhcmVkXCI7XG5pbXBvcnQgXCIuL2J1dHRvbi5zY3NzXCI7XG5cbmludGVyZmFjZSBGb3JtQnV0dG9uT3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxib29sZWFuLCBJRD4ge1xuICAvKipCdXR0b25zIHRleHQgKi9cbiAgdGV4dD86IHN0cmluZztcbiAgLyoqSWNvbiBmb3IgYnV0dG9uICovXG4gIGljb24/OiBTVkdGdW5jO1xuICAvKipGdW5jdGlvbiB0byBjYWxsIG9uIGJ1dHRvbiBjbGljayAqL1xuICBvbl9jbGljaz86ICgpID0+IHZvaWQ7XG4gIC8qKlNldCB0cnVlIHRvIG1ha2UgYnV0dG9uIHRvZ2dsZSBvbiBjbGljayBpbnN0ZWFkIG9mIG5vcm1hbCAqL1xuICB0b2dnbGU/OiBib29sZWFuO1xuICAvKipDaGFuZ2VzIHRoZSBidXR0b25zIGNvbG9yICovXG4gIGNvbG9yPzogRm9ybUNvbG9ycztcbiAgLyoqQ2VudGVycyB0ZXh0IGFuZCBpY29uICovXG4gIGNlbnRlcj86IGJvb2xlYW47XG59XG5cbmNsYXNzIEZvcm1CdXR0b248SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIGJvb2xlYW4sXG4gIElEXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJidXR0b25cIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI3RleHQ6IEhUTUxTcGFuRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjb25fY2xpY2s/OiAoKSA9PiB2b2lkO1xuICAjdG9nZ2xlPzogYm9vbGVhbjtcbiAgI2ljb24/OiBTVkdTVkdFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG5cbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIjBcIik7XG4gICAgdGhpcy5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuI29uX2NsaWNrKSB0aGlzLiNvbl9jbGljaygpO1xuICAgIH07XG4gICAgdGhpcy5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLnBvaW50ZXJUeXBlICE9PSBcInRvdWNoXCIgJiYgZS5idXR0b24gPT09IDApIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgIGlmICghdGhpcy4jdG9nZ2xlKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0cnVlKTtcbiAgICAgICAgdGhpcy5vbnBvaW50ZXJ1cCA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHRoaXMucmVsZWFzZVBvaW50ZXJDYXB0dXJlKGV2LnBvaW50ZXJJZCk7XG4gICAgICAgICAgaWYgKHRoaXMuI3RvZ2dsZSkgdGhpcy5zZXRfdmFsdWVfY2hlY2soIXRoaXMuYnVmZmVyKTtcbiAgICAgICAgICBlbHNlIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKGZhbHNlKTtcbiAgICAgICAgICB0aGlzLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub250b3VjaHN0YXJ0ID0gKGUpID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpZiAoIXRoaXMuI3RvZ2dsZSkgdGhpcy5zZXRfdmFsdWVfY2hlY2sodHJ1ZSk7XG4gICAgICB0aGlzLm9udG91Y2hlbmQgPSAoZXYpID0+IHtcbiAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmIChldi50YXJnZXRUb3VjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGlmICh0aGlzLiN0b2dnbGUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKCF0aGlzLmJ1ZmZlcik7XG4gICAgICAgICAgZWxzZSB0aGlzLnNldF92YWx1ZV9jaGVjayhmYWxzZSk7XG4gICAgICAgICAgdGhpcy5vbnRvdWNoZW5kID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIHRoaXMub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIHN3aXRjaCAoZS5rZXkpIHtcbiAgICAgICAgY2FzZSBcIiBcIjpcbiAgICAgICAgY2FzZSBcIkVudGVyXCI6IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBpZiAoIXRoaXMuI3RvZ2dsZSkgdGhpcy5zZXRfdmFsdWVfY2hlY2sodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5vbmtleXVwID0gKGUpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoZS5rZXkpIHtcbiAgICAgICAgICAgICAgY2FzZSBcIkVudGVyXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCIgXCI6IHtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jdG9nZ2xlKSB0aGlzLnNldF92YWx1ZV9jaGVjayghdGhpcy5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5zZXRfdmFsdWVfY2hlY2soZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNvbl9jbGljaykgdGhpcy4jb25fY2xpY2soKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbmtleXVwID0gbnVsbDtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlNldHMgdGhlIGN1cnJlbnQgdGV4dCBvZiB0aGUgYnV0dG9uKi9cbiAgc2V0IHRleHQobGFiZWw6IHN0cmluZykge1xuICAgIHRoaXMuI3RleHQudGV4dENvbnRlbnQgPSBsYWJlbDtcbiAgfVxuICBnZXQgdGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy4jdGV4dC50ZXh0Q29udGVudDtcbiAgfVxuXG4gIC8qKkNoYW5nZXMgdGhlIGljb24gb2YgdGhlIGJ1dHRvbiovXG4gIHNldCBpY29uKGljb246IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoaWNvbikgdGhpcy4jaWNvbiA9IHRoaXMuaW5zZXJ0QmVmb3JlKGljb24oKSwgdGhpcy4jdGV4dCk7XG4gICAgZWxzZSBpZiAodGhpcy4jaWNvbikge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLiNpY29uKTtcbiAgICAgIHRoaXMuI2ljb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqRnVuY3Rpb24gdG8gY2FsbCBvbiBidXR0b24gY2xpY2sqL1xuICBzZXQgb25fY2xpY2soZnVuYzogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jb25fY2xpY2sgPSBmdW5jO1xuICB9XG4gIGdldCBvbl9jbGljaygpIHtcbiAgICByZXR1cm4gdGhpcy4jb25fY2xpY2s7XG4gIH1cblxuICAvKipDaGFuZ2VzIHRoZSBjb2xvciBvZiB0aGUgYnV0dG9uKi9cbiAgc2V0IGNvbG9yKGNvbG9yOiBGb3JtQ29sb3JzKSB7XG4gICAgaWYgKGNvbG9yID09PSBGb3JtQ29sb3JzLk5vbmUpIHRoaXMucmVtb3ZlQXR0cmlidXRlKFwiY29sb3JcIik7XG4gICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZShcImNvbG9yXCIsIGNvbG9yKTtcbiAgfVxuXG4gIC8qKkNlbnRlcnMgdGV4dCBhbmQgaWNvbiAqL1xuICBzZXQgY2VudGVyKGNlbnRlcjogYm9vbGVhbikge1xuICAgIGlmIChjZW50ZXIpIHRoaXMuY2xhc3NMaXN0LmFkZChcImNlbnRlclwiKTtcbiAgICBlbHNlIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcImNlbnRlclwiKTtcbiAgfVxuXG4gIGdldCBjZW50ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKFwiY2VudGVyXCIpO1xuICB9XG5cbiAgLyoqQ2FsbGVkIHdoZW4gdmFsdWUgaXMgY2hhbmdlZCAqL1xuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlKSB0aGlzLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XG4gICAgZWxzZSB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy5uZXdfdmFsdWUoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihlcnI6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJUT0RPXCIsIGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKF9yZWxhdGVkOiBPcHRpb248e30+KTogdm9pZCB7fVxuXG4gIC8qKkNoYW5nZXMgd2hldGhlciB0aGUgYnV0dG9uIGlzIG1haW50YWluZWQgb3IgbW9tZW50YXJ5Ki9cbiAgc2V0IHRvZ2dsZSh0b2dnbGU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiN0b2dnbGUgPSBCb29sZWFuKHRvZ2dsZSk7XG4gIH1cbiAgZ2V0IHRvZ2dsZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jdG9nZ2xlO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtQnV0dG9uKTtcblxuLyoqQ3JlYXRlcyBhIGJ1dHRvbiBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2J1dHRvbjxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtQnV0dG9uT3B0aW9uczxJRD4sXG4pOiBGb3JtQnV0dG9uPElEPiB7XG4gIGNvbnN0IGJ1dHQgPSBuZXcgRm9ybUJ1dHRvbjxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnRleHQpIGJ1dHQudGV4dCA9IG9wdGlvbnMudGV4dDtcbiAgICBpZiAob3B0aW9ucy5pY29uKSBidXR0Lmljb24gPSBvcHRpb25zLmljb247XG4gICAgaWYgKG9wdGlvbnMub25fY2xpY2spIGJ1dHQub25fY2xpY2sgPSBvcHRpb25zLm9uX2NsaWNrO1xuICAgIGlmIChvcHRpb25zLnRvZ2dsZSkgYnV0dC50b2dnbGUgPSBvcHRpb25zLnRvZ2dsZTtcbiAgICBpZiAob3B0aW9ucy5jb2xvcikgYnV0dC5jb2xvciA9IG9wdGlvbnMuY29sb3I7XG4gICAgaWYgKG9wdGlvbnMuY2VudGVyKSBidXR0LmNlbnRlciA9IG9wdGlvbnMuY2VudGVyO1xuICAgIEZvcm1WYWx1ZS5hcHBseV9vcHRpb25zKGJ1dHQsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBidXR0O1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHR5cGUgeyBTVkdGdW5jIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3ZnXCI7XG5pbXBvcnQgeyBGb3JtVmFsdWUsIHR5cGUgRm9ybUNvbG9ycywgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vbGFtcC5zY3NzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUxhbXBPcHRpb25zPFxuICBUIGV4dGVuZHMgYm9vbGVhbiB8IG51bWJlcixcbiAgQyBleHRlbmRzIEZvcm1Db2xvcnNbXSxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxULCBJRD4ge1xuICAvKipTZXRzIHRoZSBsYW1wIGNvbG9ycyAqL1xuICBjb2xvcnM6IEM7XG4gIC8qKkxhbXAgdGV4dCAqL1xuICB0ZXh0Pzogc3RyaW5nO1xuICAvKipJY29uIGZvciBsYW1wICovXG4gIGljb24/OiBTVkdGdW5jO1xuICAvKipDZW50ZXJzIHRleHQgYW5kIGljb24gKi9cbiAgY2VudGVyPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIEZvcm1MYW1wPFxuICBUIGV4dGVuZHMgYm9vbGVhbiB8IG51bWJlcixcbiAgQyBleHRlbmRzIEZvcm1Db2xvcnNbXSxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlPFQsIElEPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwibGFtcFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjdGV4dDogSFRNTFNwYW5FbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNpY29uOiBTVkdTVkdFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAjY29sb3JzOiBGb3JtQ29sb3JzW10gPSBbXTtcblxuICAvKipTZXRzIHRoZSBjdXJyZW50IHRleHQgb2YgdGhlIGxhbXAqL1xuICBzZXQgdGV4dChsYWJlbDogc3RyaW5nKSB7XG4gICAgdGhpcy4jdGV4dC50ZXh0Q29udGVudCA9IGxhYmVsO1xuICB9XG4gIGdldCB0ZXh0KCkge1xuICAgIHJldHVybiB0aGlzLiN0ZXh0LnRleHRDb250ZW50O1xuICB9XG5cbiAgLyoqQ2hhbmdlcyB0aGUgaWNvbiBvZiB0aGUgbGFtcCovXG4gIHNldCBpY29uKGljb246IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoaWNvbikgdGhpcy4jaWNvbiA9IHRoaXMuaW5zZXJ0QmVmb3JlKGljb24oKSwgdGhpcy4jdGV4dCk7XG4gICAgZWxzZSBpZiAodGhpcy4jaWNvbikge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLiNpY29uKTtcbiAgICAgIHRoaXMuI2ljb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGxhbXAqL1xuICBzZXQgY29sb3JzKGNvbG9yczogQykge1xuICAgIHRoaXMuI2NvbG9ycyA9IGNvbG9ycztcbiAgICB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlciEpO1xuICB9XG5cbiAgLyoqQ2VudGVycyB0ZXh0IGFuZCBpY29uICovXG4gIHNldCBjZW50ZXIoY2VudGVyOiBib29sZWFuKSB7XG4gICAgaWYgKGNlbnRlcikgdGhpcy5jbGFzc0xpc3QuYWRkKFwiY2VudGVyXCIpO1xuICAgIGVsc2UgdGhpcy5jbGFzc0xpc3QucmVtb3ZlKFwiY2VudGVyXCIpO1xuICB9XG5cbiAgZ2V0IGNlbnRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoXCJjZW50ZXJcIik7XG4gIH1cblxuICAvKipDYWxsZWQgd2hlbiB2YWx1ZSBpcyBjaGFuZ2VkICovXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IG51bWJlciB8IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjb2xvciA9IHRoaXMuI2NvbG9yc1tOdW1iZXIodmFsdWUpXTtcbiAgICBpZiAoY29sb3IpIHRoaXMuc2V0QXR0cmlidXRlKFwiY29sb3JcIiwgY29sb3IpO1xuICAgIGVsc2UgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoXCJjb2xvclwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShcImNvbG9yXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihlcnI6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtTGFtcCk7XG5cbi8qKkNyZWF0ZXMgYSBidXR0b24gZm9ybSBlbGVtZW50ICovXG5mdW5jdGlvbiBmcm9tPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1MYW1wT3B0aW9uczxcbiAgICBudW1iZXIsXG4gICAgW0Zvcm1Db2xvcnMsIEZvcm1Db2xvcnMsIEZvcm1Db2xvcnMsIC4uLkZvcm1Db2xvcnNbXV0sXG4gICAgSURcbiAgPixcbik6IEZvcm1MYW1wPG51bWJlciwgW0Zvcm1Db2xvcnMsIEZvcm1Db2xvcnMsIEZvcm1Db2xvcnMsIC4uLkZvcm1Db2xvcnNbXV0sIElEPjtcbmZ1bmN0aW9uIGZyb208SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybUxhbXBPcHRpb25zPGJvb2xlYW4sIFtGb3JtQ29sb3JzLCBGb3JtQ29sb3JzXSwgSUQ+LFxuKTogRm9ybUxhbXA8Ym9vbGVhbiwgW0Zvcm1Db2xvcnMsIEZvcm1Db2xvcnNdLCBJRD47XG5mdW5jdGlvbiBmcm9tPFxuICBUIGV4dGVuZHMgYm9vbGVhbiB8IG51bWJlcixcbiAgQyBleHRlbmRzIEZvcm1Db2xvcnNbXSxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+KG9wdGlvbnM/OiBGb3JtTGFtcE9wdGlvbnM8VCwgQywgSUQ+KTogRm9ybUxhbXA8VCwgQywgSUQ+IHtcbiAgY29uc3QgbGFtcCA9IG5ldyBGb3JtTGFtcDxULCBDLCBJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGxhbXAuY29sb3JzID0gb3B0aW9ucy5jb2xvcnM7XG4gICAgaWYgKG9wdGlvbnMudGV4dCkgbGFtcC50ZXh0ID0gb3B0aW9ucy50ZXh0O1xuICAgIGlmIChvcHRpb25zLmljb24pIGxhbXAuaWNvbiA9IG9wdGlvbnMuaWNvbjtcbiAgICBpZiAob3B0aW9ucy5jZW50ZXIpIGxhbXAuY2VudGVyID0gb3B0aW9ucy5jZW50ZXI7XG4gICAgRm9ybVZhbHVlLmFwcGx5X29wdGlvbnMobGFtcCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGxhbXA7XG59XG5cbi8qKkNyZWF0ZXMgYSBidXR0b24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgY29uc3QgZm9ybV9sYW1wID0gZnJvbTtcbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb24gfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybUNvbG9ycywgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL3N3aXRjaC5zY3NzXCI7XG5cbmludGVyZmFjZSBGb3JtU3dpdGNoT3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxib29sZWFuLCBJRD4ge1xuICAvKipJY29uIHRvIHVzZSBmb3IgbGVmdCBzaWRlKi9cbiAgaWNvbj86IFNWR0Z1bmM7XG4gIC8qKkNvbG9yIHdoZW4gc3dpdGNoIGlzIG9uICovXG4gIG9uX2NvbG9yPzogRm9ybUNvbG9ycztcbiAgLyoqQ29sb3Igd2hlbiBzd2l0Y2ggaXMgb2ZmICovXG4gIG9mZl9jb2xvcj86IEZvcm1Db2xvcnM7XG59XG5cbmV4cG9ydCBjbGFzcyBGb3JtU3dpdGNoPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFxuICBib29sZWFuLFxuICBJRFxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwic3dpdGNoXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNzd2l0Y2g6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI2ljb246IFNWR1NWR0VsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICNwcmV2ZW50X2NsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcblxuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLiNzd2l0Y2guc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgIHRoaXMuI3N3aXRjaC5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgICBjYXNlIFwiRW50ZXJcIjpcbiAgICAgICAgY2FzZSBcIiBcIjoge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMub25rZXl1cCA9IChlKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgICAgICBjYXNlIFwiIFwiOiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2soIXRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbmtleXVwID0gbnVsbDtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuI3N3aXRjaC5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmJ1dHRvbiA9PT0gMCkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICAgICAgdGhpcy4jc3dpdGNoLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgbGV0IGhhc19tb3ZlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLiNzd2l0Y2gub25wb2ludGVybW92ZSA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGlmIChoYXNfbW92ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJveCA9IHRoaXMuI3N3aXRjaC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IG1pZF9jb3JkID0gYm94LnggKyBib3gud2lkdGggLyAyO1xuICAgICAgICAgICAgaWYgKGV2LmNsaWVudFggPiBtaWRfY29yZCkge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmJ1ZmZlcikgdGhpcy5zZXRfdmFsdWVfY2hlY2soZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBNYXRoLmFicyhlLmNsaWVudFggLSBldi5jbGllbnRYKSA+IDEwIHx8XG4gICAgICAgICAgICBNYXRoLmFicyhlLmNsaWVudFkgLSBldi5jbGllbnRZKSA+IDEwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBoYXNfbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jc3dpdGNoLm9ucG9pbnRlcnVwID0gKGV2KSA9PiB7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgaWYgKCFoYXNfbW92ZWQpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKCF0aGlzLmJ1ZmZlcik7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgICB0aGlzLiNzd2l0Y2gub25wb2ludGVybW92ZSA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuI3N3aXRjaC5vbmNsaWNrID0gKGUpID0+IGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmICh0aGlzLiNwcmV2ZW50X2NsaWNrKSByZXR1cm4gKHRoaXMuI3ByZXZlbnRfY2xpY2sgPSBmYWxzZSk7XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayghdGhpcy5idWZmZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH07XG4gIH1cblxuICAvKipDaGFuZ2VzIHRoZSBpY29uIG9mIHRoZSBzd2l0Y2gqL1xuICBzZXQgaWNvbihpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGljb24pIHRoaXMuI2ljb24gPSB0aGlzLmluc2VydEJlZm9yZShpY29uKCksIHRoaXMuI3N3aXRjaCk7XG4gICAgZWxzZSBpZiAodGhpcy4jaWNvbikge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLiNpY29uKTtcbiAgICAgIHRoaXMuI2ljb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgc2V0IG9uX2NvbG9yKGNvbG9yOiBGb3JtQ29sb3JzKSB7XG4gICAgaWYgKGNvbG9yID09PSBGb3JtQ29sb3JzLk5vbmUpIHRoaXMuI3N3aXRjaC5yZW1vdmVBdHRyaWJ1dGUoXCJvbi1jb2xvclwiKTtcbiAgICBlbHNlIHRoaXMuI3N3aXRjaC5zZXRBdHRyaWJ1dGUoXCJvbi1jb2xvclwiLCBjb2xvcik7XG4gIH1cbiAgc2V0IG9mZl9jb2xvcihjb2xvcjogRm9ybUNvbG9ycykge1xuICAgIGlmIChjb2xvciA9PT0gRm9ybUNvbG9ycy5Ob25lKSB0aGlzLiNzd2l0Y2gucmVtb3ZlQXR0cmlidXRlKFwib2ZmLWNvbG9yXCIpO1xuICAgIGVsc2UgdGhpcy4jc3dpdGNoLnNldEF0dHJpYnV0ZShcIm9mZi1jb2xvclwiLCBjb2xvcik7XG4gIH1cbiAgc2V0IGVycm9yX2NvbG9yKGNvbG9yOiBGb3JtQ29sb3JzKSB7XG4gICAgaWYgKGNvbG9yID09PSBGb3JtQ29sb3JzLk5vbmUpIHRoaXMuI3N3aXRjaC5yZW1vdmVBdHRyaWJ1dGUoXCJlcnJvci1jb2xvclwiKTtcbiAgICBlbHNlIHRoaXMuI3N3aXRjaC5zZXRBdHRyaWJ1dGUoXCJlcnJvci1jb2xvclwiLCBjb2xvcik7XG4gIH1cblxuICAvKipDYWxsZWQgd2hlbiB2YWx1ZSBpcyBjaGFuZ2VkICovXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUpIHRoaXMuI3N3aXRjaC5jbGFzc0xpc3QuYWRkKFwib25cIik7XG4gICAgZWxzZSB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LnJlbW92ZShcIm9uXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMubmV3X3ZhbHVlKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX2Vycjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy4jc3dpdGNoLmNsYXNzTGlzdC5hZGQoXCJlcnJvclwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHtcbiAgICB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LnJlbW92ZShcImVycm9yXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtU3dpdGNoKTtcblxuLyoqQ3JlYXRlcyBhIHN3aXRjaCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3N3aXRjaDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtU3dpdGNoT3B0aW9uczxJRD4sXG4pOiBGb3JtU3dpdGNoPElEPiB7XG4gIGNvbnN0IHN3aXQgPSBuZXcgRm9ybVN3aXRjaDxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmljb24pIHN3aXQuaWNvbiA9IG9wdGlvbnMuaWNvbjtcbiAgICBpZiAob3B0aW9ucy5vbl9jb2xvcikgc3dpdC5vbl9jb2xvciA9IG9wdGlvbnMub25fY29sb3I7XG4gICAgaWYgKG9wdGlvbnMub2ZmX2NvbG9yKSBzd2l0Lm9mZl9jb2xvciA9IG9wdGlvbnMub2ZmX2NvbG9yO1xuICAgIEZvcm1WYWx1ZVdyaXRlLmFwcGx5X29wdGlvbnMoc3dpdCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHN3aXQ7XG59XG4iLCJpbXBvcnQgeyBBY2Nlc3NUeXBlcyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IGVyciwgb2ssIE9wdGlvbiwgUmVzdWx0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgeyBGb3JtVmFsdWUgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi9ncm91cF9iYXNlLnNjc3NcIjtcblxuLyoqRGlmZmVyZW50IGJvcmRlciBzdHlsZXMgZm9yIHRoZSBjb21wb25lbnQgZ3JvdXAqL1xuZXhwb3J0IGNvbnN0IEZvcm1Hcm91cEJvcmRlclN0eWxlID0ge1xuICBOb25lOiBcIm5vbmVcIixcbiAgSW5zZXQ6IFwiaW5zZXRcIixcbiAgT3V0c2V0OiBcIm91dHNldFwiLFxuICBMaW5lOiBcImxpbmVcIixcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBGb3JtR3JvdXBCb3JkZXJTdHlsZSA9XG4gICh0eXBlb2YgRm9ybUdyb3VwQm9yZGVyU3R5bGUpW2tleW9mIHR5cGVvZiBGb3JtR3JvdXBCb3JkZXJTdHlsZV07XG5cbmV4cG9ydCB0eXBlIEdyb3VwRXh0cmFjdFZhbHM8QXJyIGV4dGVuZHMgYW55W10+ID0gQXJyIGV4dGVuZHMgW1xuICBpbmZlciBIZWFkLFxuICAuLi5pbmZlciBUYWlsLFxuXVxuICA/IEhlYWQgZXh0ZW5kcyBGb3JtVmFsdWU8aW5mZXIgVCwgaW5mZXIgSUQ+XG4gICAgPyBbRm9ybVZhbHVlPFQsIElEPiwgLi4uR3JvdXBFeHRyYWN0VmFsczxUYWlsPl1cbiAgICA6IFsuLi5Hcm91cEV4dHJhY3RWYWxzPFRhaWw+XVxuICA6IFtdO1xuXG5leHBvcnQgdHlwZSBHcm91cFRvS2V5VmFsPEFyciBleHRlbmRzIEZvcm1WYWx1ZTxhbnksIGFueT5bXT4gPSB7XG4gIFtLIGluIEFycltudW1iZXJdIGFzIEtbXCJmb3JtX2lkXCJdXTogSyBleHRlbmRzIEZvcm1WYWx1ZTxpbmZlciBULCBhbnk+XG4gICAgPyBUXG4gICAgOiBuZXZlcjtcbn07XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGb3JtR3JvdXBCYXNlPFxuICBSVCBleHRlbmRzIG9iamVjdCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlPFJULCBJRD4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcIkBhYnN0cmFjdEBcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIHZhbHVlX2VsZW1lbnRzOiBNYXA8c3RyaW5nLCBGb3JtVmFsdWU8YW55LCBhbnk+PiA9IG5ldyBNYXAoKTtcblxuICAvKipUaGlzIHBsYWNlcyB0aGUgZ3JvdXAgYXQgYW4gYWJzb2x1dGUgcG9zaXRpb24gaW4gb25lIG9mIHRoZSBjb3JuZXJzIG9mIHRoZSBjb250YWluZXIqL1xuICBzZXQgYm9yZGVyKGJvcmRlcjogRm9ybUdyb3VwQm9yZGVyU3R5bGUgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICBGb3JtR3JvdXBCb3JkZXJTdHlsZS5JbnNldCxcbiAgICAgIEZvcm1Hcm91cEJvcmRlclN0eWxlLk91dHNldCxcbiAgICApO1xuICAgIGlmIChib3JkZXIgJiYgYm9yZGVyICE9PSBGb3JtR3JvdXBCb3JkZXJTdHlsZS5Ob25lKVxuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKGJvcmRlcik7XG4gIH1cblxuICBzZXQgbWF4X2hlaWdodChoZWlnaHQ6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoXCItLW1heF9oZWlnaHRcIiwgaGVpZ2h0ID8gaGVpZ2h0ICsgXCJyZW1cIiA6IFwibm9uZVwiKTtcbiAgICBpZiAoaGVpZ2h0KSB0aGlzLmNsYXNzTGlzdC5hZGQoXCJtYXhfaGVpZ2h0XCIpO1xuICAgIGVsc2UgdGhpcy5jbGFzc0xpc3QucmVtb3ZlKFwibWF4X2hlaWdodFwiKTtcbiAgfVxuXG4gIHNldCBlbWJlZChlbWJlZDogYm9vbGVhbikge1xuICAgIGlmIChlbWJlZCkgdGhpcy5jbGFzc0xpc3QuYWRkKFwiZW1iZWRcIik7XG4gICAgZWxzZSB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXCJlbWJlZFwiKTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IFJUKSB7XG4gICAgc3VwZXIudmFsdWUgPSB2YWw7XG4gIH1cblxuICAvKipSZXR1cm5zIHZhbHVlIG9mIHRoZSBjb21wb25lbnQqL1xuICBnZXQgdmFsdWUoKTogUmVzdWx0PFJULCBzdHJpbmc+IHtcbiAgICBpZiAodGhpcy5fc3RhdGUpIHJldHVybiBlcnIoXCJTdGF0ZSBiYXNlZCBjb21wb25lbnRcIik7XG4gICAgY29uc3QgcmVzdWx0OiBSVCA9IHt9IGFzIFJUO1xuICAgIGZvciAoY29uc3QgW2tleSwgY29tcF0gb2YgdGhpcy52YWx1ZV9lbGVtZW50cykge1xuICAgICAgY29uc3QgdmFsID0gY29tcC52YWx1ZTtcbiAgICAgIGlmICh2YWwuZXJyKSByZXR1cm4gZXJyKFwiQ29tcG9uZW50IHdpdGggaWQgXCIgKyBrZXkgKyBcIiBoYXMgbm8gdmFsdWVcIik7XG4gICAgICByZXN1bHRba2V5IGFzIGtleW9mIFJUXSA9IHZhbC52YWx1ZSBhcyBSVFtrZXlvZiBSVF07XG4gICAgfVxuICAgIHJldHVybiBvayhyZXN1bHQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWw6IFJUKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFsKVxuICAgICAgaWYgKHRoaXMudmFsdWVfZWxlbWVudHMuaGFzKGtleSkpXG4gICAgICAgIHRoaXMudmFsdWVfZWxlbWVudHMuZ2V0KGtleSkhLnZhbHVlID0gdmFsW2tleSBhcyBrZXlvZiBSVF07XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjb21wIG9mIHRoaXMudmFsdWVfZWxlbWVudHMudmFsdWVzKCkpIGNvbXAuY2xlYXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoZXJyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKF9yZWxhdGVkOiBPcHRpb248e30+KTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBvbl9hY2Nlc3MoYWNjZXNzOiBBY2Nlc3NUeXBlcyk6IHZvaWQge1xuICAgIHN3aXRjaCAoYWNjZXNzKSB7XG4gICAgICBjYXNlIEFjY2Vzc1R5cGVzLlJlYWQ6IHtcbiAgICAgICAgdGhpcy50YWJJbmRleCA9IDA7XG4gICAgICAgIHRoaXMub25mb2N1cyA9ICgpID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmZvY3VzKCk7XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBBY2Nlc3NUeXBlcy5Xcml0ZToge1xuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShcInRhYkluZGV4XCIpO1xuICAgICAgICB0aGlzLm9uZm9jdXMgPSBudWxsO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHsgdHlwZSBQcmV0dGlmeSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnQsIEZvcm1WYWx1ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vZ3JvdXAuc2Nzc1wiO1xuaW1wb3J0IHtcbiAgRm9ybUdyb3VwQmFzZSxcbiAgRm9ybUdyb3VwQm9yZGVyU3R5bGUsXG4gIEdyb3VwRXh0cmFjdFZhbHMsXG4gIEdyb3VwVG9LZXlWYWwsXG59IGZyb20gXCIuL2dyb3VwX2Jhc2VcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtR3JvdXBPcHRpb25zPFxuICBMIGV4dGVuZHMgRm9ybUVsZW1lbnRbXSxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxULCBJRD4ge1xuICAvKipFbGVtZW50cyB0byBhZGQgdG8gdGhlIGdyb3VwKi9cbiAgZWxlbWVudHM/OiBbLi4uTF07XG4gIC8qKkJvcmRlciBzdHlsZSBmb3IgZ3JvdXAqL1xuICBib3JkZXI/OiBGb3JtR3JvdXBCb3JkZXJTdHlsZTtcbiAgLyoqUmVtb3ZlcyBwYWRkaW5nIHdoZW4gdHJ1ZSBhbGxvd3MgZm9yIHB1dHRpbmcgZ3JvdXBzIGluIGdyb3VwcyB3aXRob3V0IHBhZGRpbmcgYnVpbGRpbmcgdXAgKi9cbiAgZW1iZWQ/OiBib29sZWFuO1xuICAvKipHcm91cCBtYXggaGVpZ2h0IGluIHJlbSwgdW5kZWZpbmVkIG1lYW5zIG5vIGxpbWl0Ki9cbiAgbWF4X2hlaWdodD86IG51bWJlcjtcbiAgLyoqQ29sdW1ucywgdHJ1ZSBpcyBldmVyeXRoaW5nIGluIG9uZSBjb2x1bW5zLCBqdXN0IGEgbnVtYmVyIHdpbGwgbWFrZSByZXBlYXRpbmcgY29sdW1ucyBvZiBtaW5pbXVtIHRoYXQgcmVtIHdpZHRoLCBhbiBhcnJheSB3aWxsIG1ha2UgZXhhY3RseSB0aGF0IG1hbnkgY29sdW1zIHdpdGggc3BlY2lmaWVkIHJlbSB3aWR0aHMgKi9cbiAgY29sdW1uPzogdHJ1ZSB8IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKipSb3dzLCB0cnVlIGlzIGV2ZXJ5dGhpbmcgaW4gb25lIHJvdywganVzdCBhIG51bWJlciB3aWxsIG1ha2UgcmVwZWF0aW5nIHJvd3Mgb2YgbWluaW11bSB0aGF0IHJlbSBoZWlnaHQsIGFuIGFycmF5IHdpbGwgbWFrZSBleGFjdGx5IHRoYXQgbWFueSByb3dzIHdpdGggc3BlY2lmaWVkIHJlbSBoZWlnaHRzICovXG4gIHJvdz86IHRydWUgfCBzdHJpbmcgfCBzdHJpbmdbXTtcbn1cblxuLyoqQ29tcG9uZW50IGdyb3VwIGNsYXNzIHdoaWNoIGFsbG93cyB0byBhZGQgZWxlbWVudHMgYW5kIGNvbnRyb2xzIHRoZSBmbG93IG9mIHRoZSBlbGVtZW50cyovXG5leHBvcnQgY2xhc3MgRm9ybUdyb3VwPFxuICBSVCBleHRlbmRzIG9iamVjdCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybUdyb3VwQmFzZTxSVCwgSUQ+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJncm91cFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcImZsZXgtY29sXCIpO1xuICB9XG5cbiAgc2V0IGNvbHVtbihjb2x1bW46IHRydWUgfCBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcImdyaWQtcm93XCIsIFwiZ3JpZC1jb2xcIiwgXCJmbGV4LXJvd1wiLCBcImZsZXgtY29sXCIpO1xuICAgIGlmIChjb2x1bW4gPT09IHRydWUpIHtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcImZsZXgtY29sXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoXCJncmlkLWNvbFwiKTtcblxuICAgICAgaWYgKHR5cGVvZiBjb2x1bW4gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhpcy5zdHlsZS5ncmlkVGVtcGxhdGVDb2x1bW5zID1cbiAgICAgICAgICBcInJlcGVhdChhdXRvLWZpdCwgbWlubWF4KFwiICsgY29sdW1uICsgXCIsIDFmcikpXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0eWxlLmdyaWRUZW1wbGF0ZUNvbHVtbnMgPSBjb2x1bW5cbiAgICAgICAgICAubWFwKChjb2wpID0+IFwibWlubWF4KFwiICsgY29sICsgXCIsIDFmcilcIilcbiAgICAgICAgICAuam9pbihcIiBcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0IHJvdyhyb3c6IHRydWUgfCBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcImdyaWQtcm93XCIsIFwiZ3JpZC1jb2xcIiwgXCJmbGV4LXJvd1wiLCBcImZsZXgtY29sXCIpO1xuICAgIGlmIChyb3cgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcImZsZXgtcm93XCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoXCJncmlkLXJvd1wiKTtcbiAgICAgIGlmICh0eXBlb2Ygcm93ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuZ3JpZFRlbXBsYXRlUm93cyA9XG4gICAgICAgICAgXCJyZXBlYXQoYXV0by1maXQsIG1pbm1heChcIiArIHJvdyArIFwiLCAxZnIpKVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdHlsZS5ncmlkVGVtcGxhdGVSb3dzID0gcm93XG4gICAgICAgICAgLm1hcCgoY29sKSA9PiBcIm1pbm1heChcIiArIGNvbCArIFwiLCAxZnIpXCIpXG4gICAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldCBlbGVtZW50cyhlbGVtZW50czogRm9ybUVsZW1lbnRbXSkge1xuICAgIGZvciAobGV0IGkgPSAwLCBuID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICBjb25zdCBjb21wID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoY29tcCBpbnN0YW5jZW9mIEZvcm1WYWx1ZSAmJiBjb21wLmZvcm1faWQpIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWVfZWxlbWVudHMuaGFzKGNvbXAuZm9ybV9pZCBhcyBzdHJpbmcpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiRm9ybSBlbGVtZW50IHdpdGggZm9ybSBpZCBcIiArXG4gICAgICAgICAgICAgIGNvbXAuZm9ybV9pZCArXG4gICAgICAgICAgICAgIFwiIGFscmVhZHkgZXhpc3RzIGluIGdyb3VwXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlX2VsZW1lbnRzLnNldChjb21wLmZvcm1faWQgYXMgc3RyaW5nLCBjb21wKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29tcCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGVsZW1lbnRzKCk6IEZvcm1FbGVtZW50W10ge1xuICAgIHJldHVybiBbLi4udGhpcy52YWx1ZV9lbGVtZW50cy52YWx1ZXMoKV07XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1Hcm91cCk7XG5cbi8qKkNyZWF0ZXMgYSBmb3JtIGdyb3VwIHdpdGggZWxlbWVudHMgaW4gYSBjb2x1bW4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2dyb3VwX2NvbDxcbiAgTCBleHRlbmRzIEZvcm1FbGVtZW50W10sXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBUIGV4dGVuZHMgb2JqZWN0ID0gUHJldHRpZnk8UGFydGlhbDxHcm91cFRvS2V5VmFsPEdyb3VwRXh0cmFjdFZhbHM8TD4+Pj4sXG4+KG9wdGlvbnM/OiBGb3JtR3JvdXBPcHRpb25zPEwsIElELCBUPik6IEZvcm1Hcm91cDxULCBJRD4ge1xuICBjb25zdCBzbGlkZSA9IG5ldyBGb3JtR3JvdXA8VCwgSUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5ib3JkZXIpIHNsaWRlLmJvcmRlciA9IG9wdGlvbnMuYm9yZGVyO1xuICAgIGlmIChvcHRpb25zLmVsZW1lbnRzKSBzbGlkZS5lbGVtZW50cyA9IG9wdGlvbnMuZWxlbWVudHM7XG4gICAgaWYgKG9wdGlvbnMubWF4X2hlaWdodCkgc2xpZGUubWF4X2hlaWdodCA9IG9wdGlvbnMubWF4X2hlaWdodDtcbiAgICBpZiAob3B0aW9ucy5lbWJlZCkgc2xpZGUuZW1iZWQgPSBvcHRpb25zLmVtYmVkO1xuICAgIGlmIChvcHRpb25zLmNvbHVtbikgc2xpZGUuY29sdW1uID0gb3B0aW9ucy5jb2x1bW47XG4gICAgZWxzZSBpZiAob3B0aW9ucy5yb3cpIHNsaWRlLnJvdyA9IG9wdGlvbnMucm93O1xuICAgIEZvcm1WYWx1ZS5hcHBseV9vcHRpb25zKHNsaWRlLCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gc2xpZGU7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IG5vZGVfY2xvbmUgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1jb21tb25cIjtcbmltcG9ydCB7XG4gIG1hdGVyaWFsX3VuZm9sZF9sZXNzX3JvdW5kZWQsXG4gIG1hdGVyaWFsX3VuZm9sZF9tb3JlX3JvdW5kZWQsXG59IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWljb25zXCI7XG5pbXBvcnQge1xuICBBTklNQVRJT05fTEVWRUwsXG4gIEFOSU1BVElPTl9TUEVFRCxcbiAgQW5pbWF0aW9uTGV2ZWxzLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi10aGVtZVwiO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnQsIEZvcm1PcHRpb25zIH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7IEZvcm1Hcm91cEJhc2UgfSBmcm9tIFwiLi9ncm91cF9iYXNlXCI7XG5pbXBvcnQgXCIuL2dyb3VwX2NvbGxhcHNlci5zY3NzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUdyb3VwQ29sbGFwc2VyT3B0aW9ucyBleHRlbmRzIEZvcm1PcHRpb25zIHtcbiAgLyoqV2V0aGVyIHRoZSBncm91cCBpcyBjb2xsYXBzZWQgaW5pdGlhbGx5Ki9cbiAgY29sbGFwc2VkPzogYm9vbGVhbjtcbiAgLyoqVGV4dCB0byBzaG93IG9uIHRoZSBjb2xsYXBzZXIgd2hlbiBvcGVuKi9cbiAgb3Blbl90ZXh0Pzogc3RyaW5nO1xuICAvKipUZXh0IHRvIHNob3cgb24gdGhlIGNvbGxhcHNlciB3aGVuIGNsb3NlZCovXG4gIGNsb3NlX3RleHQ/OiBzdHJpbmc7XG59XG5cbmNvbnN0IG9wZW5fdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xub3Blbl90ZXh0LnRleHRDb250ZW50ID0gXCJDb2xsYXBzZVwiO1xuY29uc3QgY2xvc2VfdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuY2xvc2VfdGV4dC50ZXh0Q29udGVudCA9IFwiRXhwYW5kXCI7XG5cbi8qKkNvbXBvbmVudCBncm91cCBjbGFzcyB3aGljaCBhbGxvd3MgdG8gYWRkIGVsZW1lbnRzIGFuZCBjb250cm9scyB0aGUgZmxvdyBvZiB0aGUgZWxlbWVudHMqL1xuZXhwb3J0IGNsYXNzIEZvcm1Hcm91cENvbGxhcHNlciBleHRlbmRzIEZvcm1FbGVtZW50IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJncm91cC1jb2xsYXBzZXJcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI2dyb3VwO1xuICAjY29sbGFwc2VfYnV0dG9uO1xuICAjY29sbGFwc2VkOiBib29sZWFuID0gZmFsc2U7XG4gICNvcGVuX3RleHQgPSBub2RlX2Nsb25lKG9wZW5fdGV4dCk7XG4gICNjbG9zZV90ZXh0ID0gbm9kZV9jbG9uZShjbG9zZV90ZXh0KTtcblxuICBjb25zdHJ1Y3Rvcihncm91cDogRm9ybUdyb3VwQmFzZTxhbnksIGFueT4sIGNvbGxhcHNlZD86IGJvb2xlYW4pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuI2dyb3VwID0gdGhpcy5hcHBlbmRDaGlsZChncm91cCk7XG4gICAgaWYgKGNvbGxhcHNlZCkge1xuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKFwiY29sbGFwc2VkXCIpO1xuICAgICAgdGhpcy4jY29sbGFwc2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uLnRhYkluZGV4ID0gMDtcbiAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24uYXBwZW5kQ2hpbGQoXG4gICAgICBjb2xsYXBzZWQgPyB0aGlzLiNjbG9zZV90ZXh0IDogdGhpcy4jb3Blbl90ZXh0LFxuICAgICk7XG4gICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uLmFwcGVuZENoaWxkKG1hdGVyaWFsX3VuZm9sZF9sZXNzX3JvdW5kZWQoKSk7XG4gICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiAodGhpcy5jb2xsYXBzZWQgPSAhdGhpcy5jb2xsYXBzZWQpO1xuICAgIHRoaXMuI2NvbGxhcHNlX2J1dHRvbi5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkVudGVyXCIgfHwgZS5rZXkgPT09IFwiIFwiKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jb2xsYXBzZWQgPSAhdGhpcy5jb2xsYXBzZWQ7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHNldCBncm91cChncm91cDogRm9ybUdyb3VwQmFzZTxhbnksIGFueT4pIHtcbiAgICBjb25zdCBvbGRfZ3JvdXAgPSB0aGlzLiNncm91cDtcbiAgICB0aGlzLiNncm91cCA9IHRoaXMucmVwbGFjZUNoaWxkKGdyb3VwLCBvbGRfZ3JvdXApO1xuICB9XG5cbiAgZ2V0IGdyb3VwKCk6IEZvcm1Hcm91cEJhc2U8YW55LCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy4jZ3JvdXA7XG4gIH1cblxuICBzZXQgY29sbGFwc2VkKGNvbGxhcHNlZDogYm9vbGVhbikge1xuICAgIGlmIChjb2xsYXBzZWQgJiYgIXRoaXMuI2NvbGxhcHNlZCkge1xuICAgICAgLy8jIEFuaW1hdGlvblxuICAgICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uLnJlcGxhY2VDaGlsZHJlbihcbiAgICAgICAgdGhpcy4jY2xvc2VfdGV4dCxcbiAgICAgICAgbWF0ZXJpYWxfdW5mb2xkX21vcmVfcm91bmRlZCgpLFxuICAgICAgKTtcbiAgICAgIGlmIChBTklNQVRJT05fTEVWRUwuZ2V0KCkudmFsdWUgPT09IEFuaW1hdGlvbkxldmVscy5BbGwpIHtcbiAgICAgICAgdGhpcy4jZ3JvdXAuc3R5bGUub3ZlcmZsb3dZID0gXCJhdXRvXCI7XG4gICAgICAgIGNvbnN0IGZ1bGxfaGVpZ2h0ID0gdGhpcy4jZ3JvdXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ICsgXCJweFwiO1xuICAgICAgICBjb25zdCBhbmltYXRpb24gPSB0aGlzLiNncm91cC5hbmltYXRlKFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHsgbWF4SGVpZ2h0OiBmdWxsX2hlaWdodCB9LFxuICAgICAgICAgICAgeyBtYXhIZWlnaHQ6IFwiMHB4XCIsIHBhZGRpbmdCbG9jazogXCIwcHhcIiB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgZHVyYXRpb246IEFOSU1BVElPTl9TUEVFRC5nZXQoKS52YWx1ZSxcbiAgICAgICAgICAgIGVhc2luZzogXCJlYXNlLWluLW91dFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICAgIGFuaW1hdGlvbi5vbmZpbmlzaCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoXCJjb2xsYXBzZWRcIik7XG4gICAgICAgICAgdGhpcy4jZ3JvdXAuc3R5bGUub3ZlcmZsb3dZID0gXCJcIjtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcImNvbGxhcHNlZFwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFjb2xsYXBzZWQgJiYgdGhpcy4jY29sbGFwc2VkKSB7XG4gICAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXCJjb2xsYXBzZWRcIik7XG4gICAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24ucmVwbGFjZUNoaWxkcmVuKFxuICAgICAgICB0aGlzLiNvcGVuX3RleHQsXG4gICAgICAgIG1hdGVyaWFsX3VuZm9sZF9sZXNzX3JvdW5kZWQoKSxcbiAgICAgICk7XG4gICAgICAvLyMgQW5pbWF0aW9uXG4gICAgICBpZiAoQU5JTUFUSU9OX0xFVkVMLmdldCgpLnZhbHVlID09PSBBbmltYXRpb25MZXZlbHMuQWxsKSB7XG4gICAgICAgIHRoaXMuI2dyb3VwLnN0eWxlLm92ZXJmbG93WSA9IFwiYXV0b1wiO1xuICAgICAgICBjb25zdCBmdWxsX2hlaWdodCA9IHRoaXMuI2dyb3VwLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCArIFwicHhcIjtcbiAgICAgICAgY29uc3QgYW5pbWF0aW9uID0gdGhpcy4jZ3JvdXAuYW5pbWF0ZShcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7IG1heEhlaWdodDogXCIwcHhcIiwgcGFkZGluZ0Jsb2NrOiBcIjBweFwiIH0sXG4gICAgICAgICAgICB7IG1heEhlaWdodDogZnVsbF9oZWlnaHQgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiBBTklNQVRJT05fU1BFRUQuZ2V0KCkudmFsdWUsXG4gICAgICAgICAgICBlYXNpbmc6IFwiZWFzZS1pbi1vdXRcIixcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgICBhbmltYXRpb24ub25maW5pc2ggPSAoKSA9PiAodGhpcy4jZ3JvdXAuc3R5bGUub3ZlcmZsb3dZID0gXCJcIik7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuI2NvbGxhcHNlZCA9IGNvbGxhcHNlZDtcbiAgfVxuICBnZXQgY29sbGFwc2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNjb2xsYXBzZWQ7XG4gIH1cblxuICBzZXQgb3Blbl90ZXh0KHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuI29wZW5fdGV4dC50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH1cblxuICBzZXQgY2xvc2VfdGV4dCh0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLiNjbG9zZV90ZXh0LnRleHRDb250ZW50ID0gdGV4dDtcbiAgfVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybUdyb3VwQ29sbGFwc2VyKTtcblxuLyoqQ3JlYXRlcyBhIGRyb3Bkb3duIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fZ3JvdXBfY29sbGFwc2VyKFxuICBncm91cDogRm9ybUdyb3VwQmFzZTxhbnksIGFueT4sXG4gIG9wdGlvbnM/OiBGb3JtR3JvdXBDb2xsYXBzZXJPcHRpb25zLFxuKTogRm9ybUdyb3VwQ29sbGFwc2VyIHtcbiAgY29uc3Qgc2xpZGUgPSBuZXcgRm9ybUdyb3VwQ29sbGFwc2VyKGdyb3VwLCBvcHRpb25zPy5jb2xsYXBzZWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLm9wZW5fdGV4dCkgc2xpZGUub3Blbl90ZXh0ID0gb3B0aW9ucy5vcGVuX3RleHQ7XG4gICAgaWYgKG9wdGlvbnMuY2xvc2VfdGV4dCkgc2xpZGUuY2xvc2VfdGV4dCA9IG9wdGlvbnMuY2xvc2VfdGV4dDtcbiAgICBGb3JtRWxlbWVudC5hcHBseV9vcHRpb25zKHNsaWRlLCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gc2xpZGU7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IExpc3RGaWVsZCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWxpc3RcIjtcbmltcG9ydCB7IEZvcm1FbGVtZW50IH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vbGlzdF9maWVsZC5zY3NzXCI7XG5cbmV4cG9ydCBjbGFzcyBMaXN0Rm9ybUZpZWxkPFQgZXh0ZW5kcyBGb3JtRWxlbWVudD4gZXh0ZW5kcyBMaXN0RmllbGQge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcImxpc3RmaWVsZFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICBzZXQgZWxlbWVudChjb21wb25lbnQ6IFQpIHtcbiAgICB0aGlzLnJlcGxhY2VDaGlsZHJlbihjb21wb25lbnQpO1xuICB9XG5cbiAgZ2V0IGVsZW1lbnQoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQgYXMgVDtcbiAgfVxufVxuZGVmaW5lX2VsZW1lbnQoTGlzdEZvcm1GaWVsZCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2xpc3RfZmllbGQ8VCBleHRlbmRzIEZvcm1FbGVtZW50PihlbGVtZW50OiBUKSB7XG4gIGNvbnN0IGZpZWxkID0gbmV3IExpc3RGb3JtRmllbGQ8VD4oKTtcbiAgZmllbGQuZWxlbWVudCA9IGVsZW1lbnQ7XG4gIHJldHVybiBmaWVsZDtcbn1cbiIsImltcG9ydCB7IG5vbmUgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU3RhdGVOdW1iZXJSZWxhdGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RhdGVcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi9iYXNlXCI7XG5pbXBvcnQgXCIuL251bWJlcl9iYXNlLnNjc3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtTnVtYmVyT3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFJUID0gbnVtYmVyLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8UlQsIElEPiB7XG4gIC8qKkxvd2VyIGxpbWl0IGZvciBzbGlkZXIgdmFsdWUqL1xuICBtaW4/OiBudW1iZXI7XG4gIC8qKlVwcGVyIGxpbWl0IGZvciBzbGlkZXIgdmFsdWUqL1xuICBtYXg/OiBudW1iZXI7XG4gIC8qKkFtb3VudCBvZiBkZWNpbWFscyB0byBzaG93Ki9cbiAgZGVjaW1hbHM/OiBudW1iZXI7XG4gIC8qKlVuaXQgdG8gdXNlIGZvciBzbGlkZXIqL1xuICB1bml0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1OdW1iZXJXcml0ZU9wdGlvbnM8XG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBSVCA9IG51bWJlcixcbj4gZXh0ZW5kcyBGb3JtTnVtYmVyT3B0aW9uczxJRCwgUlQ+IHtcbiAgLyoqU3RlcCBzaXplLCB1c2UgMCBmb3IgYXV0b21hdGljIHN0ZXAgc2l6ZSovXG4gIHN0ZXA/OiBudW1iZXI7XG4gIC8qKlN0YXJ0IGZvciBzdGVwLCB1c2UgMCBmb3IgYXV0b21hdGljICovXG4gIHN0YXJ0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1TdGVwcGVyQmFzZU9wdGlvbnM8XG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBSVCA9IG51bWJlcixcbj4gZXh0ZW5kcyBGb3JtTnVtYmVyV3JpdGVPcHRpb25zPElELCBSVD4ge1xuICAvKip3ZXRoZXIgdGhlIGV2ZW50cyBhcmUgbGl2ZSBhcyB0aGUgc2xpZGVyIGlzIG1vdmVkIG9yIG9ubHkgd2hlbiBtb3Zpbmcgc3RvcHMgKi9cbiAgbGl2ZT86IGJvb2xlYW47XG4gIC8qKkljb24gdG8gdXNlIGZvciBkZWNyZWFzaW5nIHZhbHVlKi9cbiAgaWNvbl9kZWNyZWFzZT86IFNWR0Z1bmM7XG4gIC8qKkljb24gdG8gdXNlIGZvciBpbmNyZWFzaW5nIHZhbHVlKi9cbiAgaWNvbl9pbmNyZWFzZT86IFNWR0Z1bmM7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGb3JtTnVtYmVyV3JpdGU8XG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBSVCA9IG51bWJlcixcbj4gZXh0ZW5kcyBGb3JtVmFsdWVXcml0ZTxSVCwgSUQ+IHtcbiAgc3RhdGljIGFwcGx5X29wdGlvbnM8UlQsIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgICBlbGVtZW50OiBGb3JtTnVtYmVyV3JpdGU8SUQsIFJUPixcbiAgICBvcHRpb25zOiBGb3JtTnVtYmVyV3JpdGVPcHRpb25zPElELCBSVD4sXG4gICkge1xuICAgIGlmIChvcHRpb25zLnVuaXQpIGVsZW1lbnQudW5pdCA9IG9wdGlvbnMudW5pdDtcbiAgICBpZiAob3B0aW9ucy5kZWNpbWFscykgZWxlbWVudC5kZWNpbWFscyA9IG9wdGlvbnMuZGVjaW1hbHM7XG4gICAgaWYgKG9wdGlvbnMubWluICE9PSB1bmRlZmluZWQpIGVsZW1lbnQubWluID0gb3B0aW9ucy5taW47XG4gICAgaWYgKG9wdGlvbnMubWF4ICE9PSB1bmRlZmluZWQpIGVsZW1lbnQubWF4ID0gb3B0aW9ucy5tYXg7XG4gICAgaWYgKG9wdGlvbnMuc3RlcCkgZWxlbWVudC5zdGVwID0gb3B0aW9ucy5zdGVwO1xuICAgIGlmIChvcHRpb25zLnN0YXJ0KSBlbGVtZW50LnN0YXJ0ID0gb3B0aW9ucy5zdGFydDtcbiAgICBzdXBlci5hcHBseV9vcHRpb25zKGVsZW1lbnQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqU2V0IHRoZSBtaW5pbXVtIHZhbHVlKi9cbiAgYWJzdHJhY3Qgc2V0IG1pbihtaW46IG51bWJlciB8IHVuZGVmaW5lZCk7XG5cbiAgLyoqU2V0IHRoZSBtaW5pbXVtIHZhbHVlKi9cbiAgYWJzdHJhY3Qgc2V0IG1heChtYXg6IG51bWJlciB8IHVuZGVmaW5lZCk7XG5cbiAgLyoqU2V0cyB0aGUgc2l6ZSBvZiBudW1iZXIgY2hhbmdlIHN0ZXBzKi9cbiAgYWJzdHJhY3Qgc2V0IHN0ZXAoc3RlcDogbnVtYmVyIHwgdW5kZWZpbmVkKTtcblxuICAvKipTZXRzIHRoZSBzdGFydCBvZmZzZXQgZm9yIG51bWJlciBzdGVwcyovXG4gIGFic3RyYWN0IHNldCBzdGFydChzdGVwOiBudW1iZXIgfCB1bmRlZmluZWQpO1xuXG4gIC8qKlNldHMgdGhlIGFtb3VudCBvZiBkZWNpbWFscyB0aGUgZWxlbWVudCBjYW4gaGF2ZSovXG4gIGFic3RyYWN0IHNldCBkZWNpbWFscyhkZWM6IG51bWJlciB8IHVuZGVmaW5lZCk7XG5cbiAgLyoqU2V0cyB0aGUgdW5pdCBvZiB0aGUgZWxlbWVudCovXG4gIGFic3RyYWN0IHNldCB1bml0KHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCk7XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQocmVsYXRlZDogUGFydGlhbDxTdGF0ZU51bWJlclJlbGF0ZWQ+KTogdm9pZCB7XG4gICAgaWYgKHJlbGF0ZWQubWluKVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcIm1pblwiLCByZWxhdGVkLm1pbiwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcIm1pblwiKTtcbiAgICBpZiAocmVsYXRlZC5tYXgpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwibWF4XCIsIHJlbGF0ZWQubWF4LCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwibWF4XCIpO1xuICAgIGlmIChyZWxhdGVkLnN0ZXApXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwic3RlcFwiLCByZWxhdGVkLnN0ZXAsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJzdGVwXCIpO1xuICAgIGlmIChyZWxhdGVkLnN0YXJ0KVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcInN0YXJ0XCIsIHJlbGF0ZWQuc3RhcnQsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJzdGFydFwiKTtcbiAgICBpZiAocmVsYXRlZC5kZWNpbWFscylcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJkZWNpbWFsc1wiLCByZWxhdGVkLmRlY2ltYWxzLCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwiZGVjaW1hbHNcIik7XG4gICAgaWYgKHJlbGF0ZWQudW5pdClcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJ1bml0XCIsIHJlbGF0ZWQudW5pdCwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcInVuaXRcIik7XG4gIH1cbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHtcbiAgZ2V0X2N1cnNvcl9wb3NpdGlvbixcbiAgc2V0X2N1cnNvcl9lbmQsXG4gIHNldF9jdXJzb3JfcG9zaXRpb24sXG4gIHNldF9zZWxlY3Rpb25fYWxsLFxuICBzeW5jX3Jlc29sdmUsXG59IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHsgbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLW1hdGhcIjtcbmltcG9ydCB7IGVyciwgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB7IEZvcm1OdW1iZXJXcml0ZSwgdHlwZSBGb3JtTnVtYmVyV3JpdGVPcHRpb25zIH0gZnJvbSBcIi4uL251bWJlcl9iYXNlXCI7XG5pbXBvcnQgXCIuL251bWJlcl9pbnB1dC5zY3NzXCI7XG5cbi8qKlNsaWRlIFNlbGVjdG9yLCBkaXNwbGF5cyBhbGwgb3B0aW9ucyBpbiBhIHNsaWRlciovXG5jbGFzcyBOdW1iZXJJbnB1dDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4gZXh0ZW5kcyBGb3JtTnVtYmVyV3JpdGU8SUQ+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJudW1iZXJpbnB1dFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjc2VsZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgI3VuaXQ6IHN0cmluZyA9IFwiXCI7XG4gICNtaW46IG51bWJlciA9IC1JbmZpbml0eTtcbiAgI21heDogbnVtYmVyID0gSW5maW5pdHk7XG4gICNzdGVwOiBudW1iZXIgPSAwO1xuICAjc3RhcnQ6IG51bWJlciA9IDA7XG4gICNkZWNpbWFsczogbnVtYmVyID0gMDtcblxuICAjdmFsdWVfYm94ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICN1bml0X2JveCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjbGVnZW5kID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI21heF9sZWdlbmQgPSB0aGlzLiNsZWdlbmQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjbWluX2xlZ2VuZCA9IHRoaXMuI2xlZ2VuZC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgdGhpcy4jdmFsdWVfYm94LmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgIHRoaXMub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICB0aGlzLiNzZWxlY3RlZCA9IHRydWU7XG4gICAgICBpZiAoZS50YXJnZXQgIT09IHRoaXMuI3ZhbHVlX2JveCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHNldF9jdXJzb3JfZW5kKHRoaXMuI3ZhbHVlX2JveCk7XG4gICAgICB9IGVsc2UgdGhpcy4jdmFsdWVfYm94LmZvY3VzKCk7XG4gICAgfTtcbiAgICB0aGlzLiN2YWx1ZV9ib3guYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmICh0aGlzLiNzZWxlY3RlZCkgcmV0dXJuO1xuICAgICAgc2V0X3NlbGVjdGlvbl9hbGwodGhpcy4jdmFsdWVfYm94KTtcbiAgICAgIHRoaXMuI3NlbGVjdGVkID0gdHJ1ZTtcbiAgICB9KTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25ibHVyID0gKCkgPT4ge1xuICAgICAgdGhpcy4jc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLiNzZXQoZmFsc2UpO1xuICAgICAgfSwgMCk7XG4gICAgfTtcbiAgICB0aGlzLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiRW50ZXJcIikgdGhpcy4jc2V0KHRydWUpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBcIkFycm93VXBcIikgdGhpcy4jc3RlcF92YWx1ZSh0cnVlKTtcbiAgICAgIGVsc2UgaWYgKGUua2V5ID09PSBcIkFycm93RG93blwiKSB0aGlzLiNzdGVwX3ZhbHVlKGZhbHNlKTtcbiAgICAgIGVsc2UgcmV0dXJuO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuICAgIHRoaXMub25iZWZvcmVpbnB1dCA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5pbnB1dFR5cGUgPT09IFwiaW5zZXJ0UGFyYWdyYXBoXCIpIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGVsc2UgaWYgKGUuZGF0YSkge1xuICAgICAgICBpZiAoIS9bXFxkLC4tXS9nLnRlc3QoZS5kYXRhKSkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlbHNlIGlmICgvWywuXS9nLnRlc3QoZS5kYXRhKSAmJiB0aGlzLiNkZWNpbWFscyA9PT0gMClcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuI21pbiA+PSAwICYmIC8tL2cudGVzdChlLmRhdGEpKSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jICNzZXQoY3VyOiBib29sZWFuKSB7XG4gICAgY29uc3Qgc2VsID0gZ2V0X2N1cnNvcl9wb3NpdGlvbih0aGlzLiN2YWx1ZV9ib3gpO1xuICAgIGNvbnN0IGJ1ZmYgPSB0aGlzLmJ1ZmZlcjtcbiAgICAoXG4gICAgICBhd2FpdCB0aGlzLnNldF92YWx1ZV9jaGVjayhcbiAgICAgICAgcGFyc2VGbG9hdCh0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQ/LnJlcGxhY2UoXCIsXCIsIFwiLlwiKSB8fCBcIlwiKSB8fCAwLFxuICAgICAgKVxuICAgIClcbiAgICAgIC5tYXBfZXJyKCgpID0+IHtcbiAgICAgICAgdGhpcy5uZXdfdmFsdWUoYnVmZiB8fCBNYXRoLm1heChNYXRoLm1pbigwLCB0aGlzLiNtYXgpLCB0aGlzLiNtaW4pKTtcbiAgICAgICAgc2V0X2N1cnNvcl9lbmQodGhpcy4jdmFsdWVfYm94KTtcbiAgICAgIH0pXG4gICAgICAubWFwKCgpID0+IHtcbiAgICAgICAgaWYgKCFjdXIpIHJldHVybjtcbiAgICAgICAgc2V0X2N1cnNvcl9wb3NpdGlvbih0aGlzLiN2YWx1ZV9ib3gsIHNlbCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGZvY3VzKG9wdGlvbnM/OiBGb2N1c09wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLiN2YWx1ZV9ib3guZm9jdXMob3B0aW9ucyk7XG4gIH1cblxuICBzZXQgdW5pdCh1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiN1bml0ID0gdW5pdCB8fCBcIlwiO1xuICAgIHRoaXMuI3VuaXRfYm94LnRleHRDb250ZW50ID0gdGhpcy4jdW5pdDtcbiAgICB0aGlzLiN1cGRhdGVfbWluX2xlZ2VuZCgpO1xuICAgIHRoaXMuI3VwZGF0ZV9tYXhfbGVuZ2VuZCgpO1xuICB9XG5cbiAgc2V0IGRlY2ltYWxzKGRlYzogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jZGVjaW1hbHMgPSBkZWMgfHwgMDtcbiAgICB0aGlzLiN1cGRhdGVfbWluX2xlZ2VuZCgpO1xuICAgIHRoaXMuI3VwZGF0ZV9tYXhfbGVuZ2VuZCgpO1xuICB9XG5cbiAgc2V0IG1pbihtaW46IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI21pbiA9IG1pbiA/PyAtSW5maW5pdHk7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgfVxuICAjdXBkYXRlX21pbl9sZWdlbmQoKSB7XG4gICAgdGhpcy4jbWluX2xlZ2VuZC50ZXh0Q29udGVudCA9XG4gICAgICB0aGlzLiNtaW4gPT09IC1JbmZpbml0eSA/IFwiXCIgOiBcIk1pbjpcIiArIHRoaXMuI21pbi50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKTtcbiAgfVxuXG4gIHNldCBtYXgobWF4OiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtYXggPSBtYXggPz8gSW5maW5pdHk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZW5nZW5kKCk7XG4gIH1cbiAgI3VwZGF0ZV9tYXhfbGVuZ2VuZCgpIHtcbiAgICB0aGlzLiNtYXhfbGVnZW5kLnRleHRDb250ZW50ID1cbiAgICAgIHRoaXMuI21heCA9PT0gSW5maW5pdHkgPyBcIlwiIDogXCJNYXg6XCIgKyB0aGlzLiNtYXgudG9GaXhlZCh0aGlzLiNkZWNpbWFscyk7XG4gIH1cblxuICBzZXQgc3RlcChzdGVwOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNzdGVwID0gc3RlcCB8fCAwO1xuICB9XG5cbiAgc2V0IHN0YXJ0KHN0ZXA6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3N0YXJ0ID0gc3RlcCB8fCAwO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWw6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudCA9IHZhbC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQgPSBcIlwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihfdmFsOiBzdHJpbmcpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgbGltaXRfdmFsdWUodmFsOiBudW1iZXIpOiBQcm9taXNlTGlrZTxSZXN1bHQ8bnVtYmVyLCBzdHJpbmc+PiB7XG4gICAgbGV0IGxpbSA9IG51bWJlcl9zdGVwX3N0YXJ0X2RlY2ltYWwoXG4gICAgICBNYXRoLm1pbihNYXRoLm1heCh2YWwsIHRoaXMuI21pbiksIHRoaXMuI21heCksXG4gICAgICB0aGlzLiNzdGVwLFxuICAgICAgdGhpcy4jc3RhcnQsXG4gICAgICB0aGlzLiNkZWNpbWFscyxcbiAgICApO1xuICAgIGlmIChsaW0gPCB0aGlzLiNtaW4pIGxpbSArPSB0aGlzLiNzdGVwO1xuICAgIGlmIChsaW0gPiB0aGlzLiNtYXgpIGxpbSAtPSB0aGlzLiNzdGVwO1xuICAgIHJldHVybiBzdXBlci5saW1pdF92YWx1ZShsaW0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrX3ZhbHVlKHZhbDogbnVtYmVyKTogUHJvbWlzZUxpa2U8UmVzdWx0PG51bWJlciwgc3RyaW5nPj4ge1xuICAgIGlmICh2YWwgPCB0aGlzLiNtaW4pXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoXCJNaW5pbXVtIHZhbHVlIFwiICsgdGhpcy4jbWluLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdCksXG4gICAgICApO1xuICAgIGlmICh2YWwgPiB0aGlzLiNtYXgpXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoXCJNYXhpbXVtIHZhbHVlIFwiICsgdGhpcy4jbWF4LnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdCksXG4gICAgICApO1xuICAgIGxldCBsaW0gPSBudW1iZXJfc3RlcF9zdGFydF9kZWNpbWFsKFxuICAgICAgdmFsLFxuICAgICAgdGhpcy4jc3RlcCxcbiAgICAgIHRoaXMuI3N0YXJ0LFxuICAgICAgdGhpcy4jZGVjaW1hbHMsXG4gICAgKTtcbiAgICBpZiAobGltIDwgdGhpcy4jbWluKSBsaW0gKz0gdGhpcy4jc3RlcDtcbiAgICBpZiAobGltID4gdGhpcy4jbWF4KSBsaW0gLT0gdGhpcy4jc3RlcDtcbiAgICByZXR1cm4gc3VwZXIuY2hlY2tfdmFsdWUobGltKTtcbiAgfVxuXG4gICNzdGVwX3ZhbHVlKGRpcjogYm9vbGVhbikge1xuICAgIGNvbnN0IHN0ZXAgPVxuICAgICAgdGhpcy4jc3RlcCB8fFxuICAgICAgTWF0aC5tYXgoXG4gICAgICAgIHRoaXMuI2RlY2ltYWxzID8gMSAvIHRoaXMuI2RlY2ltYWxzIDogMSxcbiAgICAgICAgTWF0aC5mbG9vcihNYXRoLmFicyh0aGlzLmJ1ZmZlciB8fCAwKSAvIDE1MCksXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLnNldF92YWx1ZV9jaGVjaygodGhpcy5idWZmZXIgfHwgMCkgKyAoZGlyID8gc3RlcCA6IC1zdGVwKSk7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KE51bWJlcklucHV0KTtcblxuLyoqQ3JlYXRlcyBhIGRyb3Bkb3duIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fbnVtYmVyX2lucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1OdW1iZXJXcml0ZU9wdGlvbnM8SUQ+LFxuKTogTnVtYmVySW5wdXQ8SUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgTnVtYmVySW5wdXQ8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBGb3JtTnVtYmVyV3JpdGUuYXBwbHlfb3B0aW9ucyhpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBub25lIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgdHlwZSB7IFN0YXRlTnVtYmVyUmVsYXRlZCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN0YXRlXCI7XG5pbXBvcnQgeyBGb3JtVmFsdWUgfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuaW1wb3J0IHsgdHlwZSBGb3JtTnVtYmVyT3B0aW9ucyB9IGZyb20gXCIuLi9udW1iZXJfYmFzZVwiO1xuaW1wb3J0IFwiLi9wcm9ncmVzcy5zY3NzXCI7XG5cbmV4cG9ydCBjbGFzcyBGb3JtUHJvZ3Jlc3M8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlPFxuICBudW1iZXIsXG4gIElEXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJwcm9ncmVzc1wiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjbWluOiBudW1iZXIgPSAwO1xuICAjbWF4OiBudW1iZXIgPSAxMDA7XG4gICNzcGFuOiBudW1iZXIgPSAxMDA7XG4gICNkZWNpbWFsczogbnVtYmVyID0gMDtcbiAgI2JhcjogSFRNTERpdkVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAjdmFsOiBIVE1MU3BhbkVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI3VuaXQ6IEhUTUxTcGFuRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuXG4gIC8qKlNldCB0aGUgbWluaW11bSB2YWx1ZSovXG4gIHNldCBtaW4obWluOiBudW1iZXIpIHtcbiAgICB0aGlzLiNtaW4gPSBtaW47XG4gICAgdGhpcy4jc3BhbiA9IHRoaXMuI21heCAtIHRoaXMuI21pbjtcbiAgfVxuXG4gIC8qKlNldCB0aGUgbWluaW11bSB2YWx1ZSovXG4gIHNldCBtYXgobWF4OiBudW1iZXIpIHtcbiAgICB0aGlzLiNtYXggPSBtYXg7XG4gICAgdGhpcy4jc3BhbiA9IHRoaXMuI21heCAtIHRoaXMuI21pbjtcbiAgfVxuXG4gIC8qKlNldHMgdGhlIGFtb3VudCBvZiBkZWNpbWFscyB0aGUgZWxlbWVudCBjYW4gaGF2ZSovXG4gIHNldCBkZWNpbWFscyhkZWM6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2RlY2ltYWxzID0gTWF0aC5tYXgoZGVjID8/IDAsIDApO1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgdW5pdCBvZiB0aGUgZWxlbWVudCovXG4gIHNldCB1bml0KHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3VuaXQudGV4dENvbnRlbnQgPSB1bml0ID8/IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLiNiYXIuc3R5bGUud2lkdGggPVxuICAgICAgTWF0aC5taW4oTWF0aC5tYXgoKCh2YWx1ZSAtIHRoaXMuI21pbikgLyB0aGlzLiNzcGFuKSAqIDEwMCwgMCksIDEwMCkgK1xuICAgICAgXCIlXCI7XG4gICAgdGhpcy4jdmFsLnRleHRDb250ZW50ID0gdmFsdWUudG9GaXhlZCh0aGlzLiNkZWNpbWFscyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy4jYmFyLnN0eWxlLndpZHRoID0gXCIwJVwiO1xuICAgIHRoaXMuI3ZhbC50ZXh0Q29udGVudCA9IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKGVycjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChyZWxhdGVkOiBQYXJ0aWFsPFN0YXRlTnVtYmVyUmVsYXRlZD4pOiB2b2lkIHtcbiAgICBpZiAocmVsYXRlZC5taW4pXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwibWluXCIsIHJlbGF0ZWQubWluLCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwibWluXCIpO1xuICAgIGlmIChyZWxhdGVkLm1heClcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJtYXhcIiwgcmVsYXRlZC5tYXgsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtYXhcIik7XG4gICAgaWYgKHJlbGF0ZWQuZGVjaW1hbHMpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwiZGVjaW1hbHNcIiwgcmVsYXRlZC5kZWNpbWFscywgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcImRlY2ltYWxzXCIpO1xuICAgIGlmIChyZWxhdGVkLnVuaXQpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwidW5pdFwiLCByZWxhdGVkLnVuaXQsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJ1bml0XCIpO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtUHJvZ3Jlc3MpO1xuXG4vKipDcmVhdGVzIGEgcHJvZ3Jlc3MgZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9wcm9ncmVzczxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtTnVtYmVyT3B0aW9uczxJRD4sXG4pOiBGb3JtUHJvZ3Jlc3M8SUQ+IHtcbiAgY29uc3QgcHJvZyA9IG5ldyBGb3JtUHJvZ3Jlc3M8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMubWluICE9PSBcInVuZGVmaW5lZFwiKSBwcm9nLm1pbiA9IG9wdGlvbnMubWluO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5tYXggIT09IFwidW5kZWZpbmVkXCIpIHByb2cubWF4ID0gb3B0aW9ucy5tYXg7XG4gICAgcHJvZy5kZWNpbWFscyA9IG9wdGlvbnMuZGVjaW1hbHM7XG4gICAgcHJvZy51bml0ID0gb3B0aW9ucy51bml0O1xuICAgIEZvcm1WYWx1ZS5hcHBseV9vcHRpb25zKHByb2csIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBwcm9nO1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBzeW5jX3Jlc29sdmUgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1jb21tb25cIjtcbmltcG9ydCB7XG4gIG1hdGVyaWFsX2FkZF9yb3VuZGVkLFxuICBtYXRlcmlhbF9yZW1vdmVfcm91bmRlZCxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItaWNvbnNcIjtcbmltcG9ydCB7IG51bWJlcl9zdGVwX3N0YXJ0X2RlY2ltYWwgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1tYXRoXCI7XG5pbXBvcnQgeyBlcnIsIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgdHlwZSB7IFNWR0Z1bmMgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdmdcIjtcbmltcG9ydCB7IEZvcm1OdW1iZXJXcml0ZSwgdHlwZSBGb3JtU3RlcHBlckJhc2VPcHRpb25zIH0gZnJvbSBcIi4uL251bWJlcl9iYXNlXCI7XG5pbXBvcnQgXCIuL3NsaWRlci5zY3NzXCI7XG5cbi8qKlNsaWRlIFNlbGVjdG9yLCBkaXNwbGF5cyBhbGwgb3B0aW9ucyBpbiBhIHNsaWRlciovXG5leHBvcnQgY2xhc3MgRm9ybVNsaWRlcjxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4gZXh0ZW5kcyBGb3JtTnVtYmVyV3JpdGU8XG4gIElELFxuICBudW1iZXJcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInNsaWRlclwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjdW5pdDogc3RyaW5nID0gXCJcIjtcbiAgI2RlY2ltYWxzOiBudW1iZXIgPSAwO1xuICAjbWluOiBudW1iZXIgPSAtSW5maW5pdHk7XG4gICNtYXg6IG51bWJlciA9IEluZmluaXR5O1xuICAjc3BhbjogbnVtYmVyID0gSW5maW5pdHk7XG4gICNzdGVwOiBudW1iZXIgPSAwO1xuICAjc3RhcnQ6IG51bWJlciA9IDA7XG4gICNsaXZlOiBib29sZWFuID0gZmFsc2U7XG4gICNpY29uX2RlYyA9IHRoaXMuI3N0ZXBwZXJfZnVuYyhcbiAgICB0aGlzLmFwcGVuZENoaWxkKG1hdGVyaWFsX3JlbW92ZV9yb3VuZGVkKCkpLFxuICAgIGZhbHNlLFxuICApO1xuICAjc2xpZGUgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAjbGVnZW5kID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNsZWZ0X2xlZ2VuZCA9IHRoaXMuI2xlZ2VuZC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNyaWdodF9sZWdlbmQgPSB0aGlzLiNsZWdlbmQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjaWNvbl9pbmMgPSB0aGlzLiNzdGVwcGVyX2Z1bmMoXG4gICAgdGhpcy5hcHBlbmRDaGlsZChtYXRlcmlhbF9hZGRfcm91bmRlZCgpKSxcbiAgICB0cnVlLFxuICApO1xuICAjc2xpZGVyID0gdGhpcy4jc2xpZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICN2YWx1ZV9ib3ggPSB0aGlzLiNzbGlkZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjdW5pdF9ib3ggPSB0aGlzLiNzbGlkZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy4jc2xpZGVyLnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiMFwiKTtcbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG5cbiAgICB0aGlzLm9ucG9pbnRlcmRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUuYnV0dG9uICE9PSAwKSByZXR1cm47XG4gICAgICBpZiAoZS5wb2ludGVyVHlwZSAhPT0gXCJtb3VzZVwiICYmICF0aGlzLiNzbGlkZXIuY29udGFpbnMoZS50YXJnZXQgYXMgTm9kZSkpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLiNzbGlkZXIuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICAgIGNvbnN0IGJveCA9IHRoaXMuI3NsaWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuI3NsaWRlci5jb250YWlucyhlLnRhcmdldCBhcyBOb2RlKVxuICAgICAgICA/IGUuY2xpZW50WCA+PSBib3gueFxuICAgICAgICAgID8gZS5jbGllbnRYIDw9IGJveC54ICsgYm94LndpZHRoXG4gICAgICAgICAgICA/IGJveC54IC0gZS5jbGllbnRYXG4gICAgICAgICAgICA6IC1ib3gud2lkdGhcbiAgICAgICAgICA6IDBcbiAgICAgICAgOiAtYm94LndpZHRoIC8gMjtcbiAgICAgIGlmICh0aGlzLiNtaW4gPT09IC1JbmZpbml0eSB8fCB0aGlzLiNtYXggPT09IEluZmluaXR5KSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuYnVmZmVyIHx8IDA7XG4gICAgICAgIGNvbnN0IGludGVydmFsID0gc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbCA9ICh2YWx1ZSArPSBkaWZmIC8gNTApO1xuICAgICAgICAgIGlmICh0aGlzLiNsaXZlKVxuICAgICAgICAgICAgKGF3YWl0IHRoaXMuc2V0X3ZhbHVlX2xpbWl0KHZhbCkpLm1hcCgodikgPT4gKHZhbHVlID0gdikpO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgKGF3YWl0IHRoaXMubGltaXRfdmFsdWUodmFsKSkubWFwKCh2KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuI21vdmVfdmFsdWUodik7XG4gICAgICAgICAgICAgIHZhbHVlID0gdjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgbGV0IGRpZmYgPSB0aGlzLiN4X3RvX3BlcmMoZS5jbGllbnRYICsgb2Zmc2V0KSAtIDUwO1xuICAgICAgICB0aGlzLiNtb3ZlX3NsaWRlKHRoaXMuI3hfdG9fcGVyYyhlLmNsaWVudFggKyBvZmZzZXQpKTtcbiAgICAgICAgdGhpcy4jc2xpZGVyLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgdGhpcy4jc2xpZGVyLm9ucG9pbnRlcm1vdmUgPSAoZXYpID0+IHtcbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBjb25zdCBwZXJjID0gdGhpcy4jeF90b19wZXJjKGV2LmNsaWVudFggKyBvZmZzZXQpO1xuICAgICAgICAgIGRpZmYgPSAodGhpcy4jc3RlcCB8fCAxKSAqICgocGVyYyAtIDUwKSAqIDIpO1xuICAgICAgICAgIHRoaXMuI21vdmVfc2xpZGUocGVyYyk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc2V0ID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJtb3ZlID0gbnVsbDtcbiAgICAgICAgICB0aGlzLiNzbGlkZXIub25wb2ludGVydXAgPSBudWxsO1xuICAgICAgICAgIHRoaXMuI21vdmVfc2xpZGUoNTApO1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLiNzbGlkZXIub25wb2ludGVydXAgPSAoZXYpID0+IHtcbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICByZXNldCgpO1xuICAgICAgICAgIGlmICghdGhpcy4jbGl2ZSkgdGhpcy5zZXRfdmFsdWVfbGltaXQodmFsdWUpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLiNzbGlkZXIub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgICAgICBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICByZXNldCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgIGVsc2UgdGhpcy5jbGVhcl92YWx1ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5idWZmZXIgfHwgMDtcbiAgICAgICAgdGhpcy4jbW92ZV9hYnNvbHV0ZShlLmNsaWVudFggKyBvZmZzZXQpO1xuICAgICAgICB0aGlzLiNzbGlkZXIuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICB0aGlzLiNzbGlkZXIub25wb2ludGVybW92ZSA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHRoaXMuI21vdmVfYWJzb2x1dGUoZXYuY2xpZW50WCArIG9mZnNldCk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc2V0ID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJtb3ZlID0gbnVsbDtcbiAgICAgICAgICB0aGlzLiNzbGlkZXIub25wb2ludGVydXAgPSBudWxsO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLiNzbGlkZXIub25wb2ludGVydXAgPSAoZXYpID0+IHtcbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICByZXNldCgpO1xuICAgICAgICAgIHRoaXMuI21vdmVfYWJzb2x1dGUoZXYuY2xpZW50WCArIG9mZnNldCwgdmFsdWUpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLiNzbGlkZXIub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgICAgICBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICByZXNldCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgIGVsc2UgdGhpcy5jbGVhcl92YWx1ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuI3NsaWRlLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiQXJyb3dSaWdodFwiKSB0aGlzLiNzdGVwX3ZhbHVlKHRydWUpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dMZWZ0XCIpIHRoaXMuI3N0ZXBfdmFsdWUoZmFsc2UpO1xuICAgICAgZWxzZSByZXR1cm47XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH07XG4gIH1cblxuICBzZXQgdW5pdCh1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiN1bml0ID0gdW5pdCB8fCBcIlwiO1xuICAgIHRoaXMuI3VuaXRfYm94LnRleHRDb250ZW50ID0gdGhpcy4jdW5pdDtcbiAgICB0aGlzLiN1cGRhdGVfbWluX2xlZ2VuZCgpO1xuICAgIHRoaXMuI3VwZGF0ZV9tYXhfbGVnZW5kKCk7XG4gIH1cblxuICBzZXQgbWluKG1pbjogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWluID0gbWluID8/IC1JbmZpbml0eTtcbiAgICB0aGlzLiN1cGRhdGVfbWluX21heCgpO1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gIH1cbiAgI3VwZGF0ZV9taW5fbGVnZW5kKCkge1xuICAgIHRoaXMuI2xlZnRfbGVnZW5kLnRleHRDb250ZW50ID1cbiAgICAgIHRoaXMuI21pbiA9PT0gLUluZmluaXR5ID8gXCJcIiA6IFwiTWluOlwiICsgdGhpcy4jbWluLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpO1xuICB9XG5cbiAgc2V0IG1heChtYXg6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI21heCA9IG1heCA/PyBJbmZpbml0eTtcbiAgICB0aGlzLiN1cGRhdGVfbWluX21heCgpO1xuICAgIHRoaXMuI3VwZGF0ZV9tYXhfbGVnZW5kKCk7XG4gIH1cblxuICAjdXBkYXRlX21heF9sZWdlbmQoKSB7XG4gICAgdGhpcy4jcmlnaHRfbGVnZW5kLnRleHRDb250ZW50ID1cbiAgICAgIHRoaXMuI21heCA9PT0gSW5maW5pdHkgPyBcIlwiIDogdGhpcy4jbWF4LnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgXCI6TWF4XCI7XG4gIH1cblxuICAjdXBkYXRlX21pbl9tYXgoKSB7XG4gICAgdGhpcy4jc3BhbiA9IHRoaXMuI21heCAtIHRoaXMuI21pbjtcbiAgICBpZiAodGhpcy4jc3BhbiA9PT0gSW5maW5pdHkpIHRoaXMuI21vdmVfc2xpZGUoNTApO1xuICAgIGVsc2UgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgfVxuXG4gIHNldCBkZWNpbWFscyhkZWM6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2RlY2ltYWxzID0gZGVjIHx8IDA7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlZ2VuZCgpO1xuICB9XG5cbiAgc2V0IHN0ZXAoc3RlcDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jc3RlcCA9IHN0ZXAgfHwgMDtcbiAgfVxuXG4gIHNldCBzdGFydChzdGVwOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNzdGFydCA9IHN0ZXAgfHwgMDtcbiAgfVxuXG4gIC8qKlNldCB3ZXRoZXIgdGhlIHNsaWRlciBpcyBpbiBsaXZlIG1vZGUqL1xuICBzZXQgbGl2ZShsaXZlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbGl2ZSA9IGxpdmUgfHwgZmFsc2U7XG4gIH1cblxuICBzZXQgaWNvbl9kZWNyZWFzZShpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGQoXG4gICAgICB0aGlzLiNpY29uX2RlYyxcbiAgICAgIHRoaXMuI3N0ZXBwZXJfZnVuYyhpY29uID8gaWNvbigpIDogbWF0ZXJpYWxfcmVtb3ZlX3JvdW5kZWQoKSwgZmFsc2UpLFxuICAgICk7XG4gIH1cblxuICBzZXQgaWNvbl9pbmNyZWFzZShpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGQoXG4gICAgICB0aGlzLiNpY29uX2luYyxcbiAgICAgIHRoaXMuI3N0ZXBwZXJfZnVuYyhpY29uID8gaWNvbigpIDogbWF0ZXJpYWxfYWRkX3JvdW5kZWQoKSwgdHJ1ZSksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuI21vdmVfdmFsdWUodmFsdWUpO1xuICAgIHRoaXMuI21vdmVfc2xpZGUoXG4gICAgICBNYXRoLm1pbihNYXRoLm1heCgoKC10aGlzLiNtaW4gKyB2YWx1ZSkgLyB0aGlzLiNzcGFuKSAqIDEwMCwgMCksIDEwMCksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQgPSBcIlwiO1xuICAgIHRoaXMuI21vdmVfc2xpZGUoNTApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihlcnI6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGxpbWl0X3ZhbHVlKHZhbDogbnVtYmVyKTogUHJvbWlzZUxpa2U8UmVzdWx0PG51bWJlciwgc3RyaW5nPj4ge1xuICAgIGxldCBsaW0gPSBudW1iZXJfc3RlcF9zdGFydF9kZWNpbWFsKFxuICAgICAgTWF0aC5taW4oTWF0aC5tYXgodmFsLCB0aGlzLiNtaW4pLCB0aGlzLiNtYXgpLFxuICAgICAgdGhpcy4jc3RlcCxcbiAgICAgIHRoaXMuI3N0YXJ0LFxuICAgICAgdGhpcy4jZGVjaW1hbHMsXG4gICAgKTtcbiAgICBpZiAobGltIDwgdGhpcy4jbWluKSBsaW0gKz0gdGhpcy4jc3RlcDtcbiAgICBpZiAobGltID4gdGhpcy4jbWF4KSBsaW0gLT0gdGhpcy4jc3RlcDtcbiAgICByZXR1cm4gc3VwZXIubGltaXRfdmFsdWUobGltKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja192YWx1ZSh2YWw6IG51bWJlcik6IFByb21pc2VMaWtlPFJlc3VsdDxudW1iZXIsIHN0cmluZz4+IHtcbiAgICBpZiAodmFsIDwgdGhpcy4jbWluKVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKFwiTWluaW11bSB2YWx1ZSBcIiArIHRoaXMuI21pbi50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQpLFxuICAgICAgKTtcbiAgICBpZiAodmFsID4gdGhpcy4jbWF4KVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKFwiTWF4aW11bSB2YWx1ZSBcIiArIHRoaXMuI21heC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQpLFxuICAgICAgKTtcbiAgICBsZXQgbGltID0gbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbChcbiAgICAgIHZhbCxcbiAgICAgIHRoaXMuI3N0ZXAsXG4gICAgICB0aGlzLiNzdGFydCxcbiAgICAgIHRoaXMuI2RlY2ltYWxzLFxuICAgICk7XG4gICAgaWYgKGxpbSA8IHRoaXMuI21pbikgbGltICs9IHRoaXMuI3N0ZXA7XG4gICAgaWYgKGxpbSA+IHRoaXMuI21heCkgbGltIC09IHRoaXMuI3N0ZXA7XG4gICAgcmV0dXJuIHN1cGVyLmNoZWNrX3ZhbHVlKGxpbSk7XG4gIH1cblxuICBhc3luYyAjbW92ZV9hYnNvbHV0ZSh4OiBudW1iZXIsIGxhc3Q/OiBudW1iZXIpIHtcbiAgICBjb25zdCBwZXJjID0gdGhpcy4jeF90b19wZXJjKHgpO1xuICAgIGlmICh0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9saW1pdCh0aGlzLiNwZXJjX3RvX3ZhbHVlKHBlcmMpKTtcbiAgICBlbHNlIHtcbiAgICAgIGlmIChsYXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmxpbWl0X3ZhbHVlKHRoaXMuI3BlcmNfdG9fdmFsdWUocGVyYykpO1xuICAgICAgICBpZiAodmFsdWUub2spIHtcbiAgICAgICAgICB0aGlzLiNtb3ZlX3NsaWRlKCgoLXRoaXMuI21pbiArIHZhbHVlLnZhbHVlKSAvIHRoaXMuI3NwYW4pICogMTAwKTtcbiAgICAgICAgICB0aGlzLiNtb3ZlX3ZhbHVlKHZhbHVlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRfdmFsdWVfbGltaXQodGhpcy4jcGVyY190b192YWx1ZShwZXJjKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI3hfdG9fcGVyYyh4OiBudW1iZXIpIHtcbiAgICBjb25zdCBib3ggPSB0aGlzLiNzbGlkZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAoKHggLSBib3gueCkgLyBib3gud2lkdGgpICogMTAwKSk7XG4gIH1cblxuICAjcGVyY190b192YWx1ZShwZXJjOiBudW1iZXIpIHtcbiAgICByZXR1cm4gKHBlcmMgLyAxMDApICogdGhpcy4jc3BhbiArIHRoaXMuI21pbjtcbiAgfVxuXG4gIC8qKkF0dGFjaGVzIGNsaWNrIGFjdGlvbiB0byBvdmVyIHRpbWUgaW5jcmVhc2Ugc3BlZWQgb2Ygc3RlcHBpbmcgd2hlbiBob2xkaW5nIHN0ZXAgYnV0dG9ucyAqL1xuICAjc3RlcHBlcl9mdW5jKGljb246IFNWR1NWR0VsZW1lbnQsIGRpcjogYm9vbGVhbikge1xuICAgIGljb24ub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5idXR0b24gPT09IDApIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgbGV0IGludGVydmFsID0gMDtcbiAgICAgICAgbGV0IHNjYWxlcl9pbnRlcnZhbCA9IDA7XG4gICAgICAgIGxldCBzY2FsZXIgPSAyNTA7XG4gICAgICAgIGNvbnN0IHJlbGVhc2UgPSAoKSA9PiB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChzY2FsZXJfaW50ZXJ2YWwpO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICBpY29uLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgICBpY29uLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgaWNvbi5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuICAgICAgICB9O1xuICAgICAgICBpY29uLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgaWNvbi5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc3RlcF92YWx1ZShkaXIpO1xuICAgICAgICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy4jc3RlcF92YWx1ZShkaXIpLCBzY2FsZXIpO1xuICAgICAgICAgIHNjYWxlcl9pbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChzY2FsZXIgPiAyMCkgc2NhbGVyIC89IDEuMTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLiNzdGVwX3ZhbHVlKGRpciksIHNjYWxlcik7XG4gICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgICAgIGljb24ub25wb2ludGVydXAgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKGludGVydmFsID09PSAwKSB0aGlzLiNzdGVwX3ZhbHVlKGRpcik7XG4gICAgICAgICAgcmVsZWFzZSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGljb247XG4gIH1cblxuICAjc3RlcF92YWx1ZShkaXI6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzdGVwID1cbiAgICAgIHRoaXMuI3N0ZXAgfHxcbiAgICAgIE1hdGgubWF4KFxuICAgICAgICB0aGlzLiNkZWNpbWFscyA/IDEgLyB0aGlzLiNkZWNpbWFscyA6IDEsXG4gICAgICAgIE1hdGguZmxvb3IoTWF0aC5hYnModGhpcy5idWZmZXIgfHwgMCkgLyAxNTApLFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5zZXRfdmFsdWVfY2hlY2soKHRoaXMuYnVmZmVyIHx8IDApICsgKGRpciA/IHN0ZXAgOiAtc3RlcCkpO1xuICB9XG5cbiAgI21vdmVfc2xpZGUocGVyYzogbnVtYmVyKSB7XG4gICAgdGhpcy4jc2xpZGVyLnN0eWxlLmxlZnQgPSBwZXJjICsgXCIlXCI7XG4gIH1cbiAgI21vdmVfdmFsdWUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudCA9IHZhbHVlLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtU2xpZGVyKTtcblxuLyoqQ3JlYXRlcyBhIGRyb3Bkb3duIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fc2xpZGVyPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1TdGVwcGVyQmFzZU9wdGlvbnM8SUQ+LFxuKTogRm9ybVNsaWRlcjxJRD4ge1xuICBjb25zdCBzbGlkZSA9IG5ldyBGb3JtU2xpZGVyPElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMubGl2ZSkgc2xpZGUubGl2ZSA9IG9wdGlvbnMubGl2ZTtcbiAgICBpZiAob3B0aW9ucy5pY29uX2RlY3JlYXNlKSBzbGlkZS5pY29uX2RlY3JlYXNlID0gb3B0aW9ucy5pY29uX2RlY3JlYXNlO1xuICAgIGlmIChvcHRpb25zLmljb25faW5jcmVhc2UpIHNsaWRlLmljb25faW5jcmVhc2UgPSBvcHRpb25zLmljb25faW5jcmVhc2U7XG4gICAgRm9ybU51bWJlcldyaXRlLmFwcGx5X29wdGlvbnMoc2xpZGUsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBzbGlkZTtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHsgc2xlZXAsIHN5bmNfcmVzb2x2ZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHtcbiAgbWF0ZXJpYWxfYWRkX3JvdW5kZWQsXG4gIG1hdGVyaWFsX3JlbW92ZV9yb3VuZGVkLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1pY29uc1wiO1xuaW1wb3J0IHsgbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLW1hdGhcIjtcbmltcG9ydCB7IGVyciwgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybU51bWJlcldyaXRlLCB0eXBlIEZvcm1TdGVwcGVyQmFzZU9wdGlvbnMgfSBmcm9tIFwiLi4vbnVtYmVyX2Jhc2VcIjtcbmltcG9ydCBcIi4vc3RlcHBlci5zY3NzXCI7XG5cbi8qKlNsaWRlIFNlbGVjdG9yLCBkaXNwbGF5cyBhbGwgb3B0aW9ucyBpbiBhIHNsaWRlciovXG5leHBvcnQgY2xhc3MgRm9ybVN0ZXBwZXI8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybU51bWJlcldyaXRlPFxuICBJRCxcbiAgbnVtYmVyXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJzdGVwcGVyXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICN1bml0OiBzdHJpbmcgPSBcIlwiO1xuICAjZGVjaW1hbHM6IG51bWJlciA9IDA7XG4gICNtaW46IG51bWJlciA9IC1JbmZpbml0eTtcbiAgI21heDogbnVtYmVyID0gSW5maW5pdHk7XG4gICNzdGVwOiBudW1iZXIgPSAwO1xuICAjc3RhcnQ6IG51bWJlciA9IDA7XG4gICNsaXZlOiBib29sZWFuID0gZmFsc2U7XG4gICNpY29uX2RlYyA9IHRoaXMuI3N0ZXBwZXJfZnVuYyhcbiAgICB0aGlzLmFwcGVuZENoaWxkKG1hdGVyaWFsX3JlbW92ZV9yb3VuZGVkKCkpLFxuICAgIGZhbHNlLFxuICApO1xuICAjdGV4dCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjaWNvbl9pbmMgPSB0aGlzLiNzdGVwcGVyX2Z1bmMoXG4gICAgdGhpcy5hcHBlbmRDaGlsZChtYXRlcmlhbF9hZGRfcm91bmRlZCgpKSxcbiAgICB0cnVlLFxuICApO1xuICAjdmFsdWVfYm94ID0gdGhpcy4jdGV4dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICN1bml0X2JveCA9IHRoaXMuI3RleHQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjbGVnZW5kID0gdGhpcy4jdGV4dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNtYXhfbGVnZW5kID0gdGhpcy4jbGVnZW5kLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI21pbl9sZWdlbmQgPSB0aGlzLiNsZWdlbmQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIjBcIik7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuXG4gICAgdGhpcy4jdmFsdWVfYm94LnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiLTFcIik7XG4gICAgdGhpcy4jdmFsdWVfYm94LmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgIGxldCBkcmFnX2Jsb2NrZXIgPSBmYWxzZTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25mb2N1cyA9IGFzeW5jICgpID0+IHtcbiAgICAgIGRyYWdfYmxvY2tlciA9IHRydWU7XG4gICAgfTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25ibHVyID0gYXN5bmMgKCkgPT4ge1xuICAgICAgZHJhZ19ibG9ja2VyID0gZmFsc2U7XG4gICAgICBhd2FpdCBzbGVlcCgwKTtcbiAgICAgIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKFxuICAgICAgICBwYXJzZUZsb2F0KHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudD8ucmVwbGFjZShcIixcIiwgXCIuXCIpIHx8IFwiXCIpIHx8IDAsXG4gICAgICApO1xuICAgIH07XG4gICAgbGV0IHJlc2V0ID0gKCkgPT4ge307XG4gICAgdGhpcy4jdGV4dC5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmJ1dHRvbiA9PT0gMCAmJiAoZS50YXJnZXQgIT09IHRoaXMuI3ZhbHVlX2JveCB8fCAhZHJhZ19ibG9ja2VyKSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBjb25zdCBpbml0aWFsX3ZhbCA9IHRoaXMuYnVmZmVyIHx8IDA7XG4gICAgICAgIGxldCBtb3ZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy4jdGV4dC5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgIHRoaXMuI3RleHQub25wb2ludGVybW92ZSA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGlmIChtb3ZpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuI21vdmVfZGlmZihcbiAgICAgICAgICAgICAgaW5pdGlhbF92YWwgKyAoKGV2LmNsaWVudFggLSBlLmNsaWVudFgpIC8gMTApICogKHRoaXMuI3N0ZXAgfHwgMSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoZS5jbGllbnRYIC0gZXYuY2xpZW50WCkgPiA1KSB7XG4gICAgICAgICAgICB0aGlzLiN2YWx1ZV9ib3guY29udGVudEVkaXRhYmxlID0gXCJmYWxzZVwiO1xuICAgICAgICAgICAgbW92aW5nID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJlc2V0ID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuI3ZhbHVlX2JveC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAgICAgICB0aGlzLiN0ZXh0LnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jdGV4dC5vbnBvaW50ZXJtb3ZlID0gbnVsbDtcbiAgICAgICAgICB0aGlzLiN0ZXh0Lm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jdGV4dC5vbnBvaW50ZXJ1cCA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgaWYgKCFtb3ZpbmcgJiYgZS50YXJnZXQgIT09IHRoaXMuI3ZhbHVlX2JveCkge1xuICAgICAgICAgICAgdGhpcy4jdmFsdWVfYm94LmZvY3VzKCk7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydEFmdGVyKHRoaXMuI3ZhbHVlX2JveC5maXJzdENoaWxkISk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLm93bmVyRG9jdW1lbnQ/LmRlZmF1bHRWaWV3Py5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAobW92aW5nKSB7XG4gICAgICAgICAgICB0aGlzLiNtb3ZlX2RpZmYoXG4gICAgICAgICAgICAgIGluaXRpYWxfdmFsICsgKChldi5jbGllbnRYIC0gZS5jbGllbnRYKSAvIDEwKSAqICh0aGlzLiNzdGVwIHx8IDEpLFxuICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG1vdmluZyA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkFycm93UmlnaHRcIiB8fCBlLmtleSA9PT0gXCJBcnJvd0xlZnRcIikge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuI3N0ZXBfdmFsdWUoZS5rZXkgPT09IFwiQXJyb3dSaWdodFwiKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAocmVzZXQpIHJlc2V0KCk7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGVsc2UgdGhpcy5jbGVhcl92YWx1ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSB0aGlzLiN2YWx1ZV9ib3ggJiZcbiAgICAgICAgICAvW1xcZCwuLV0vZy50ZXN0KGUua2V5KVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQgPSBcIlwiO1xuICAgICAgICAgIHRoaXMuI3ZhbHVlX2JveC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB0aGlzLiN2YWx1ZV9ib3guYmx1cigpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICBlbHNlIHRoaXMuY2xlYXJfdmFsdWUoKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dSaWdodFwiIHx8IGUua2V5ID09PSBcIkFycm93TGVmdFwiKVxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH07XG4gICAgdGhpcy4jdmFsdWVfYm94Lm9uYmVmb3JlaW5wdXQgPSAoZSkgPT4ge1xuICAgICAgaWYgKGUuaW5wdXRUeXBlID09PSBcImluc2VydFBhcmFncmFwaFwiKSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoZS5kYXRhKSB7XG4gICAgICAgIGlmICghL1tcXGQsLi1dL2cudGVzdChlLmRhdGEpKSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGVsc2UgaWYgKC9bLC5dL2cudGVzdChlLmRhdGEpICYmIHRoaXMuI2RlY2ltYWxzID09PSAwKVxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgKHRoaXMuI21pbiA+PSAwICYmIC8tL2cudGVzdChlLmRhdGEpKSB8fFxuICAgICAgICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudD8uaW5jbHVkZXMoXCItXCIpXG4gICAgICAgIClcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHNldCB1bml0KHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3VuaXQgPSB1bml0IHx8IFwiXCI7XG4gICAgdGhpcy4jdW5pdF9ib3gudGV4dENvbnRlbnQgPSB0aGlzLiN1bml0O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZW5nZW5kKCk7XG4gIH1cblxuICBzZXQgZGVjaW1hbHMoZGVjOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNkZWNpbWFscyA9IGRlYyB8fCAwO1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZW5nZW5kKCk7XG4gIH1cblxuICBzZXQgbWluKG1pbjogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWluID0gbWluID8/IC1JbmZpbml0eTtcbiAgICB0aGlzLiN1cGRhdGVfbWluX2xlZ2VuZCgpO1xuICB9XG4gICN1cGRhdGVfbWluX2xlZ2VuZCgpIHtcbiAgICB0aGlzLiNtaW5fbGVnZW5kLnRleHRDb250ZW50ID1cbiAgICAgIHRoaXMuI21pbiA9PT0gLUluZmluaXR5ID8gXCJcIiA6IFwiTWluOlwiICsgdGhpcy4jbWluLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpO1xuICB9XG5cbiAgc2V0IG1heChtYXg6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI21heCA9IG1heCA/PyBJbmZpbml0eTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlbmdlbmQoKTtcbiAgfVxuICAjdXBkYXRlX21heF9sZW5nZW5kKCkge1xuICAgIHRoaXMuI21heF9sZWdlbmQudGV4dENvbnRlbnQgPVxuICAgICAgdGhpcy4jbWF4ID09PSBJbmZpbml0eSA/IFwiXCIgOiBcIk1heDpcIiArIHRoaXMuI21heC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKTtcbiAgfVxuXG4gIHNldCBzdGVwKHN0ZXA6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3N0ZXAgPSBzdGVwIHx8IDA7XG4gIH1cblxuICBzZXQgc3RhcnQoc3RlcDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jc3RhcnQgPSBzdGVwIHx8IDA7XG4gIH1cblxuICAvKipTZXQgd2V0aGVyIHRoZSBzbGlkZXIgaXMgaW4gbGl2ZSBtb2RlKi9cbiAgc2V0IGxpdmUobGl2ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2xpdmUgPSBsaXZlIHx8IGZhbHNlO1xuICB9XG5cbiAgc2V0IGljb25fZGVjcmVhc2UoaWNvbjogU1ZHRnVuYyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMucmVwbGFjZUNoaWxkKFxuICAgICAgdGhpcy4jaWNvbl9kZWMsXG4gICAgICB0aGlzLiNzdGVwcGVyX2Z1bmMoaWNvbiA/IGljb24oKSA6IG1hdGVyaWFsX3JlbW92ZV9yb3VuZGVkKCksIGZhbHNlKSxcbiAgICApO1xuICB9XG5cbiAgc2V0IGljb25faW5jcmVhc2UoaWNvbjogU1ZHRnVuYyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMucmVwbGFjZUNoaWxkKFxuICAgICAgdGhpcy4jaWNvbl9pbmMsXG4gICAgICB0aGlzLiNzdGVwcGVyX2Z1bmMoaWNvbiA/IGljb24oKSA6IG1hdGVyaWFsX2FkZF9yb3VuZGVkKCksIHRydWUpLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLiNtb3ZlX3ZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQgPSBcIlwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihlcnI6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGxpbWl0X3ZhbHVlKHZhbDogbnVtYmVyKTogUHJvbWlzZUxpa2U8UmVzdWx0PG51bWJlciwgc3RyaW5nPj4ge1xuICAgIGxldCBsaW0gPSBudW1iZXJfc3RlcF9zdGFydF9kZWNpbWFsKFxuICAgICAgTWF0aC5taW4oTWF0aC5tYXgodmFsLCB0aGlzLiNtaW4pLCB0aGlzLiNtYXgpLFxuICAgICAgdGhpcy4jc3RlcCxcbiAgICAgIHRoaXMuI3N0YXJ0LFxuICAgICAgdGhpcy4jZGVjaW1hbHMsXG4gICAgKTtcbiAgICBpZiAobGltIDwgdGhpcy4jbWluKSBsaW0gKz0gdGhpcy4jc3RlcDtcbiAgICBpZiAobGltID4gdGhpcy4jbWF4KSBsaW0gLT0gdGhpcy4jc3RlcDtcbiAgICByZXR1cm4gc3VwZXIubGltaXRfdmFsdWUobGltKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja192YWx1ZSh2YWw6IG51bWJlcik6IFByb21pc2VMaWtlPFJlc3VsdDxudW1iZXIsIHN0cmluZz4+IHtcbiAgICBpZiAodmFsIDwgdGhpcy4jbWluKVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKFwiTWluaW11bSB2YWx1ZSBcIiArIHRoaXMuI21pbi50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQpLFxuICAgICAgKTtcbiAgICBpZiAodmFsID4gdGhpcy4jbWF4KVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKFwiTWF4aW11bSB2YWx1ZSBcIiArIHRoaXMuI21heC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQpLFxuICAgICAgKTtcbiAgICBsZXQgbGltID0gbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbChcbiAgICAgIHZhbCxcbiAgICAgIHRoaXMuI3N0ZXAsXG4gICAgICB0aGlzLiNzdGFydCxcbiAgICAgIHRoaXMuI2RlY2ltYWxzLFxuICAgICk7XG4gICAgaWYgKGxpbSA8IHRoaXMuI21pbikgbGltICs9IHRoaXMuI3N0ZXA7XG4gICAgaWYgKGxpbSA+IHRoaXMuI21heCkgbGltIC09IHRoaXMuI3N0ZXA7XG4gICAgcmV0dXJuIHN1cGVyLmNoZWNrX3ZhbHVlKGxpbSk7XG4gIH1cblxuICAvKipNb3ZlcyB0aGUgdmFsdWUgdG8gYSBwb3NpdGlvbiBieSB0aGUgbW91c2UgeCBjb29yZGluYXRlcyovXG4gIGFzeW5jICNtb3ZlX2RpZmYodmFsdWU6IG51bWJlciwgbGFzdDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuI2xpdmUpIHRoaXMuc2V0X3ZhbHVlX2xpbWl0KHZhbHVlKTtcbiAgICBlbHNlIHtcbiAgICAgIGlmIChsYXN0KSB0aGlzLnNldF92YWx1ZV9saW1pdCh2YWx1ZSk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgbGltID0gYXdhaXQgdGhpcy5saW1pdF92YWx1ZSh2YWx1ZSk7XG4gICAgICAgIGlmIChsaW0ub2spIHRoaXMuI21vdmVfdmFsdWUobGltLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipNb3ZlcyB0aGUgc2xpZGVyIHRvIHRoZSBnaXZlbiBwZXJjZW50IHBvc2l0aW9uKi9cbiAgI21vdmVfdmFsdWUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudCA9IHZhbHVlLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpO1xuICB9XG5cbiAgLyoqQXR0YWNoZXMgY2xpY2sgYWN0aW9uIHRvIG92ZXIgdGltZSBpbmNyZWFzZSBzcGVlZCBvZiBzdGVwcGluZyB3aGVuIGhvbGRpbmcgc3RlcCBidXR0b25zICovXG4gICNzdGVwcGVyX2Z1bmMoaWNvbjogU1ZHU1ZHRWxlbWVudCwgZGlyOiBib29sZWFuKSB7XG4gICAgaWNvbi5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmJ1dHRvbiA9PT0gMCkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBsZXQgaW50ZXJ2YWwgPSAwO1xuICAgICAgICBsZXQgc2NhbGVyX2ludGVydmFsID0gMDtcbiAgICAgICAgbGV0IHNjYWxlciA9IDI1MDtcbiAgICAgICAgY29uc3QgcmVsZWFzZSA9ICgpID0+IHtcbiAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgICBjbGVhckludGVydmFsKHNjYWxlcl9pbnRlcnZhbCk7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgIGljb24ub25wb2ludGVydXAgPSBudWxsO1xuICAgICAgICAgIGljb24ucmVsZWFzZVBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgICBpY29uLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgIH07XG4gICAgICAgIGljb24uc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICBpY29uLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLiNzdGVwX3ZhbHVlKGRpcik7XG4gICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLiNzdGVwX3ZhbHVlKGRpciksIHNjYWxlcik7XG4gICAgICAgICAgc2NhbGVyX2ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNjYWxlciA+IDIwKSBzY2FsZXIgLz0gMS4xO1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgICBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHRoaXMuI3N0ZXBfdmFsdWUoZGlyKSwgc2NhbGVyKTtcbiAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgaWNvbi5vbnBvaW50ZXJ1cCA9ICgpID0+IHtcbiAgICAgICAgICBpZiAoaW50ZXJ2YWwgPT09IDApIHRoaXMuI3N0ZXBfdmFsdWUoZGlyKTtcbiAgICAgICAgICByZWxlYXNlKCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gaWNvbjtcbiAgfVxuXG4gICNzdGVwX3ZhbHVlKGRpcjogYm9vbGVhbikge1xuICAgIGNvbnN0IHN0ZXAgPVxuICAgICAgdGhpcy4jc3RlcCB8fFxuICAgICAgTWF0aC5tYXgoXG4gICAgICAgIHRoaXMuI2RlY2ltYWxzID8gMSAvIHRoaXMuI2RlY2ltYWxzIDogMSxcbiAgICAgICAgTWF0aC5mbG9vcihNYXRoLmFicyh0aGlzLmJ1ZmZlciB8fCAwKSAvIDE1MCksXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLnNldF92YWx1ZV9jaGVjaygodGhpcy5idWZmZXIgfHwgMCkgKyAoZGlyID8gc3RlcCA6IC1zdGVwKSk7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1TdGVwcGVyKTtcblxuLyoqQ3JlYXRlcyBhIGRyb3Bkb3duIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fc3RlcHBlcjxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtU3RlcHBlckJhc2VPcHRpb25zPElEPixcbik6IEZvcm1TdGVwcGVyPElEPiB7XG4gIGNvbnN0IHNsaWRlID0gbmV3IEZvcm1TdGVwcGVyPElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMubGl2ZSkgc2xpZGUubGl2ZSA9IG9wdGlvbnMubGl2ZTtcbiAgICBpZiAob3B0aW9ucy5pY29uX2RlY3JlYXNlKSBzbGlkZS5pY29uX2RlY3JlYXNlID0gb3B0aW9ucy5pY29uX2RlY3JlYXNlO1xuICAgIGlmIChvcHRpb25zLmljb25faW5jcmVhc2UpIHNsaWRlLmljb25faW5jcmVhc2UgPSBvcHRpb25zLmljb25faW5jcmVhc2U7XG4gICAgRm9ybU51bWJlcldyaXRlLmFwcGx5X29wdGlvbnMoc2xpZGUsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBzbGlkZTtcbn1cbiIsImltcG9ydCB7IHNvbWUgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCBzdGF0ZSwgeyB0eXBlIFN0YXRlRW51bVJlbGF0ZWQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdGF0ZVwiO1xuaW1wb3J0IHR5cGUgeyBTVkdGdW5jIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3ZnXCI7XG5pbXBvcnQgeyBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uL2Jhc2VcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtU2VsZWN0b3JPcHRpb248UlQ+IHtcbiAgLyoqVmFsdWUgdG8gc2V0IHdoZW4gb3B0aW9uIGlzIHNlbGVjdGVkICovXG4gIHZhbHVlOiBSVDtcbiAgLyoqVGV4dCBmb3Igc2VsZWN0aW9uICovXG4gIHRleHQ6IHN0cmluZztcbiAgLyoqSWNvbiB0byBkaXNwbGF5IGZvciBvcHRpb24qL1xuICBpY29uPzogU1ZHRnVuYztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtU2VsZWN0b3JCYXNlT3B0aW9uczxcbiAgVCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxULCBJRD4ge1xuICAvKipPcHRpb25zIGZvciBzZWxlY3RvciovXG4gIHNlbGVjdGlvbnM/OiBGb3JtU2VsZWN0b3JPcHRpb248VD5bXTtcbn1cblxuLyoqQmFzZSBmb3IgbnVtYmVyIGVsZW1lbnRzIGVsZW1lbnRzKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGb3JtU2VsZWN0b3JCYXNlPFxuICBSVCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8UlQsIElEPiB7XG4gIC8qKlNldHMgdGhlIHNlbGVjdGlvbiBvcHRpb25zIGZvciB0aGUgc2VsZWN0b3IgKi9cbiAgYWJzdHJhY3Qgc2V0IHNlbGVjdGlvbnMoc2VsZWN0aW9uczogRm9ybVNlbGVjdG9yT3B0aW9uPFJUPltdIHwgdW5kZWZpbmVkKTtcblxuICBzdGF0aWMgYXBwbHlfb3B0aW9uczxSVCwgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICAgIGVsZW1lbnQ6IEZvcm1TZWxlY3RvckJhc2U8UlQsIElEPixcbiAgICBvcHRpb25zOiBGb3JtU2VsZWN0b3JCYXNlT3B0aW9uczxSVCwgSUQ+LFxuICApIHtcbiAgICBpZiAob3B0aW9ucy5zZWxlY3Rpb25zKSBlbGVtZW50LnNlbGVjdGlvbnMgPSBvcHRpb25zLnNlbGVjdGlvbnM7XG4gICAgc3VwZXIuYXBwbHlfb3B0aW9ucyhlbGVtZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKHJlbGF0ZWQ6IFBhcnRpYWw8U3RhdGVFbnVtUmVsYXRlZD4pOiB2b2lkIHtcbiAgICBpZiAocmVsYXRlZC5saXN0KSB7XG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wX21hcChcbiAgICAgICAgXCJzZWxlY3Rpb25zXCIsXG4gICAgICAgIHJlbGF0ZWQubGlzdCxcbiAgICAgICAgKCkgPT4gc29tZShbXSksXG4gICAgICAgICh2YWwpID0+IHtcbiAgICAgICAgICByZXR1cm4gc29tZShcbiAgICAgICAgICAgIHN0YXRlLmUubWFwKHZhbCwgKGtleSwgdmFsKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdGV4dDogdmFsLm5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGtleSBhcyBSVCxcbiAgICAgICAgICAgICAgICBpY29uOiB2YWwuaWNvbixcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZSwgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQge1xuICBtYXRlcmlhbF9jbG9zZV9yb3VuZGVkLFxuICBtYXRlcmlhbF91bmZvbGRfbGVzc19yb3VuZGVkLFxuICBtYXRlcmlhbF91bmZvbGRfbW9yZV9yb3VuZGVkLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1pY29uc1wiO1xuaW1wb3J0IHR5cGUgeyBTVkdGdW5jIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3ZnXCI7XG5pbXBvcnQge1xuICBGb3JtU2VsZWN0b3JCYXNlLFxuICB0eXBlIEZvcm1TZWxlY3RvckJhc2VPcHRpb25zLFxuICB0eXBlIEZvcm1TZWxlY3Rvck9wdGlvbixcbn0gZnJvbSBcIi4uL3NlbGVjdG9yX2Jhc2VcIjtcbmltcG9ydCBcIi4vZHJvcF9kb3duLnNjc3NcIjtcblxuaW50ZXJmYWNlIFNlbE9wdGlvbnMge1xuICB0ZXh0OiBzdHJpbmc7XG4gIGljb24/OiBTVkdGdW5jO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Ecm9wRG93bk9wdGlvbnM8XG4gIFJULFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtU2VsZWN0b3JCYXNlT3B0aW9uczxSVCwgSUQ+IHtcbiAgLyoqRGVmYXVsdCB0ZXh0IGRpc3BsYXllZCovXG4gIGRlZmF1bHQ/OiBzdHJpbmc7XG4gIC8qKkRlZmF1bHQgaWNvbiBkaXNwbGF5ZWQqL1xuICBkZWZhdWx0X2ljb24/OiBTVkdGdW5jO1xufVxuXG4vKipEcm9wZG93biBib3ggZm9yIHNlbGVjdGluZyBiZXR3ZWVuIG11bHRpcGxlIGNob2ljZXMgaW4gYSBzbWFsbCBzcGFjZSovXG5leHBvcnQgY2xhc3MgRm9ybURyb3Bkb3duPFxuICBSVCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVNlbGVjdG9yQmFzZTxSVCwgSUQ+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJkcm9wZG93blwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjbWFwOiBNYXA8UlQsIFNlbE9wdGlvbnM+ID0gbmV3IE1hcCgpO1xuICAjdmFsdWVzOiBSVFtdID0gW107XG4gICNzZWxlY3RlZDogbnVtYmVyID0gLTE7XG5cbiAgI2ljb24/OiBTVkdTVkdFbGVtZW50O1xuICAjdGV4dDogSFRNTERpdkVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAjb3BlbjogU1ZHU1ZHRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQobWF0ZXJpYWxfdW5mb2xkX21vcmVfcm91bmRlZCgpKTtcbiAgI2RlZmF1bHQ6IFRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlNlbGVjdCBzb21ldGhpbmdcIik7XG4gICNkZWZhdWx0X2ljb24/OiBTVkdGdW5jO1xuICBwcml2YXRlIGlzX29wZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuI3RleHQuYXBwZW5kKHRoaXMuI2RlZmF1bHQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLnRhYkluZGV4ID0gMDtcbiAgICB0aGlzLm9uY2xpY2sgPSAoKSA9PiAodGhpcy5vcGVuID0gdHJ1ZSk7XG4gICAgdGhpcy5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLnBvaW50ZXJUeXBlID09PSBcIm1vdXNlXCIpIHtcbiAgICAgICAgdGhpcy5vcGVuID0gdHJ1ZTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgICBjYXNlIFwiIFwiOlxuICAgICAgICBjYXNlIFwiRW50ZXJcIjpcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy5vcGVuID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkFycm93RG93blwiOlxuICAgICAgICBjYXNlIFwiQXJyb3dVcFwiOlxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHRoaXMuI3NlbGVjdF9hZGphY2VudChlLmtleSA9PT0gXCJBcnJvd0Rvd25cIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKkdldHMgdGhlIGRlZmF1bHQgdGV4dCBkaXNwbGF5ZWQgd2hlbiBub3RoaW5nIGhhcyBiZWVuIHNlbGVjdGVkIHlldCAqL1xuICBnZXQgZGVmYXVsdCgpIHtcbiAgICByZXR1cm4gdGhpcy4jZGVmYXVsdC5ub2RlVmFsdWUgfHwgXCJcIjtcbiAgfVxuXG4gIC8qKlNldHMgdGhlIGRlZmF1bHQgdGV4dCBkaXNwbGF5ZWQgd2hlbiBub3RoaW5nIGhhcyBiZWVuIHNlbGVjdGVkIHlldCAqL1xuICBzZXQgZGVmYXVsdChkZWY6IHN0cmluZykge1xuICAgIHRoaXMuI2RlZmF1bHQubm9kZVZhbHVlID0gZGVmO1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgZGVmYXVsdCB0ZXh0IGRpc3BsYXllZCB3aGVuIG5vdGhpbmcgaGFzIGJlZW4gc2VsZWN0ZWQgeWV0ICovXG4gIHNldCBkZWZhdWx0X2ljb24oZGVmOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jZGVmYXVsdF9pY29uID0gZGVmO1xuICAgIGlmIChkZWYgJiYgdGhpcy4jc2VsZWN0ZWQgPT09IC0xKSB0aGlzLiNzZXRfaWNvbiA9IGRlZjtcbiAgfVxuXG4gIHNldCBzZWxlY3Rpb25zKHNlbGVjdGlvbnM6IEZvcm1TZWxlY3Rvck9wdGlvbjxSVD5bXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgIGlmICh0aGlzLiNtYXAuc2l6ZSA+IDApIHtcbiAgICAgIHRoaXMuI21hcC5jbGVhcigpO1xuICAgICAgdGhpcy4jdmFsdWVzID0gW107XG4gICAgICB0aGlzLiNzZWxlY3RlZCA9IC0xO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgc2VsZWN0aW9ucyAmJiBpIDwgc2VsZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgeyB2YWx1ZSwgdGV4dCwgaWNvbiB9ID0gc2VsZWN0aW9uc1tpXTtcbiAgICAgIHRoaXMuI21hcC5zZXQodmFsdWUsIHsgdGV4dCwgaWNvbiB9KTtcbiAgICAgIHRoaXMuI3ZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgfVxuXG4gIHNldCBvcGVuKG9wZW46IGJvb2xlYW4pIHtcbiAgICBpZiAob3BlbiAmJiAhdGhpcy5pc19vcGVuKSB7XG4gICAgICBjb25zdCBvbGQgPSB0aGlzLiNvcGVuO1xuICAgICAgdGhpcy4jb3BlbiA9IG1hdGVyaWFsX3VuZm9sZF9sZXNzX3JvdW5kZWQoKTtcbiAgICAgIG9sZC5yZXBsYWNlV2l0aCh0aGlzLiNvcGVuKTtcbiAgICAgIGJveC5vcGVuX21lbnUodGhpcy4jbWFwLCB0aGlzLCB0aGlzLmJ1ZmZlcik7XG4gICAgfSBlbHNlIGlmICghb3BlbiAmJiB0aGlzLmlzX29wZW4pIHtcbiAgICAgIGNvbnN0IG9sZCA9IHRoaXMuI29wZW47XG4gICAgICB0aGlzLiNvcGVuID0gbWF0ZXJpYWxfdW5mb2xkX21vcmVfcm91bmRlZCgpO1xuICAgICAgb2xkLnJlcGxhY2VXaXRoKHRoaXMuI29wZW4pO1xuICAgICAgYm94LmNsb3NlX21lbnUoKTtcbiAgICB9XG4gICAgdGhpcy5pc19vcGVuID0gb3BlbjtcbiAgfVxuXG4gIC8qKkNoYW5nZXMgdGhlIGljb24gb2YgdGhlIGJ1dHRvbiovXG4gIHNldCAjc2V0X2ljb24oaWNvbjogU1ZHRnVuYyB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChpY29uKSB7XG4gICAgICBjb25zdCBpID0gaWNvbigpO1xuICAgICAgaWYgKHRoaXMuI2ljb24pIHRoaXMucmVwbGFjZUNoaWxkKGksIHRoaXMuI2ljb24pO1xuICAgICAgZWxzZSB0aGlzLmluc2VydEJlZm9yZShpLCB0aGlzLiN0ZXh0KTtcbiAgICAgIHRoaXMuI2ljb24gPSBpO1xuICAgIH0gZWxzZSBpZiAodGhpcy4jaWNvbikge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLiNpY29uKTtcbiAgICAgIHRoaXMuI2ljb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqU2VsZWN0cyB0aGUgcHJldmlvdXMgb3IgbmV4dCBzZWxlY3Rpb24gaW4gdGhlIGVsZW1lbnRcbiAgICogQHBhcmFtIGRpciBmYWxzZSBpcyBuZXh0IHRydWUgaXMgcHJldmlvdXMqL1xuICAjc2VsZWN0X2FkamFjZW50KGRpcjogYm9vbGVhbikge1xuICAgIGNvbnN0IHkgPSBNYXRoLm1pbihcbiAgICAgIHRoaXMuI3ZhbHVlcy5sZW5ndGggLSAxLFxuICAgICAgTWF0aC5tYXgoMCwgZGlyID8gdGhpcy4jc2VsZWN0ZWQgKyAxIDogdGhpcy4jc2VsZWN0ZWQgLSAxKSxcbiAgICApO1xuICAgIGlmICh5ICE9PSB0aGlzLiNzZWxlY3RlZCkgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy4jdmFsdWVzW3ldKTtcbiAgfVxuXG4gICNjbGVhcigpIHtcbiAgICB0aGlzLmRlZmF1bHRfaWNvbiA9IHRoaXMuI2RlZmF1bHRfaWNvblxuICAgICAgPyAodGhpcy4jc2V0X2ljb24gPSB0aGlzLiNkZWZhdWx0X2ljb24pXG4gICAgICA6ICh0aGlzLiNzZXRfaWNvbiA9IHVuZGVmaW5lZCk7XG4gICAgdGhpcy4jdGV4dC5yZXBsYWNlQ2hpbGRyZW4odGhpcy4jZGVmYXVsdCk7XG4gIH1cblxuICAvKipDYWxsZWQgd2hlbiBWYWx1ZSBpcyBjaGFuZ2VkICovXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IFJUKSB7XG4gICAgaWYgKCF0aGlzLiNtYXAuaGFzKHZhbHVlKSkge1xuICAgICAgdGhpcy4jY2xlYXIoKTtcbiAgICAgIHRoaXMuI3NlbGVjdGVkID0gLTE7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG9wdCA9IHRoaXMuI21hcC5nZXQodmFsdWUpITtcbiAgICB0aGlzLiN0ZXh0LmlubmVyVGV4dCA9IG9wdC50ZXh0O1xuICAgIHRoaXMuI3NlbGVjdGVkID0gdGhpcy4jdmFsdWVzLmluZGV4T2YodmFsdWUpO1xuICAgIGlmIChvcHQuaWNvbikgdGhpcy4jc2V0X2ljb24gPSBvcHQuaWNvbjtcbiAgICBlbHNlIHRoaXMuI3NldF9pY29uID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuI2NsZWFyKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHdhcm4obWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBzdXBlci53YXJuKG1lc3NhZ2UpO1xuICAgIH0sIDApO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtRHJvcGRvd24pO1xuXG4vKipDcmVhdGVzIGEgZHJvcGRvd24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9kcm9wZG93bjxSVCwgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybURyb3BEb3duT3B0aW9uczxSVCwgSUQ+LFxuKTogRm9ybURyb3Bkb3duPFJULCBJRD4ge1xuICBjb25zdCBkcm9wID0gbmV3IEZvcm1Ecm9wZG93bjxSVCwgSUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5kZWZhdWx0KSBkcm9wLmRlZmF1bHQgPSBvcHRpb25zLmRlZmF1bHQ7XG4gICAgaWYgKG9wdGlvbnMuZGVmYXVsdF9pY29uKSBkcm9wLmRlZmF1bHRfaWNvbiA9IG9wdGlvbnMuZGVmYXVsdF9pY29uO1xuICAgIEZvcm1TZWxlY3RvckJhc2UuYXBwbHlfb3B0aW9ucyhkcm9wLCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gZHJvcDtcbn1cblxuLy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbmNsYXNzIERyb3BEb3duQm94IGV4dGVuZHMgQmFzZSB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiZHJvcGRvd25ib3hcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI2Nsb3NlcjogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAjY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICNzY3JvbGw6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy4jY29udGFpbmVyLmFwcGVuZENoaWxkKFxuICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksXG4gICk7XG4gICN0YWJsZTogSFRNTERpdkVsZW1lbnQgPSB0aGlzLiNzY3JvbGwuYXBwZW5kQ2hpbGQoXG4gICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxcbiAgKTtcbiAgI2Ryb3Bkb3duOiBGb3JtRHJvcGRvd248YW55LCBhbnk+IHwgdW5kZWZpbmVkO1xuICAjZm9jdXNfb3V0X2hhbmRsZXIgPSAoZTogRm9jdXNFdmVudCkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICghZS5yZWxhdGVkVGFyZ2V0IHx8ICF0aGlzLmNvbnRhaW5zKGUucmVsYXRlZFRhcmdldCBhcyBOb2RlKSlcbiAgICAgIHRoaXMuY2xvc2VfbWVudSgpO1xuICB9O1xuICAjd2luZG93X3Jlc2l6ZV9oYW5kbGVyID0gKCkgPT4gdGhpcy5jbG9zZV9tZW51KCk7XG4gICNpc19vcGVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLiNjb250YWluZXIudGFiSW5kZXggPSAwO1xuICAgIHRoaXMuI2NvbnRhaW5lci5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB0aGlzLmNsb3NlX21lbnUoKTtcbiAgICAgIGVsc2UgaWYgKGUua2V5ID09PSBcIkFycm93VXBcIiB8fCAoZS5zaGlmdEtleSAmJiBlLmtleSA9PT0gXCJUYWJcIikpIHtcbiAgICAgICAgY29uc3QgZWxlbSA9XG4gICAgICAgICAgZS50YXJnZXQgPT09IHRoaXMuI2NvbnRhaW5lclxuICAgICAgICAgICAgPyB0aGlzLiN0YWJsZS5sYXN0RWxlbWVudENoaWxkXG4gICAgICAgICAgICA6IChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgaWYgKGVsZW0pIChlbGVtIGFzIEhUTUxFbGVtZW50KS5mb2N1cygpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0Rvd25cIiB8fCBlLmtleSA9PT0gXCJUYWJcIikge1xuICAgICAgICBjb25zdCBlbGVtID1cbiAgICAgICAgICBlLnRhcmdldCA9PT0gdGhpcy4jY29udGFpbmVyXG4gICAgICAgICAgICA/IHRoaXMuI3RhYmxlLmZpcnN0RWxlbWVudENoaWxkXG4gICAgICAgICAgICA6IChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICBpZiAoZWxlbSkgKGVsZW0gYXMgSFRNTEVsZW1lbnQpLmZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG5cbiAgICB0aGlzLiNjbG9zZXJcbiAgICAgIC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKVxuICAgICAgLmFwcGVuZENoaWxkKG1hdGVyaWFsX2Nsb3NlX3JvdW5kZWQoKSk7XG4gICAgdGhpcy4jY2xvc2VyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpLmlubmVySFRNTCA9IFwiQ2xvc2VcIjtcbiAgICB0aGlzLiNjbG9zZXIudGFiSW5kZXggPSAwO1xuICAgIHRoaXMuI2Nsb3Nlci5vbmNsaWNrID0gKGUpID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmNsb3NlX21lbnUoKTtcbiAgICB9O1xuICAgIHRoaXMuI2Nsb3Nlci5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIiBcIiB8fCBlLmtleSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jbG9zZV9tZW51KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3Vzb3V0XCIsIHRoaXMuI2ZvY3VzX291dF9oYW5kbGVyLCB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgI3NldF92YWx1ZSh2YWx1ZTogdW5rbm93bikge1xuICAgIC8vQHRzLWV4cGVjdC1lcnJvciBDYWxsIHByaXZhdGUgbWV0aG9kIGZyb20gc2lzdGVyIGNsYXNzXG4gICAgaWYgKHRoaXMuI2Ryb3Bkb3duKSB0aGlzLiNkcm9wZG93bi5zZXRfdmFsdWVfY2hlY2sodmFsdWUpO1xuICAgIHRoaXMuY2xvc2VfbWVudSgpO1xuICB9XG5cbiAgb3Blbl9tZW51KFxuICAgIG1hcDogTWFwPGFueSwgU2VsT3B0aW9ucz4sXG4gICAgcGFyZW50OiBGb3JtRHJvcGRvd248YW55LCBhbnk+LFxuICAgIHZhbHVlOiBhbnksXG4gICkge1xuICAgIGNvbnN0IGlubmVyX2hlaWdodCA9IHRoaXMub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldz8uaW5uZXJIZWlnaHQgfHwgMDtcbiAgICB0aGlzLmNsYXNzTGlzdC5hZGQoXCJvcGVuXCIpO1xuICAgIGNvbnN0IGJvdW5kcyA9IHBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAoYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0IC8gMiA8IGlubmVyX2hlaWdodCAvIDIpIHtcbiAgICAgIGNvbnN0IHRvcCA9IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodDtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS50b3AgPSB0b3AgKyBcInB4XCI7XG4gICAgICB0aGlzLiNjb250YWluZXIuc3R5bGUuYm90dG9tID0gXCJcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5tYXhIZWlnaHQgPSBpbm5lcl9oZWlnaHQgLSB0b3AgLSAxMCArIFwicHhcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5mbGV4RGlyZWN0aW9uID0gXCJjb2x1bW5cIjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYm90dG9tID0gaW5uZXJfaGVpZ2h0IC0gYm91bmRzLnk7XG4gICAgICB0aGlzLiNjb250YWluZXIuc3R5bGUudG9wID0gXCJcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5ib3R0b20gPSBib3R0b20gKyBcInB4XCI7XG4gICAgICB0aGlzLiNjb250YWluZXIuc3R5bGUubWF4SGVpZ2h0ID0gaW5uZXJfaGVpZ2h0IC0gYm90dG9tIC0gMTAgKyBcInB4XCI7XG4gICAgICB0aGlzLiNjb250YWluZXIuc3R5bGUuZmxleERpcmVjdGlvbiA9IFwiY29sdW1uLXJldmVyc2VcIjtcbiAgICB9XG4gICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLmxlZnQgPSBib3VuZHMueCArIFwicHhcIjtcbiAgICB0aGlzLiNjb250YWluZXIuc3R5bGUud2lkdGggPSBib3VuZHMud2lkdGggKyBcInB4XCI7XG4gICAgdGhpcy4jZHJvcGRvd24gPSBwYXJlbnQ7XG5cbiAgICBpZiAodGhpcy4jc2Nyb2xsLnNjcm9sbEhlaWdodCA+IHRoaXMuI3Njcm9sbC5jbGllbnRIZWlnaHQpXG4gICAgICB0aGlzLiNzY3JvbGwuY2xhc3NMaXN0LmFkZChcInNjcm9sbFwiKTtcbiAgICBlbHNlIHRoaXMuI3Njcm9sbC5jbGFzc0xpc3QucmVtb3ZlKFwic2Nyb2xsXCIpO1xuXG4gICAgbGV0IGZvY3VzOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCBhcyBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICB0aGlzLiN0YWJsZS5yZXBsYWNlQ2hpbGRyZW4oXG4gICAgICAuLi5BcnJheS5mcm9tKG1hcCkubWFwKChbdmFsLCBvcHRdKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBjb25zdCBpY29uID0gbGluZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgaWYgKG9wdC5pY29uKSBpY29uLmFwcGVuZENoaWxkKG9wdC5pY29uKCkpO1xuICAgICAgICBjb25zdCB0ZXh0ID0gbGluZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgdGV4dC50ZXh0Q29udGVudCA9IG9wdC50ZXh0O1xuICAgICAgICBsaW5lLm9ucG9pbnRlcnVwID0gKGUpID0+IHtcbiAgICAgICAgICBpZiAoZS5wb2ludGVyVHlwZSAhPT0gXCJ0b3VjaFwiKSB0aGlzLiNzZXRfdmFsdWUodmFsKTtcbiAgICAgICAgfTtcbiAgICAgICAgbGluZS5vbmNsaWNrID0gKCkgPT4gdGhpcy4jc2V0X3ZhbHVlKHZhbCk7XG4gICAgICAgIGxpbmUudGFiSW5kZXggPSAwO1xuICAgICAgICBsaW5lLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICAgICAgaWYgKGUua2V5ID09PSBcIiBcIiB8fCBlLmtleSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLiNzZXRfdmFsdWUodmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlmICh2YWwgPT09IHZhbHVlKSBmb2N1cyA9IGxpbmU7XG4gICAgICAgIHJldHVybiBsaW5lO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vU2hvdyBjbG9zZXIgb3Igbm90XG4gICAgY29uc3QgYm94ID0gdGhpcy4jc2Nyb2xsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGJveF9hcmVhID0gYm94LndpZHRoICogYm94LmhlaWdodDtcbiAgICBjb25zdCBodG1sID0gdGhpcy5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICBjb25zdCBodG1sX2FyZWEgPSBodG1sLmNsaWVudFdpZHRoICogaHRtbC5jbGllbnRIZWlnaHQ7XG4gICAgaWYgKGJveF9hcmVhID4gaHRtbF9hcmVhICogMC41KSB7XG4gICAgICB0aGlzLiN0YWJsZS5wcmVwZW5kKHRoaXMuI2Nsb3Nlcik7XG4gICAgfVxuXG4gICAgaWYgKGZvY3VzKSB7XG4gICAgICBmb2N1cy5mb2N1cygpO1xuICAgICAgZm9jdXMuY2xhc3NMaXN0LmFkZChcInNlbGVjdGVkXCIpO1xuICAgIH0gZWxzZSB0aGlzLiNjb250YWluZXIuZm9jdXMoKTtcblxuICAgIHRoaXMub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldz8uYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIFwicmVzaXplXCIsXG4gICAgICB0aGlzLiN3aW5kb3dfcmVzaXplX2hhbmRsZXIsXG4gICAgICB7IHBhc3NpdmU6IHRydWUgfSxcbiAgICApO1xuICAgIHRoaXMuI2lzX29wZW4gPSB0cnVlO1xuICB9XG5cbiAgY2xvc2VfbWVudSgpIHtcbiAgICBpZiAoIXRoaXMuI2lzX29wZW4pIHJldHVybjtcbiAgICB0aGlzLiNpc19vcGVuID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuI2Ryb3Bkb3duKSB0aGlzLiNkcm9wZG93bi5vcGVuID0gZmFsc2U7XG4gICAgdGhpcy5jbGFzc0xpc3QucmVtb3ZlKFwib3BlblwiKTtcbiAgICB0aGlzLiN0YWJsZS5yZXBsYWNlQ2hpbGRyZW4oKTtcbiAgICBpZiAodGhpcy4jZHJvcGRvd24pIHtcbiAgICAgIHRoaXMuI2Ryb3Bkb3duLmZvY3VzKCk7XG4gICAgICAvL0B0cy1leHBlY3QtZXJyb3IgT3ZlcndyaXRlIHByaXZhdGUgcHJvcGVydHkgZnJvbSBzaXN0ZXIgY2xhc3NcbiAgICAgIHRoaXMuI2Ryb3Bkb3duLmlzX29wZW4gPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Py5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgXCJyZXNpemVcIixcbiAgICAgIHRoaXMuI3dpbmRvd19yZXNpemVfaGFuZGxlcixcbiAgICApO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChEcm9wRG93bkJveCk7XG5jb25zdCBib3ggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3IERyb3BEb3duQm94KCkpO1xuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQge1xuICBGb3JtU2VsZWN0b3JCYXNlLFxuICB0eXBlIEZvcm1TZWxlY3RvckJhc2VPcHRpb25zLFxuICB0eXBlIEZvcm1TZWxlY3Rvck9wdGlvbixcbn0gZnJvbSBcIi4uL3NlbGVjdG9yX2Jhc2VcIjtcbmltcG9ydCBcIi4vdG9nZ2xlX2J1dHRvbi5zY3NzXCI7XG5cbmludGVyZmFjZSBTZWxPcHRpb25zIHtcbiAgdG9wOiBIVE1MRGl2RWxlbWVudDtcbiAgYm90OiBIVE1MRGl2RWxlbWVudDtcbn1cblxuLyoqVG9nZ2xlIGJ1dHRvbnMsIGRpc3BsYXlzIGFsbCBvcHRpb25zIGluIGEgbXVsdGkgdG9nZ2xlciovXG5leHBvcnQgY2xhc3MgRm9ybVRvZ2dsZUJ1dHRvbjxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1TZWxlY3RvckJhc2U8UlQsIElEPiB7XG4gIC8qKlJldHVybnMgdGhlIG5hbWUgdXNlZCB0byBkZWZpbmUgdGhlIGVsZW1lbnQqL1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInRvZ2dsZWJ1dHRvblwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjbWFwOiBNYXA8UlQsIFNlbE9wdGlvbnM+ID0gbmV3IE1hcCgpO1xuICAjdmFsdWVzOiBSVFtdID0gW107XG4gICNzZWxlY3RlZDogbnVtYmVyID0gLTE7XG5cbiAgc2V0IHNlbGVjdGlvbnMoc2VsZWN0aW9uczogRm9ybVNlbGVjdG9yT3B0aW9uPFJUPltdIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRoaXMuI21hcC5zaXplID4gMCkge1xuICAgICAgdGhpcy4jbWFwLmNsZWFyKCk7XG4gICAgICB0aGlzLiN2YWx1ZXMgPSBbXTtcbiAgICAgIHRoaXMuI3NlbGVjdGVkID0gLTE7XG4gICAgICB0aGlzLnJlcGxhY2VDaGlsZHJlbigpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgc2VsZWN0aW9ucyAmJiBpIDwgc2VsZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gc2VsZWN0aW9uc1tpXTtcbiAgICAgIHRoaXMuI21hcC5zZXQodmFsdWUsIHRoaXMuI2FkZF9zZWxlY3Rpb24oc2VsZWN0aW9uc1tpXSkpO1xuICAgICAgdGhpcy4jdmFsdWVzLnB1c2goc2VsZWN0aW9uc1tpXS52YWx1ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gIH1cblxuICAjYWRkX3NlbGVjdGlvbihzZWxlY3Rpb246IEZvcm1TZWxlY3Rvck9wdGlvbjxSVD4pIHtcbiAgICBjb25zdCB0b3AgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgIHRvcC50YWJJbmRleCA9IDA7XG4gICAgY29uc3QgYm90ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICBpZiAoc2VsZWN0aW9uLmljb24pIHtcbiAgICAgIHRvcC5hcHBlbmRDaGlsZChzZWxlY3Rpb24uaWNvbigpKTtcbiAgICAgIGJvdC50ZXh0Q29udGVudCA9IHNlbGVjdGlvbi50ZXh0O1xuICAgIH0gZWxzZSB0b3AudGV4dENvbnRlbnQgPSBzZWxlY3Rpb24udGV4dDtcbiAgICBjb25zdCBjbGljayA9ICgpID0+IHtcbiAgICAgIHRvcC5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2soc2VsZWN0aW9uLnZhbHVlKTtcbiAgICB9O1xuICAgIHRvcC5vbmNsaWNrID0gY2xpY2s7XG4gICAgYm90Lm9uY2xpY2sgPSBjbGljaztcbiAgICB0b3Aub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCIgXCIgfHwgZS5rZXkgPT09IFwiRW50ZXJcIikgY2xpY2soKTtcbiAgICAgIGVsc2UgaWYgKGUua2V5ID09PSBcIkFycm93UmlnaHRcIikgdGhpcy4jc2VsZWN0X2FkamFjZW50KHRydWUpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dMZWZ0XCIpIHRoaXMuI3NlbGVjdF9hZGphY2VudChmYWxzZSk7XG4gICAgICBlbHNlIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgICByZXR1cm4geyB0b3AsIGJvdCB9O1xuICB9XG5cbiAgLyoqU2VsZWN0cyB0aGUgcHJldmlvdXMgb3IgbmV4dCBzZWxlY3Rpb24gaW4gdGhlIGVsZW1lbnRcbiAgICogQHBhcmFtIGRpciBmYWxzZSBpcyBuZXh0IHRydWUgaXMgcHJldmlvdXMqL1xuICAjc2VsZWN0X2FkamFjZW50KGRpcjogYm9vbGVhbikge1xuICAgIGNvbnN0IHNlbCA9IHRoaXMuI21hcC5nZXQodGhpcy4jdmFsdWVzW3RoaXMuI3NlbGVjdGVkXSk7XG4gICAgaWYgKHNlbCkgc2VsLnRvcC5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIGNvbnN0IHkgPSBNYXRoLm1pbihcbiAgICAgIHRoaXMuI3ZhbHVlcy5sZW5ndGggLSAxLFxuICAgICAgTWF0aC5tYXgoMCwgZGlyID8gdGhpcy4jc2VsZWN0ZWQgKyAxIDogdGhpcy4jc2VsZWN0ZWQgLSAxKSxcbiAgICApO1xuICAgIGlmICh5ICE9PSB0aGlzLiNzZWxlY3RlZCkgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy4jdmFsdWVzW3ldKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IFJUKTogdm9pZCB7XG4gICAgY29uc3QgcHJldiA9IHRoaXMuI21hcC5nZXQodGhpcy4jdmFsdWVzW3RoaXMuI3NlbGVjdGVkXSk7XG4gICAgaWYgKHByZXYpIHtcbiAgICAgIHByZXYudG9wLmNsYXNzTGlzdC5yZW1vdmUoXCJzZWxlY3RlZFwiKTtcbiAgICAgIHByZXYuYm90LmNsYXNzTGlzdC5yZW1vdmUoXCJzZWxlY3RlZFwiKTtcbiAgICB9XG4gICAgY29uc3Qgb3B0ID0gdGhpcy4jbWFwLmdldCh2YWx1ZSkhO1xuICAgIGlmIChvcHQpIHtcbiAgICAgIG9wdC50b3AuY2xhc3NMaXN0LmFkZChcInNlbGVjdGVkXCIpO1xuICAgICAgb3B0LmJvdC5jbGFzc0xpc3QuYWRkKFwic2VsZWN0ZWRcIik7XG4gICAgICB0aGlzLiNzZWxlY3RlZCA9IHRoaXMuI3ZhbHVlcy5pbmRleE9mKHZhbHVlKTtcbiAgICAgIGlmICh0aGlzLmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgIG9wdC50b3AuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgY29uc3QgcHJldiA9IHRoaXMuI21hcC5nZXQodGhpcy4jdmFsdWVzW3RoaXMuI3NlbGVjdGVkXSk7XG4gICAgaWYgKHByZXYpIHtcbiAgICAgIHByZXYudG9wLmNsYXNzTGlzdC5yZW1vdmUoXCJzZWxlY3RlZFwiKTtcbiAgICAgIHByZXYuYm90LmNsYXNzTGlzdC5yZW1vdmUoXCJzZWxlY3RlZFwiKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybVRvZ2dsZUJ1dHRvbik7XG5cbi8qKkNyZWF0ZXMgYSB0b2dnbGUgYnV0dG9uIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fdG9nZ2xlX2J1dHRvbjxSVCwgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnM8UlQsIElEPixcbik6IEZvcm1Ub2dnbGVCdXR0b248UlQsIElEPiB7XG4gIGNvbnN0IHRvZ2cgPSBuZXcgRm9ybVRvZ2dsZUJ1dHRvbjxSVCwgSUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIEZvcm1TZWxlY3RvckJhc2UuYXBwbHlfb3B0aW9ucyh0b2dnLCBvcHRpb25zKTtcbiAgcmV0dXJuIHRvZ2c7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IEZvcm1FbGVtZW50IH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCBcIi4uL3NoYXJlZFwiO1xuaW1wb3J0IFwiLi9zcGFjZXIuc2Nzc1wiO1xuXG5pbnRlcmZhY2UgRm9ybVNwYWNlck9wdGlvbnMge1xuICAvKipTcGFjaW5nIGFtb3VudCAgKi9cbiAgc3BhY2U/OiBudW1iZXI7XG59XG5cbmNsYXNzIEZvcm1TcGFjZXIgZXh0ZW5kcyBGb3JtRWxlbWVudCB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwic3BhY2VyXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipTZXRzIHRoZSBhbW91bnQgb2Ygc3BhY2UsIGluIHJlbSAqL1xuICBzZXQgc3BhY2Uoc3BhY2U6IG51bWJlcikge1xuICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gYCR7c3BhY2V9cmVtYDtcbiAgfVxuICBnZXQgc3BhY2UoKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQodGhpcy5zdHlsZS5oZWlnaHQpO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtU3BhY2VyKTtcblxuLyoqQ3JlYXRlcyBhIHNwYWNlciBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3NwYWNlcihvcHRpb25zPzogRm9ybVNwYWNlck9wdGlvbnMpOiBGb3JtU3BhY2VyIHtcbiAgY29uc3Qgc3BhY2VyID0gbmV3IEZvcm1TcGFjZXIoKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5zcGFjZSkgc3BhY2VyLnNwYWNlID0gb3B0aW9ucy5zcGFjZTtcbiAgfVxuICByZXR1cm4gc3BhY2VyO1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHsgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL2NvbG9yX2lucHV0LnNjc3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtQ29sb3JJbnB1dE9wdGlvbnM8XG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBSVCA9IHN0cmluZyxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPFJULCBJRD4ge1xuICAvKipXaGV0aGVyIHRoZSBjb2xvciBpbnB1dCBzaG91bGQgdXBkYXRlIGxpdmUqL1xuICBsaXZlPzogYm9vbGVhbjtcbn1cblxuY2xhc3MgRm9ybUNvbG9ySW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIHN0cmluZyxcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcImNvbG9yaW5wdXRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI2xpdmU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwiY29sb3JcIjtcbiAgICB0aGlzLndhcm5faW5wdXQub25pbnB1dCA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLndhcm5faW5wdXQudmFsdWUpO1xuICAgIH07XG4gICAgdGhpcy53YXJuX2lucHV0Lm9uY2hhbmdlID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLndhcm5faW5wdXQudmFsdWUpO1xuICAgIH07XG4gIH1cblxuICBzZXQgbGl2ZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLiNsaXZlID0gdmFsO1xuICB9XG4gIGdldCBsaXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNsaXZlO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZSA9IHZhbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLndhcm5faW5wdXQudmFsdWUgPSBcIiMwMDAwMDBcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtQ29sb3JJbnB1dCk7XG5cbi8qKkNyZWF0ZXMgYSBjb2xvciBpbnB1dCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2NvbG9yX2lucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1Db2xvcklucHV0T3B0aW9uczxJRCwgc3RyaW5nPixcbik6IEZvcm1Db2xvcklucHV0PElEPiB7XG4gIGNvbnN0IGlucHV0ID0gbmV3IEZvcm1Db2xvcklucHV0PElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMubGl2ZSkgaW5wdXQubGl2ZSA9IG9wdGlvbnMubGl2ZTtcbiAgICBGb3JtVmFsdWVXcml0ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7XG4gIG1hdGVyaWFsX2NhbGVuZGFyX21vbnRoX3JvdW5kZWQsXG4gIG1hdGVyaWFsX3NjaGVkdWxlX3JvdW5kZWQsXG59IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWljb25zXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHsgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL2RhdGVfdGltZV9pbnB1dC5zY3NzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZVRpbWVJbnB1dE9wdGlvbnM8XG4gIFJULFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPFJULCBJRD4ge1xuICAvKipUeXBlIG9mIGRhdGUgdGltZSovXG4gIHR5cGU/OiBGb3JtRGF0ZVRpbWVUeXBlO1xufVxuXG5leHBvcnQgY29uc3QgRm9ybURhdGVUaW1lVHlwZSA9IHtcbiAgREFURTogXCJkYXRlXCIsXG4gIFRJTUU6IFwidGltZVwiLFxuICBEQVRFVElNRTogXCJkYXRldGltZVwiLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEZvcm1EYXRlVGltZVR5cGUgPVxuICAodHlwZW9mIEZvcm1EYXRlVGltZVR5cGUpW2tleW9mIHR5cGVvZiBGb3JtRGF0ZVRpbWVUeXBlXTtcblxuY29uc3QgRGF0ZVRpbWVNb2RlID0ge1xuICBEQVRFOiBcImRhdGVcIixcbiAgU1RSSU5HOiBcInN0cmluZ1wiLFxuICBOVU1CRVI6IFwibnVtYmVyXCIsXG59IGFzIGNvbnN0O1xuXG5jbGFzcyBGb3JtRGF0ZVRpbWVJbnB1dDxcbiAgUlQgZXh0ZW5kcyBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVXcml0ZTxSVCwgSUQ+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJkYXRldGltZWlucHV0XCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICN0eXBlOiBGb3JtRGF0ZVRpbWVUeXBlID0gRm9ybURhdGVUaW1lVHlwZS5EQVRFVElNRTtcbiAgI21vZGU6IHN0cmluZyA9IERhdGVUaW1lTW9kZS5EQVRFO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy53YXJuX2lucHV0LnR5cGUgPSBcImRhdGV0aW1lLWxvY2FsXCI7XG4gICAgdGhpcy53YXJuX2lucHV0LmxhbmcgPSBcImRhLURLXCI7XG4gICAgdGhpcy53YXJuX2lucHV0LnN0ZXAgPSBcIjAuMVwiO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLmFwcGVuZENoaWxkKG1hdGVyaWFsX2NhbGVuZGFyX21vbnRoX3JvdW5kZWQoKSkub25jbGljayA9ICgpID0+XG4gICAgICB0aGlzLndhcm5faW5wdXQuc2hvd1BpY2tlcigpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQobWF0ZXJpYWxfc2NoZWR1bGVfcm91bmRlZCgpKS5vbmNsaWNrID0gKCkgPT5cbiAgICAgIHRoaXMud2Fybl9pbnB1dC5zaG93UGlja2VyKCk7XG4gICAgdGhpcy53YXJuX2lucHV0Lm9uY2hhbmdlID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMud2Fybl9pbnB1dC52YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy4jbW9kZSA9PT0gRGF0ZVRpbWVNb2RlLkRBVEUpXG4gICAgICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2sobmV3IERhdGUodGhpcy53YXJuX2lucHV0LnZhbHVlQXNOdW1iZXIpIGFzIFJUKTtcbiAgICAgICAgZWxzZSBpZiAodGhpcy4jbW9kZSA9PT0gRGF0ZVRpbWVNb2RlLlNUUklORylcbiAgICAgICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLndhcm5faW5wdXQudmFsdWUgYXMgUlQpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLiNtb2RlID09PSBEYXRlVGltZU1vZGUuTlVNQkVSKVxuICAgICAgICAgIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMud2Fybl9pbnB1dC52YWx1ZUFzTnVtYmVyIGFzIFJUKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqUmV0dXJucyB0aGUgZGF0ZSB0aW1lIHR5cGUqL1xuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jdHlwZTtcbiAgfVxuXG4gIC8qKlNldHMgdGhlIGRhdGUgdGltZSB0eXBlKi9cbiAgc2V0IHR5cGUodHlwZTogRm9ybURhdGVUaW1lVHlwZSkge1xuICAgIGlmICh0eXBlID09PSBGb3JtRGF0ZVRpbWVUeXBlLkRBVEUpIHRoaXMud2Fybl9pbnB1dC50eXBlID0gXCJkYXRlXCI7XG4gICAgaWYgKHR5cGUgPT09IEZvcm1EYXRlVGltZVR5cGUuVElNRSkgdGhpcy53YXJuX2lucHV0LnR5cGUgPSBcInRpbWVcIjtcbiAgICBpZiAodHlwZSA9PT0gRm9ybURhdGVUaW1lVHlwZS5EQVRFVElNRSlcbiAgICAgIHRoaXMud2Fybl9pbnB1dC50eXBlID0gXCJkYXRldGltZS1sb2NhbFwiO1xuICAgIHRoaXMuI3R5cGUgPSB0eXBlO1xuICB9XG5cbiAgLyoqUmV0dXJucyB0aGUgZGF0ZSB0aW1lIHR5cGUqL1xuICBnZXQgc3RlcCgpIHtcbiAgICByZXR1cm4gTnVtYmVyKHRoaXMud2Fybl9pbnB1dC5zdGVwKTtcbiAgfVxuICAvKipTZXRzIHRoZSBkYXRlIHRpbWUgdHlwZSovXG4gIHNldCBzdGVwKHN0ZXA6IG51bWJlcikge1xuICAgIHRoaXMud2Fybl9pbnB1dC5zdGVwID0gU3RyaW5nKHN0ZXApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWx1ZTogUlQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuI21vZGUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHRoaXMuI21vZGUgPSBEYXRlVGltZU1vZGUuTlVNQkVSO1xuICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB0aGlzLiNtb2RlID0gRGF0ZVRpbWVNb2RlLlNUUklORztcbiAgICAgIGVsc2UgdGhpcy4jbW9kZSA9IERhdGVUaW1lTW9kZS5EQVRFO1xuICAgIH1cbiAgICBsZXQgdGltZTogbnVtYmVyO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHRpbWUgPSB2YWx1ZTtcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHRpbWUgPSBuZXcgRGF0ZSh2YWx1ZSkuZ2V0VGltZSgpO1xuICAgIGVsc2UgdGltZSA9IHZhbHVlLmdldFRpbWUoKTtcbiAgICB0aGlzLndhcm5faW5wdXQudmFsdWVBc051bWJlciA9IHRpbWU7XG4gIH1cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZSA9IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKF9yZWxhdGVkOiBPcHRpb248e30+KTogdm9pZCB7fVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybURhdGVUaW1lSW5wdXQpO1xuXG4vKipDcmVhdGVzIGEgY29sb3IgaW5wdXQgZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9kYXRlX3RpbWVfaW5wdXQ8XG4gIFJUIGV4dGVuZHMgRGF0ZSB8IHN0cmluZyB8IG51bWJlcixcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+KG9wdGlvbnM/OiBEYXRlVGltZUlucHV0T3B0aW9uczxSVCwgSUQ+KTogRm9ybURhdGVUaW1lSW5wdXQ8UlQsIElEPiB7XG4gIGNvbnN0IGlucHV0ID0gbmV3IEZvcm1EYXRlVGltZUlucHV0PFJULCBJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnR5cGUpIGlucHV0LnR5cGUgPSBvcHRpb25zLnR5cGU7XG4gICAgRm9ybVZhbHVlV3JpdGUuYXBwbHlfb3B0aW9ucyhpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQge1xuICBnZXRfY3Vyc29yX3Bvc2l0aW9uLFxuICBJUEFkZHJlc3MsXG4gIElQVmVyc2lvbixcbiAgc2V0X2N1cnNvcl9lbmQsXG4gIHNldF9zZWxlY3Rpb25fYWxsLFxuICBzbGVlcCxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29tbW9uXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHsgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL2lwX2lucHV0LnNjc3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJcElucHV0T3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxJUEFkZHJlc3MsIElEPiB7XG4gIC8qKklwIGFkZHJlc3MgdHlwZSwgdGhpcyBpcyBvdmVyd3JpdHRlbiBpZiBzdXBwbGllZCB3aXRoIGFuIGlwYWRkcmVzcyB3aXRoIGEgZGlmZmVyZW50IHR5cGUqL1xuICB0eXBlOiBJUFZlcnNpb247XG59XG5cbmNsYXNzIEZvcm1JcElucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFxuICBJUEFkZHJlc3MsXG4gIElEXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJpcGlucHV0XCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICN0eXBlOiBJUFZlcnNpb247XG4gICNwYXJ0czogSFRNTERpdkVsZW1lbnRbXSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDggfSwgKF8sIGkpID0+IHtcbiAgICBjb25zdCBpbnAgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgIGlmIChpIDwgNykgdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICAgaW5wLmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgIGlucC5vbmJlZm9yZWlucHV0ID0gYXN5bmMgKGV2KSA9PiB7XG4gICAgICBpZiAoZXYuaW5wdXRUeXBlID09PSBcImluc2VydFBhcmFncmFwaFwiKSBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgLy9CYWNrc3BhY2VcbiAgICAgIGVsc2UgaWYgKGV2LmlucHV0VHlwZSA9PT0gXCJkZWxldGVDb250ZW50QmFja3dhcmRcIikge1xuICAgICAgICBpZiAoaW5wLnRleHRDb250ZW50Lmxlbmd0aCA9PT0gMCAmJiBpID4gMCkge1xuICAgICAgICAgIHNldF9jdXJzb3JfZW5kKGlucC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBEZWxldGVcbiAgICAgIH0gZWxzZSBpZiAoZXYuaW5wdXRUeXBlID09PSBcImRlbGV0ZUNvbnRlbnRGb3J3YXJkXCIpIHtcbiAgICAgICAgaWYgKGlucC50ZXh0Q29udGVudC5sZW5ndGggPT09IDAgJiYgaSA8IGxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBhd2FpdCBzbGVlcCgwKTtcbiAgICAgICAgICAoaW5wLm5leHRFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudCk/LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZXYuZGF0YSkge1xuICAgICAgICAvL0NoZWNrIGZvciAuIG9yIDpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChldi5kYXRhID09PSBcIi5cIiB8fCBldi5kYXRhID09PSBcIjpcIiB8fCBldi5kYXRhID09PSBcIixcIikgJiZcbiAgICAgICAgICBpIDwgbGVuZ3RoIC0gMVxuICAgICAgICApIHtcbiAgICAgICAgICBzZXRfc2VsZWN0aW9uX2FsbChpbnAubmV4dEVsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vQ2hlY2sgZm9yIHZhbGlkIGNoYXJhY3RlcnNcbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgIWV2LmRhdGEubWF0Y2goXG4gICAgICAgICAgICB0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjQgPyAvXltcXGRdKiQvIDogL15bXFxkQS1GYS1mXSokLyxcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAvL1ByZXZlbnQgdG9vIGxvbmcgdmFsdWVzXG4gICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgIGlucC50ZXh0Q29udGVudC5sZW5ndGggPj0gKHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNCA/IDMgOiA0KVxuICAgICAgICApIHtcbiAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIC8vUHJldmVudCB0b28gYmlnIHZhbHVlc1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHBvcyA9IGdldF9jdXJzb3JfcG9zaXRpb24oaW5wKTtcbiAgICAgICAgICBjb25zdCBwb3RlbnRpYWwgPVxuICAgICAgICAgICAgaW5wLnRleHRDb250ZW50LnNsaWNlKDAsIHBvcykgK1xuICAgICAgICAgICAgZXYuZGF0YSArXG4gICAgICAgICAgICBpbnAudGV4dENvbnRlbnQuc2xpY2UocG9zKTtcbiAgICAgICAgICBjb25zdCBudW0gPVxuICAgICAgICAgICAgdGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0XG4gICAgICAgICAgICAgID8gcGFyc2VJbnQocG90ZW50aWFsLCAxMClcbiAgICAgICAgICAgICAgOiBwYXJzZUludChwb3RlbnRpYWwsIDE2KTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAodGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0ICYmIG51bSA+IDI1NSkgfHxcbiAgICAgICAgICAgICh0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjYgJiYgbnVtID4gNjU1MzUpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoaSA8IHRoaXMuI3BhcnRzLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICAgIHNldF9zZWxlY3Rpb25fYWxsKGlucC5uZXh0RWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgZWxzZSBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgaW5wLm9uaW5wdXQgPSAoKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGlucC50ZXh0Q29udGVudC5sZW5ndGggPT09ICh0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjQgPyAzIDogNCkgJiZcbiAgICAgICAgZ2V0X2N1cnNvcl9wb3NpdGlvbihpbnApID09PSBpbnAudGV4dENvbnRlbnQubGVuZ3RoICYmXG4gICAgICAgIGkgPCB0aGlzLiNwYXJ0cy5sZW5ndGggLSAxXG4gICAgICApIHtcbiAgICAgICAgc2V0X3NlbGVjdGlvbl9hbGwoaW5wLm5leHRFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpbnAub25rZXlkb3duID0gYXN5bmMgKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJBcnJvd1VwXCIpIHtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dEb3duXCIpIHtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dMZWZ0XCIgJiYgaSA+IDApIHtcbiAgICAgICAgaWYgKGdldF9jdXJzb3JfcG9zaXRpb24oaW5wKSA9PT0gMCB8fCBpbnAudGV4dENvbnRlbnQubGVuZ3RoID09PSAwKVxuICAgICAgICAgIHNldF9jdXJzb3JfZW5kKGlucC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgZWxzZSByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBcIkFycm93UmlnaHRcIiAmJiBpIDwgdGhpcy4jcGFydHMubGVuZ3RoIC0gMSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZ2V0X2N1cnNvcl9wb3NpdGlvbihpbnApID09PSBpbnAudGV4dENvbnRlbnQubGVuZ3RoIHx8XG4gICAgICAgICAgaW5wLnRleHRDb250ZW50Lmxlbmd0aCA9PT0gMFxuICAgICAgICApXG4gICAgICAgICAgKGlucC5uZXh0RWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpPy5mb2N1cygpO1xuICAgICAgICBlbHNlIHJldHVybjtcbiAgICAgIH0gZWxzZSByZXR1cm47XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH07XG4gICAgcmV0dXJuIGlucDtcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IodHlwZTogSVBWZXJzaW9uLCBpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy4jdHlwZSA9IHR5cGU7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuI3BhcnRzLmluY2x1ZGVzKGUudGFyZ2V0IGFzIEhUTUxEaXZFbGVtZW50KSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHNldF9jdXJzb3JfZW5kKHRoaXMuI3BhcnRzW3RoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNCA/IDMgOiA3XSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLm9uZGJsY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgaWYgKGUudGFyZ2V0ICE9PSB0aGlzKSByZXR1cm47XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzZXRfc2VsZWN0aW9uX2FsbCh0aGlzLiNwYXJ0c1swXSk7XG4gICAgfTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgKGUpID0+IHtcbiAgICAgIGlmIChlLnJlbGF0ZWRUYXJnZXQgJiYgdGhpcy5jb250YWlucyhlLnJlbGF0ZWRUYXJnZXQgYXMgTm9kZSkpIHJldHVybjtcbiAgICAgIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMudmFsdWVfYXNfaXApO1xuICAgIH0pO1xuICAgIHRoaXMub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLnZhbHVlX2FzX2lwKTtcbiAgICAgIGVsc2UgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlcikgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICBlbHNlIHRoaXMuY2xlYXJfdmFsdWUoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub25jb3B5ID0gKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuY2xpcGJvYXJkRGF0YT8uc2V0RGF0YShcInRleHQvcGxhaW5cIiwgdGhpcy52YWx1ZV9hc19pcC50b19zdHJpbmcoKSk7XG4gICAgfTtcbiAgICB0aGlzLm9ucGFzdGUgPSAoZSkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgcGFzdGUgPSBlLmNsaXBib2FyZERhdGE/LmdldERhdGEoXCJ0ZXh0L3BsYWluXCIpIHx8IFwiXCI7XG4gICAgICBjb25zdCBuZXdfaXAgPSBuZXcgSVBBZGRyZXNzKHBhc3RlKTtcbiAgICAgIGlmIChuZXdfaXAudmVyc2lvbiAhPT0gdGhpcy4jdHlwZSkgcmV0dXJuO1xuICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2sobmV3X2lwKTtcbiAgICB9O1xuICB9XG5cbiAgZ2V0IHZhbHVlX2FzX2lwKCk6IElQQWRkcmVzcyB7XG4gICAgcmV0dXJuIG5ldyBJUEFkZHJlc3MoXG4gICAgICB0aGlzLiNwYXJ0c1xuICAgICAgICAuc2xpY2UoMCwgdGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0ID8gNCA6IDgpXG4gICAgICAgIC5yZWR1Y2UoKGFjYywgcGFydCwgaSkgPT4ge1xuICAgICAgICAgIGFjYyArPSBwYXJ0LmlubmVyVGV4dDtcbiAgICAgICAgICBpZiAoaSA8ICh0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjQgPyA0IDogOCkgLSAxKVxuICAgICAgICAgICAgYWNjICs9IHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNCA/IFwiLlwiIDogXCI6XCI7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgXCJcIiksXG4gICAgKTtcbiAgfVxuXG4gIHNldCB0eXBlKHZhbDogSVBWZXJzaW9uKSB7XG4gICAgaWYgKHRoaXMuI3R5cGUgPT09IHZhbCkgcmV0dXJuO1xuICAgIHRoaXMuI3R5cGUgPSB2YWw7XG4gICAgdGhpcy5jbGFzc0xpc3QudG9nZ2xlKFwiaXB2NFwiLCB2YWwgPT09IElQVmVyc2lvbi5WNCk7XG4gICAgdGhpcy5jbGFzc0xpc3QudG9nZ2xlKFwiaXB2NlwiLCB2YWwgPT09IElQVmVyc2lvbi5WNik7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGRyZW4oXG4gICAgICAuLi50aGlzLiNwYXJ0c1xuICAgICAgICAuc2xpY2UoMCwgdmFsID09PSBJUFZlcnNpb24uVjQgPyA0IDogOClcbiAgICAgICAgLmZsYXRNYXAoKHYsIGkpID0+XG4gICAgICAgICAgaSA8ICh2YWwgPT09IElQVmVyc2lvbi5WNCA/IDQgOiA4KSAtIDFcbiAgICAgICAgICAgID8gW3YsIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZhbCA9PT0gSVBWZXJzaW9uLlY0ID8gXCIuXCIgOiBcIjpcIildXG4gICAgICAgICAgICA6IFt2XSxcbiAgICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWw6IElQQWRkcmVzcyk6IHZvaWQge1xuICAgIHRoaXMudHlwZSA9IHZhbC52ZXJzaW9uO1xuICAgIHZhbC5hc19hcnJheS5mb3JFYWNoKChwYXJ0LCBpKSA9PiB7XG4gICAgICB0aGlzLiNwYXJ0c1tpXS50ZXh0Q29udGVudCA9XG4gICAgICAgIHZhbC52ZXJzaW9uID09PSBJUFZlcnNpb24uVjQgPyBwYXJ0LnRvU3RyaW5nKCkgOiBwYXJ0LnRvU3RyaW5nKDE2KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLiNwYXJ0cy5mb3JFYWNoKChwYXJ0KSA9PiB7XG4gICAgICBwYXJ0LnRleHRDb250ZW50ID0gXCJcIjtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtSXBJbnB1dCk7XG5cbi8qKkNyZWF0ZXMgYSBjb2xvciBpbnB1dCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2lwX2lucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9uczogSXBJbnB1dE9wdGlvbnM8SUQ+LFxuKTogRm9ybUlwSW5wdXQ8SUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgRm9ybUlwSW5wdXQ8SUQ+KG9wdGlvbnMudHlwZSwgb3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIEZvcm1WYWx1ZVdyaXRlLmFwcGx5X29wdGlvbnMoaW5wdXQsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBpbnB1dDtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb24gfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB7IEZvcm1WYWx1ZSwgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL3Bhc3N3b3JkX2lucHV0LnNjc3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtUGFzc3dvcmRJbnB1dE9wdGlvbnM8XG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8c3RyaW5nLCBJRD4ge1xuICAvKipBbGxvd2VkIGNoYXJhY3RlcnMgZm9yIHRoZSBwYXNzd29yZCBpbnB1dCAqL1xuICBmaWx0ZXI/OiBSZWdFeHA7XG59XG5cbmNsYXNzIEZvcm1QYXNzd29yZElucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFxuICBzdHJpbmcsXG4gIElEXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJwYXNzd29yZGlucHV0XCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNmaWx0ZXI/OiBSZWdFeHA7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgdGhpcy53YXJuX2lucHV0LnR5cGUgPSBcInBhc3N3b3JkXCI7XG4gICAgdGhpcy53YXJuX2lucHV0Lm9uY2hhbmdlID0gKCkgPT4ge1xuICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy53YXJuX2lucHV0LnZhbHVlKTtcbiAgICB9O1xuICAgIHRoaXMud2Fybl9pbnB1dC5vbmJlZm9yZWlucHV0ID0gKGV2KSA9PiB7XG4gICAgICBpZiAoZXYuZGF0YSkge1xuICAgICAgICBpZiAodGhpcy4jZmlsdGVyICYmICF0aGlzLiNmaWx0ZXIudGVzdChldi5kYXRhKSkge1xuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy53YXJuKFwiSW52YWxpZCBjaGFyYWN0ZXIgZW50ZXJlZFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzZXQgZmlsdGVyKHZhbDogUmVnRXhwIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jZmlsdGVyID0gdmFsO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZSA9IHZhbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLndhcm5faW5wdXQudmFsdWUgPSBcIlwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihfdmFsOiBzdHJpbmcpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChfcmVsYXRlZDogT3B0aW9uPHt9Pik6IHZvaWQge31cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1QYXNzd29yZElucHV0KTtcblxuLyoqQ3JlYXRlcyBhIGRyb3Bkb3duIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fcGFzc3dvcmRfaW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybVBhc3N3b3JkSW5wdXRPcHRpb25zPElEPixcbik6IEZvcm1QYXNzd29yZElucHV0PElEPiB7XG4gIGNvbnN0IGlucHV0ID0gbmV3IEZvcm1QYXNzd29yZElucHV0PElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuZmlsdGVyKSBpbnB1dC5maWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcbiAgICBGb3JtVmFsdWUuYXBwbHlfb3B0aW9ucyhpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBzZXRfY3Vyc29yX2VuZCwgc3luY19yZXNvbHZlIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29tbW9uXCI7XG5pbXBvcnQgeyBlcnIsIG5vbmUsIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgdHlwZSB7IFN0YXRlU3RyaW5nUmVsYXRlZCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN0YXRlXCI7XG5pbXBvcnQgeyBzdHJpbmdfYnl0ZV9sZW5ndGgsIHN0cmluZ19ieXRlX2xpbWl0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RyaW5nXCI7XG5pbXBvcnQgeyBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vdGV4dF9pbnB1dC5zY3NzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybVRleHRJbnB1dE9wdGlvbnM8XG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBSVCA9IHN0cmluZyxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPFJULCBJRD4ge1xuICAvKipQbGFjZWhvbGRlciB0ZXh0IHdoZW4gaW5wdXQgaXMgZW1wdHkgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIC8qKk1heGltdW0gbGVuZ3RoIG9mIHRoZSBpbnB1dCAqL1xuICBtYXhfbGVuZ3RoPzogbnVtYmVyO1xuICAvKipNYXhpbXVtIGJ5dGVzIG9mIHRoZSBpbnB1dCAqL1xuICBtYXhfYnl0ZXM/OiBudW1iZXI7XG4gIC8qKkFsbG93ZWQgY2hhcmFjdGVycyBmb3IgdGhlIHRleHQgaW5wdXQgKi9cbiAgZmlsdGVyPzogUmVnRXhwO1xufVxuXG5jbGFzcyBGb3JtVGV4dElucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFxuICBzdHJpbmcsXG4gIElEXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJ0ZXh0aW5wdXRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI2ZpbHRlcj86IFJlZ0V4cDtcbiAgI21heF9sZW5ndGg/OiBudW1iZXI7XG4gICNtYXhfYnl0ZXM/OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwidGV4dFwiO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLndhcm5faW5wdXQub25jaGFuZ2UgPSAoKSA9PiB0aGlzLiNzZXQoKTtcbiAgICB0aGlzLm9uYmVmb3JlaW5wdXQgPSAoZSkgPT4ge1xuICAgICAgdGhpcy53YXJuKFwiXCIpO1xuICAgICAgY29uc3QgZGF0YSA9IGUuZGF0YSB8fCBlLmRhdGFUcmFuc2Zlcj8uZ2V0RGF0YShcInRleHQvcGxhaW5cIik7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBpZiAodGhpcy4jZmlsdGVyICYmICF0aGlzLiNmaWx0ZXIudGVzdChkYXRhKSkge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLndhcm4oXCJJbnZhbGlkIGNoYXJhY3RlciBlbnRlcmVkXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuI21heF9sZW5ndGggJiZcbiAgICAgICAgICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZS5sZW5ndGggKyBkYXRhLmxlbmd0aCA+IHRoaXMuI21heF9sZW5ndGhcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMud2FybihgQSBtYXhpbXVtIG9mICR7dGhpcy4jbWF4X2xlbmd0aH0gY2hhcmFjdGVycyBpcyBhbGxvd2VkYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuI21heF9ieXRlcyAmJlxuICAgICAgICAgICAgc3RyaW5nX2J5dGVfbGVuZ3RoKHRoaXMud2Fybl9pbnB1dC52YWx1ZSkgK1xuICAgICAgICAgICAgICBzdHJpbmdfYnl0ZV9sZW5ndGgoZGF0YSkgPlxuICAgICAgICAgICAgICB0aGlzLiNtYXhfYnl0ZXNcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMud2FybihgQSBtYXhpbXVtIG9mICR7dGhpcy4jbWF4X2J5dGVzfSBieXRlcyBpcyBhbGxvd2VkYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5idWZmZXIpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jICNzZXQoKSB7XG4gICAgY29uc3QgYnVmZiA9IHRoaXMuYnVmZmVyO1xuICAgIChhd2FpdCB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLndhcm5faW5wdXQudmFsdWUgfHwgXCJcIikpLm1hcF9lcnIoKCkgPT4ge1xuICAgICAgdGhpcy5uZXdfdmFsdWUoYnVmZiB8fCBcIlwiKTtcbiAgICAgIHNldF9jdXJzb3JfZW5kKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgfSk7XG4gIH1cblxuICBzZXQgZmlsdGVyKHZhbDogUmVnRXhwIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jZmlsdGVyID0gdmFsO1xuICB9XG4gIGdldCBmaWx0ZXIoKTogUmVnRXhwIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jZmlsdGVyO1xuICB9XG5cbiAgc2V0IHBsYWNlaG9sZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy53YXJuX2lucHV0LnBsYWNlaG9sZGVyID0gdmFsO1xuICB9XG4gIGdldCBwbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLndhcm5faW5wdXQucGxhY2Vob2xkZXI7XG4gIH1cblxuICBzZXQgbWF4X2xlbmd0aCh2YWw6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI21heF9sZW5ndGggPSB2YWw7XG4gICAgdGhpcy53YXJuX2lucHV0Lm1heExlbmd0aCA9IHZhbCA/PyAtMTtcbiAgfVxuICBnZXQgbWF4X2xlbmd0aCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNtYXhfbGVuZ3RoO1xuICB9XG5cbiAgc2V0IG1heF9ieXRlcyh2YWw6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI21heF9ieXRlcyA9IHZhbDtcbiAgfVxuICBnZXQgbWF4X2J5dGVzKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI21heF9ieXRlcztcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLndhcm5faW5wdXQudmFsdWUgPSB2YWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy53YXJuX2lucHV0LnZhbHVlID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGxpbWl0X3ZhbHVlKHZhbDogc3RyaW5nKTogUHJvbWlzZUxpa2U8UmVzdWx0PHN0cmluZywgc3RyaW5nPj4ge1xuICAgIGlmICh0aGlzLiNtYXhfbGVuZ3RoICYmIHZhbC5sZW5ndGggPiB0aGlzLiNtYXhfbGVuZ3RoKVxuICAgICAgdmFsID0gdmFsLnNsaWNlKDAsIHRoaXMuI21heF9sZW5ndGgpO1xuICAgIGlmICh0aGlzLiNtYXhfYnl0ZXMpIHZhbCA9IHN0cmluZ19ieXRlX2xpbWl0KHZhbCwgdGhpcy4jbWF4X2J5dGVzKTtcbiAgICByZXR1cm4gc3VwZXIubGltaXRfdmFsdWUodmFsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja192YWx1ZSh2YWw6IHN0cmluZyk6IFByb21pc2VMaWtlPFJlc3VsdDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICBpZiAodGhpcy4jbWF4X2xlbmd0aCAmJiB2YWwubGVuZ3RoID4gdGhpcy4jbWF4X2xlbmd0aClcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihgQSBtYXhpbXVtIG9mICR7dGhpcy4jbWF4X2xlbmd0aH0gY2hhcmFjdGVycyBpcyBhbGxvd2VkYCksXG4gICAgICApO1xuICAgIGlmICh0aGlzLiNtYXhfYnl0ZXMgJiYgc3RyaW5nX2J5dGVfbGVuZ3RoKHZhbCkgPiB0aGlzLiNtYXhfYnl0ZXMpXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9ieXRlc30gYnl0ZXMgaXMgYWxsb3dlZGApLFxuICAgICAgKTtcbiAgICByZXR1cm4gc3VwZXIuY2hlY2tfdmFsdWUodmFsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKHJlbGF0ZWQ6IFBhcnRpYWw8U3RhdGVTdHJpbmdSZWxhdGVkPik6IHZvaWQge1xuICAgIGlmIChyZWxhdGVkLm1heF9sZW5ndGgpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwibWF4X2xlbmd0aFwiLCByZWxhdGVkLm1heF9sZW5ndGgsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtYXhfbGVuZ3RoXCIpO1xuICAgIGlmIChyZWxhdGVkLm1heF9sZW5ndGhfYnl0ZXMpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwibWF4X2J5dGVzXCIsIHJlbGF0ZWQubWF4X2xlbmd0aF9ieXRlcywgKCkgPT5cbiAgICAgICAgbm9uZSgpLFxuICAgICAgKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcIm1heF9ieXRlc1wiKTtcbiAgfVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybVRleHRJbnB1dCk7XG5cbi8qKkNyZWF0ZXMgYSBzaW5nbGUgbGluZSB0ZXh0IGlucHV0IGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fdGV4dF9pbnB1dDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtVGV4dElucHV0T3B0aW9uczxJRD4sXG4pOiBGb3JtVGV4dElucHV0PElEPiB7XG4gIGNvbnN0IGlucHV0ID0gbmV3IEZvcm1UZXh0SW5wdXQ8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5maWx0ZXIpIGlucHV0LmZpbHRlciA9IG9wdGlvbnMuZmlsdGVyO1xuICAgIGlmIChvcHRpb25zLnBsYWNlaG9sZGVyKSBpbnB1dC5wbGFjZWhvbGRlciA9IG9wdGlvbnMucGxhY2Vob2xkZXI7XG4gICAgaWYgKG9wdGlvbnMubWF4X2xlbmd0aCkgaW5wdXQubWF4X2xlbmd0aCA9IG9wdGlvbnMubWF4X2xlbmd0aDtcbiAgICBpZiAob3B0aW9ucy5tYXhfYnl0ZXMpIGlucHV0Lm1heF9ieXRlcyA9IG9wdGlvbnMubWF4X2J5dGVzO1xuICAgIEZvcm1WYWx1ZVdyaXRlLmFwcGx5X29wdGlvbnMoaW5wdXQsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBpbnB1dDtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHsgc2V0X2N1cnNvcl9lbmQsIHN5bmNfcmVzb2x2ZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHsgbWF0ZXJpYWxfZHJhZ19oYW5kbGVfcm91bmRlZCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWljb25zXCI7XG5pbXBvcnQgeyBlcnIsIG5vbmUsIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgdHlwZSB7IFN0YXRlU3RyaW5nUmVsYXRlZCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN0YXRlXCI7XG5pbXBvcnQgeyBzdHJpbmdfYnl0ZV9sZW5ndGgsIHN0cmluZ19ieXRlX2xpbWl0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RyaW5nXCI7XG5pbXBvcnQgeyBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vdGV4dF9tdWx0aV9saW5lLnNjc3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtVGV4dElucHV0T3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFJUID0gc3RyaW5nLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8UlQsIElEPiB7XG4gIC8qKlBsYWNlaG9sZGVyIHRleHQgd2hlbiBpbnB1dCBpcyBlbXB0eSAqL1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgLyoqTWF4aW11bSBsZW5ndGggb2YgdGhlIGlucHV0ICovXG4gIG1heF9sZW5ndGg/OiBudW1iZXI7XG4gIC8qKk1heGltdW0gYnl0ZXMgb2YgdGhlIGlucHV0ICovXG4gIG1heF9ieXRlcz86IG51bWJlcjtcbiAgLyoqQWxsb3dlZCBjaGFyYWN0ZXJzIGZvciB0aGUgdGV4dCBpbnB1dCAqL1xuICBmaWx0ZXI/OiBSZWdFeHA7XG59XG5cbmNsYXNzIEZvcm1UZXh0TXVsdGlsaW5lPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFxuICBzdHJpbmcsXG4gIElEXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJ0ZXh0bXVsdGlsaW5lXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNmaWx0ZXI/OiBSZWdFeHA7XG4gICNtYXhfbGVuZ3RoPzogbnVtYmVyO1xuICAjbWF4X2J5dGVzPzogbnVtYmVyO1xuICAjdmFsdWVfYm94OiBIVE1MVGV4dEFyZWFFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChcbiAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIiksXG4gICk7XG4gICNyZXNpemVyOiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgdGhpcy4jcmVzaXplci5hcHBlbmRDaGlsZChtYXRlcmlhbF9kcmFnX2hhbmRsZV9yb3VuZGVkKCkpO1xuICAgIHRoaXMuI3Jlc2l6ZXIub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLiN2YWx1ZV9ib3guZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgY29uc3Qgc3RhcnRfeSA9IGUuY2xpZW50WTtcbiAgICAgIHRoaXMuI3Jlc2l6ZXIuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgdGhpcy4jcmVzaXplci5vbnBvaW50ZXJtb3ZlID0gKGV2KSA9PiB7XG4gICAgICAgIGNvbnN0IGR5ID0gZXYuY2xpZW50WSAtIHN0YXJ0X3k7XG4gICAgICAgIHRoaXMuI3ZhbHVlX2JveC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHQgKyBkeX1weGA7XG4gICAgICB9O1xuICAgICAgdGhpcy4jcmVzaXplci5vbnBvaW50ZXJ1cCA9IChfZXYpID0+IHtcbiAgICAgICAgdGhpcy4jcmVzaXplci5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICB0aGlzLiNyZXNpemVyLm9ucG9pbnRlcm1vdmUgPSBudWxsO1xuICAgICAgICB0aGlzLiNyZXNpemVyLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgIH07XG4gICAgfTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFbnRlclwiICYmICFlLnNoaWZ0S2V5KSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25jaGFuZ2UgPSAoKSA9PiB0aGlzLiNzZXQoKTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25iZWZvcmVpbnB1dCA9IChlKSA9PiB7XG4gICAgICB0aGlzLndhcm4oXCJcIik7XG4gICAgICBjb25zdCBkYXRhID0gZS5kYXRhIHx8IGUuZGF0YVRyYW5zZmVyPy5nZXREYXRhKFwidGV4dC9wbGFpblwiKTtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLiNmaWx0ZXIgJiYgIXRoaXMuI2ZpbHRlci50ZXN0KGRhdGEpKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMud2FybihcIkludmFsaWQgY2hhcmFjdGVyIGVudGVyZWRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy4jbWF4X2xlbmd0aCAmJlxuICAgICAgICAgICAgdGhpcy4jdmFsdWVfYm94LnZhbHVlLmxlbmd0aCArIGRhdGEubGVuZ3RoID4gdGhpcy4jbWF4X2xlbmd0aFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy53YXJuKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfbGVuZ3RofSBjaGFyYWN0ZXJzIGlzIGFsbG93ZWRgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy4jbWF4X2J5dGVzICYmXG4gICAgICAgICAgICBzdHJpbmdfYnl0ZV9sZW5ndGgodGhpcy4jdmFsdWVfYm94LnZhbHVlKSArXG4gICAgICAgICAgICAgIHN0cmluZ19ieXRlX2xlbmd0aChkYXRhKSA+XG4gICAgICAgICAgICAgIHRoaXMuI21heF9ieXRlc1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy53YXJuKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfYnl0ZXN9IGJ5dGVzIGlzIGFsbG93ZWRgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGVsc2UgdGhpcy5jbGVhcl92YWx1ZSgpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJFbnRlclwiICYmIGUuY3RybEtleSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuI3NldCgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBhc3luYyAjc2V0KCkge1xuICAgIGNvbnN0IGJ1ZmYgPSB0aGlzLmJ1ZmZlcjtcbiAgICAoYXdhaXQgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy4jdmFsdWVfYm94LnZhbHVlIHx8IFwiXCIpKS5tYXBfZXJyKCgpID0+IHtcbiAgICAgIHRoaXMubmV3X3ZhbHVlKGJ1ZmYgfHwgXCJcIik7XG4gICAgICBzZXRfY3Vyc29yX2VuZCh0aGlzLiN2YWx1ZV9ib3gpO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0IGZpbHRlcih2YWw6IFJlZ0V4cCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2ZpbHRlciA9IHZhbDtcbiAgfVxuICBnZXQgZmlsdGVyKCk6IFJlZ0V4cCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2ZpbHRlcjtcbiAgfVxuXG4gIHNldCBwbGFjZWhvbGRlcih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuI3ZhbHVlX2JveC5wbGFjZWhvbGRlciA9IHZhbDtcbiAgfVxuICBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy4jdmFsdWVfYm94LnBsYWNlaG9sZGVyO1xuICB9XG5cbiAgc2V0IG1heF9sZW5ndGgodmFsOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtYXhfbGVuZ3RoID0gdmFsO1xuICAgIHRoaXMuI3ZhbHVlX2JveC5tYXhMZW5ndGggPSB2YWwgPz8gLTE7XG4gIH1cbiAgZ2V0IG1heF9sZW5ndGgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jbWF4X2xlbmd0aDtcbiAgfVxuXG4gIHNldCBtYXhfYnl0ZXModmFsOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtYXhfYnl0ZXMgPSB2YWw7XG4gIH1cbiAgZ2V0IG1heF9ieXRlcygpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNtYXhfYnl0ZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnZhbHVlID0gdmFsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuI3ZhbHVlX2JveC52YWx1ZSA9IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBsaW1pdF92YWx1ZSh2YWw6IHN0cmluZyk6IFByb21pc2VMaWtlPFJlc3VsdDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICBpZiAodGhpcy4jbWF4X2xlbmd0aCAmJiB2YWwubGVuZ3RoID4gdGhpcy4jbWF4X2xlbmd0aClcbiAgICAgIHZhbCA9IHZhbC5zbGljZSgwLCB0aGlzLiNtYXhfbGVuZ3RoKTtcbiAgICBpZiAodGhpcy4jbWF4X2J5dGVzKSB2YWwgPSBzdHJpbmdfYnl0ZV9saW1pdCh2YWwsIHRoaXMuI21heF9ieXRlcyk7XG4gICAgcmV0dXJuIHN1cGVyLmxpbWl0X3ZhbHVlKHZhbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tfdmFsdWUodmFsOiBzdHJpbmcpOiBQcm9taXNlTGlrZTxSZXN1bHQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgaWYgKHRoaXMuI21heF9sZW5ndGggJiYgdmFsLmxlbmd0aCA+IHRoaXMuI21heF9sZW5ndGgpXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9sZW5ndGh9IGNoYXJhY3RlcnMgaXMgYWxsb3dlZGApLFxuICAgICAgKTtcbiAgICBpZiAodGhpcy4jbWF4X2J5dGVzICYmIHN0cmluZ19ieXRlX2xlbmd0aCh2YWwpID4gdGhpcy4jbWF4X2J5dGVzKVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfYnl0ZXN9IGJ5dGVzIGlzIGFsbG93ZWRgKSxcbiAgICAgICk7XG4gICAgcmV0dXJuIHN1cGVyLmNoZWNrX3ZhbHVlKHZhbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChyZWxhdGVkOiBQYXJ0aWFsPFN0YXRlU3RyaW5nUmVsYXRlZD4pOiB2b2lkIHtcbiAgICBpZiAocmVsYXRlZC5tYXhfbGVuZ3RoKVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcIm1heF9sZW5ndGhcIiwgcmVsYXRlZC5tYXhfbGVuZ3RoLCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwibWF4X2xlbmd0aFwiKTtcbiAgICBpZiAocmVsYXRlZC5tYXhfbGVuZ3RoX2J5dGVzKVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcIm1heF9ieXRlc1wiLCByZWxhdGVkLm1heF9sZW5ndGhfYnl0ZXMsICgpID0+XG4gICAgICAgIG5vbmUoKSxcbiAgICAgICk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtYXhfYnl0ZXNcIik7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1UZXh0TXVsdGlsaW5lKTtcblxuLyoqQ3JlYXRlcyBhIG11bHRpIGxpbmUgdGV4dCBpbnB1dCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3RleHRfbXVsdGlsaW5lPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1UZXh0SW5wdXRPcHRpb25zPElEPixcbik6IEZvcm1UZXh0TXVsdGlsaW5lPElEPiB7XG4gIGNvbnN0IGlucHV0ID0gbmV3IEZvcm1UZXh0TXVsdGlsaW5lPElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMucGxhY2Vob2xkZXIpIGlucHV0LnBsYWNlaG9sZGVyID0gb3B0aW9ucy5wbGFjZWhvbGRlcjtcbiAgICBpZiAob3B0aW9ucy5tYXhfbGVuZ3RoKSBpbnB1dC5tYXhfbGVuZ3RoID0gb3B0aW9ucy5tYXhfbGVuZ3RoO1xuICAgIGlmIChvcHRpb25zLm1heF9ieXRlcykgaW5wdXQubWF4X2J5dGVzID0gb3B0aW9ucy5tYXhfYnl0ZXM7XG4gICAgRm9ybVZhbHVlV3JpdGUuYXBwbHlfb3B0aW9ucyhpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBGb3JtRWxlbWVudCB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL3RleHQuc2Nzc1wiO1xuXG5pbnRlcmZhY2UgRm9ybVRleHRPcHRpb25zIHtcbiAgLyoqQnV0dG9ucyB0ZXh0ICovXG4gIHRleHQ/OiBzdHJpbmc7XG4gIC8qKlRleHQgc2l6ZSAqL1xuICBzaXplPzogbnVtYmVyO1xufVxuXG4vKipDb21wb25lbnQgZm9yIHNpbXBsZSB0ZXh0ICovXG5jbGFzcyBGb3JtVGV4dCBleHRlbmRzIEZvcm1FbGVtZW50IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJ0ZXh0XCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEZvcm1UZXh0T3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKG9wdGlvbnMudGV4dCkgdGhpcy50ZXh0ID0gb3B0aW9ucy50ZXh0O1xuICAgIGlmIChvcHRpb25zLnNpemUpIHRoaXMuc2l6ZSA9IG9wdGlvbnMuc2l6ZTtcbiAgfVxuXG4gIC8qKlNldHMgdGhlIGN1cnJlbnQgdGV4dCBvZiB0aGUgZWxlbWVudCovXG4gIHNldCB0ZXh0KHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB0ZXh0O1xuICB9XG4gIGdldCB0ZXh0KCkge1xuICAgIHJldHVybiB0aGlzLnRleHRDb250ZW50O1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgY3VycmVudCB0ZXh0IG9mIHRoZSBlbGVtZW50Ki9cbiAgc2V0IHNpemUoc2l6ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5zdHlsZS5mb250U2l6ZSA9IHNpemUgKyBcInJlbVwiO1xuICAgIHRoaXMuc3R5bGUubGluZUhlaWdodCA9IHNpemUgKyBcInJlbVwiO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtVGV4dCk7XG5cbi8qKkNyZWF0ZXMgYSBidXR0b24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV90ZXh0KG9wdGlvbnM6IEZvcm1UZXh0T3B0aW9ucyk6IEZvcm1UZXh0IHtcbiAgcmV0dXJuIG5ldyBGb3JtVGV4dChvcHRpb25zKTtcbn1cbiIsImltcG9ydCB7IEZvcm1Db2xvcnMgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBmb3JtX2J1dHRvbiB9IGZyb20gXCIuL2Jvb2xlYW4vYnV0dG9uL2J1dHRvblwiO1xuaW1wb3J0IHsgZm9ybV9sYW1wIH0gZnJvbSBcIi4vYm9vbGVhbi9sYW1wL2xhbXBcIjtcbmltcG9ydCB7IGZvcm1fc3dpdGNoIH0gZnJvbSBcIi4vYm9vbGVhbi9zd2l0Y2gvc3dpdGNoXCI7XG5pbXBvcnQgeyBmb3JtX2dyb3VwX2NvbCB9IGZyb20gXCIuL2dyb3VwL2dyb3VwXCI7XG5pbXBvcnQgeyBmb3JtX2dyb3VwX2NvbGxhcHNlciB9IGZyb20gXCIuL2dyb3VwL2dyb3VwX2NvbGxhcHNlclwiO1xuaW1wb3J0IHsgZm9ybV9saXN0X2ZpZWxkIH0gZnJvbSBcIi4vbGlzdC9saXN0X2ZpZWxkXCI7XG5pbXBvcnQgeyBmb3JtX251bWJlcl9pbnB1dCB9IGZyb20gXCIuL251bWJlci9udW1iZXJfaW5wdXQvbnVtYmVyX2lucHV0XCI7XG5pbXBvcnQgeyBmb3JtX3Byb2dyZXNzIH0gZnJvbSBcIi4vbnVtYmVyL3Byb2dyZXNzL3Byb2dyZXNzXCI7XG5pbXBvcnQgeyBmb3JtX3NsaWRlciB9IGZyb20gXCIuL251bWJlci9zbGlkZXIvc2xpZGVyXCI7XG5pbXBvcnQgeyBmb3JtX3N0ZXBwZXIgfSBmcm9tIFwiLi9udW1iZXIvc3RlcHBlci9zdGVwcGVyXCI7XG5pbXBvcnQgeyBmb3JtX2Ryb3Bkb3duIH0gZnJvbSBcIi4vc2VsZWN0b3JzL2Ryb3BfZG93bi9kcm9wX2Rvd25cIjtcbmltcG9ydCB7IGZvcm1fdG9nZ2xlX2J1dHRvbiB9IGZyb20gXCIuL3NlbGVjdG9ycy90b2dnbGVfYnV0dG9uL3RvZ2dsZV9idXR0b25cIjtcbmltcG9ydCB7IGZvcm1fc3BhY2VyIH0gZnJvbSBcIi4vc3BhY2luZy9zcGFjZXJcIjtcbmltcG9ydCB7IGZvcm1fY29sb3JfaW5wdXQgfSBmcm9tIFwiLi9zcGVjaWFsL2NvbG9yL2NvbG9yX2lucHV0XCI7XG5pbXBvcnQge1xuICBmb3JtX2RhdGVfdGltZV9pbnB1dCxcbiAgRm9ybURhdGVUaW1lVHlwZSxcbn0gZnJvbSBcIi4vc3BlY2lhbC9kYXRlX3RpbWUvZGF0ZV90aW1lX2lucHV0XCI7XG5pbXBvcnQgeyBmb3JtX2lwX2lucHV0IH0gZnJvbSBcIi4vc3BlY2lhbC9pcC9pcF9pbnB1dFwiO1xuaW1wb3J0IHsgZm9ybV9wYXNzd29yZF9pbnB1dCB9IGZyb20gXCIuL3NwZWNpYWwvcGFzc3dvcmQvcGFzc3dvcmRfaW5wdXRcIjtcbmltcG9ydCB7IGZvcm1fdGV4dF9pbnB1dCB9IGZyb20gXCIuL3RleHQvaW5wdXQvdGV4dF9pbnB1dFwiO1xuaW1wb3J0IHsgZm9ybV90ZXh0X211bHRpbGluZSB9IGZyb20gXCIuL3RleHQvbXVsdGlfbGluZS90ZXh0X211bHRpX2xpbmVcIjtcbmltcG9ydCB7IGZvcm1fdGV4dCB9IGZyb20gXCIuL3RleHQvdGV4dC90ZXh0XCI7XG5cbi8qKkZvcm0gZWxlbWVudHMgd2l0aCBsYWJlbCAqL1xuZXhwb3J0IGNvbnN0IGZvcm0gPSB7XG4gIEZvcm1Db2xvcnMsXG5cbiAgLy9Cb29sZWFuXG4gIGJ1dHRvbjogZm9ybV9idXR0b24sXG4gIHN3aXRjaDogZm9ybV9zd2l0Y2gsXG4gIGxhbXA6IGZvcm1fbGFtcCxcblxuICAvL0dyb3VwXG4gIGdyb3VwX2NvbDogZm9ybV9ncm91cF9jb2wsXG4gIGdyb3VwX2NvbGxhcHNlcjogZm9ybV9ncm91cF9jb2xsYXBzZXIsXG5cbiAgLy9TcGVjaWFsXG4gIGNvbG9yX2lucHV0OiBmb3JtX2NvbG9yX2lucHV0LFxuICBkYXRlX3RpbWVfaW5wdXQ6IGZvcm1fZGF0ZV90aW1lX2lucHV0LFxuICBGb3JtRGF0ZVRpbWVUeXBlLFxuICBpcF9pbnB1dDogZm9ybV9pcF9pbnB1dCxcbiAgcGFzc3dvcmRfaW5wdXQ6IGZvcm1fcGFzc3dvcmRfaW5wdXQsXG5cbiAgLy9OdW1iZXJcbiAgcHJvZ3Jlc3M6IGZvcm1fcHJvZ3Jlc3MsXG4gIGlucHV0X251bWJlcjogZm9ybV9udW1iZXJfaW5wdXQsXG4gIHNsaWRlcjogZm9ybV9zbGlkZXIsXG4gIHN0ZXBwZXI6IGZvcm1fc3RlcHBlcixcblxuICAvL1NlbGVjdG9yc1xuICBkcm9wZG93bjogZm9ybV9kcm9wZG93bixcbiAgdG9nZ2xlX2J1dHRvbjogZm9ybV90b2dnbGVfYnV0dG9uLFxuXG4gIC8vU3BhY2luZ1xuICBzcGFjZXI6IGZvcm1fc3BhY2VyLFxuXG4gIC8vVGV4dFxuICB0ZXh0OiBmb3JtX3RleHQsXG4gIGlucHV0X3RleHQ6IGZvcm1fdGV4dF9pbnB1dCxcbiAgbXVsdGlsaW5lX3RleHQ6IGZvcm1fdGV4dF9tdWx0aWxpbmUsXG5cbiAgLy9MaXN0XG4gIGxpc3RfZmllbGQ6IGZvcm1fbGlzdF9maWVsZCxcbn07XG5leHBvcnQgZGVmYXVsdCBmb3JtO1xuXG5leHBvcnQgeyBGb3JtQ29sb3JzIH0gZnJvbSBcIi4vYmFzZVwiO1xuZXhwb3J0IHsgRm9ybURhdGVUaW1lVHlwZSB9IGZyb20gXCIuL3NwZWNpYWwvZGF0ZV90aW1lL2RhdGVfdGltZV9pbnB1dFwiO1xuIl0sIm1hcHBpbmdz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