fantasy-ngzorro 2.2.37 → 2.2.39

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.
@@ -14,6 +14,67 @@ import { Page } from "../model/common-type";
14
14
  import { CommonSessionService } from "../service/common-session.service";
15
15
  import { getTableScrollXViewportWidth, getTableViewportWidth, } from "../utils/hd-table-scroll.util";
16
16
  import { TableCacheOption, TreeGrid, } from "./hd-table.service";
17
+ /**
18
+ * 勾选列宽(px),与模板 nzWidth、less 兜底保持一致
19
+ * @type {?}
20
+ */
21
+ const SELECT_COL_WIDTH = 40;
22
+ /**
23
+ * 横向布局计算结果
24
+ * @record
25
+ */
26
+ function HdTableHorizontalLayout() { }
27
+ if (false) {
28
+ /**
29
+ * 传给 nzScroll.x;只有列宽总和 <= 0 时为 null
30
+ * @type {?}
31
+ */
32
+ HdTableHorizontalLayout.prototype.scrollX;
33
+ /**
34
+ * 按声明宽比例分给各业务列的总补宽,列多时为 0
35
+ * @type {?}
36
+ */
37
+ HdTableHorizontalLayout.prototype.fluidExtra;
38
+ /**
39
+ * 实际渲染总宽 = 声明总宽 + fluidExtra
40
+ * @type {?}
41
+ */
42
+ HdTableHorizontalLayout.prototype.displayTotal;
43
+ /**
44
+ * 列少、靠补宽吃满容器,不需要真正横滚
45
+ * @type {?}
46
+ */
47
+ HdTableHorizontalLayout.prototype.isFluid;
48
+ }
49
+ /**
50
+ * 列多(或量不到容器宽):scroll.x = 声明总宽,正常横滚
51
+ * @param {?} declaredWidth
52
+ * @return {?}
53
+ */
54
+ function fixedLayout(declaredWidth) {
55
+ return {
56
+ scrollX: `${Math.ceil(declaredWidth)}px`,
57
+ fluidExtra: 0,
58
+ displayTotal: declaredWidth,
59
+ isFluid: false,
60
+ };
61
+ }
62
+ /**
63
+ * 列少:scroll.x = 容器宽,差额按声明宽比例分到各业务列
64
+ * @param {?} containerWidth
65
+ * @param {?} declaredWidth
66
+ * @return {?}
67
+ */
68
+ function fluidLayout(containerWidth, declaredWidth) {
69
+ /** @type {?} */
70
+ const fluidExtra = Math.max(0, containerWidth - declaredWidth);
71
+ return {
72
+ scrollX: `${containerWidth}px`,
73
+ fluidExtra,
74
+ displayTotal: declaredWidth + fluidExtra,
75
+ isFluid: true,
76
+ };
77
+ }
17
78
  export class HdTableComponent {
18
79
  /**
19
80
  * @param {?} hostEl
@@ -103,23 +164,21 @@ export class HdTableComponent {
103
164
  */
104
165
  this.virtualScrollActive = null;
105
166
  /**
106
- * 列宽合计(含勾选/序号 + fluid 补宽),footer 表宽与横向 scroll 共用
167
+ * 实际渲染列宽合计(含勾选/序号 + 补宽),合计 footer 表宽用
107
168
  */
108
169
  this.tableColWidthTotal = 0;
109
170
  /**
110
- * fluid:声明列总宽 < 容器时,把差额补到最后一列业务列(不改缓存宽),
111
- * 并设 scroll.x = 容器宽,避免表宽 100% 均摊撑开勾选列;拖拽改宽仍写 col.width。
171
+ * 待按比例分给各业务列的总补宽;只影响展示,不写回 col.width(列宽缓存、拖拽仍用声明宽)
112
172
  */
113
173
  this.fluidExtraWidth = 0;
114
174
  /**
115
- * 列总宽未超出容器(fluid 补宽吃满):不需要真正横滚,
116
- * 用于关掉 ng-zorro fixed-header 带来的常驻 X 轴滚动条。
175
+ * 列少、靠补宽吃满容器:模板据此加 hd-table--fluid-x,隐藏 fixed-header 常驻的横滚槽
117
176
  */
118
177
  this.fluidHorizontal = false;
119
178
  /**
120
- * fluid 补宽目标列缓存,避免模板每格 CD 时反复扫 tableCols
179
+ * 各业务列分到的补宽(按列对象取,applyHorizontalLayout 时整表重建)
121
180
  */
122
- this.fluidExtraTargetCol = null;
181
+ this.fluidExtraByCol = new Map();
123
182
  /**
124
183
  * 数据更新后待复位纵向滚动位置
125
184
  */
@@ -324,10 +383,8 @@ export class HdTableComponent {
324
383
  changes["tableData"]["currentValue"]["pageNumber"] !==
325
384
  changes["tableData"]["previousValue"]["pageNumber"]) {
326
385
  this.pendingResetScrollTop = true;
327
- // pageSize/pageNumber 变化也要重算 scroll / fluid。
328
- // 业务常把 Page.pageSize 写成 content.length(如收款编辑 toPage),
329
- // virtualScroll=false 时若这里跳过,空表初始化后的 fluid 不会补上,勾选列被撑开。
330
- // applyTableScrollMode(false) 在模式未变时只 dealScroll,不会强制重建清排序态。
386
+ // 业务可能把 Page.pageSize 写成 content.length,换数据时就会走到这里,
387
+ // 必须重算横向布局。滚动模式不变时不会重建,排序态不会被清掉。
331
388
  this.applyTableScrollMode(false);
332
389
  // 翻页/改 pageSize:主动多次复位,覆盖 CDK 异步渲染时序
333
390
  this.scheduleResetTableBodyScrollTop();
@@ -339,9 +396,7 @@ export class HdTableComponent {
339
396
  }
340
397
  if (changes["tableData"]) {
341
398
  this.pendingResetScrollTop = true;
342
- // 不论是否虚拟滚动都要重算 scroll / fluid。
343
- // 收款/付款编辑等页 [virtualScroll]=false + 异步灌数据:原先跳过会导致
344
- // 空表初始化后不再补宽,勾选列被均摊撑开。
399
+ // 不论是否虚拟滚动,数据变化后都要重算横向布局
345
400
  this.applyTableScrollMode(false);
346
401
  // 数据更新后复位纵向滚动(含虚拟滚动场景)
347
402
  this.scheduleResetTableBodyScrollTop();
@@ -521,11 +576,11 @@ export class HdTableComponent {
521
576
  return col.fixed === "left" ? `${col.fixedWidth || 0}px` : null;
522
577
  }
523
578
  /**
524
- * 开启合计时序号列的 left(勾选列占 40px)
579
+ * 开启合计时序号列的 left(跟在勾选列后面)
525
580
  * @return {?}
526
581
  */
527
582
  get lineNumberLeft() {
528
- return this.showSelected ? "40px" : "0px";
583
+ return (this.showSelected ? SELECT_COL_WIDTH : 0) + "px";
529
584
  }
530
585
  /**
531
586
  * @return {?}
@@ -542,51 +597,149 @@ export class HdTableComponent {
542
597
  return !(this.scroll && this.scroll.x);
543
598
  }
544
599
  /**
545
- * 展示用列宽:fluid 时最后一列业务列 = 声明宽 + fluidExtraWidth
600
+ * @private
601
+ * @param {?} col
602
+ * @return {?}
603
+ */
604
+ isColVisible(col) {
605
+ return !!col && col.isShow !== false;
606
+ }
607
+ /**
608
+ * 业务列声明宽:未配置时按 fixColWidth
609
+ * @private
610
+ * @param {?} col
611
+ * @return {?}
612
+ */
613
+ getColDeclaredWidth(col) {
614
+ return col && col.width > 0 ? col.width : ColWidth.fixColWidth;
615
+ }
616
+ /**
617
+ * 声明列宽合计:勾选列 + 序号列 + 可见业务列,不含补宽
618
+ * @private
619
+ * @return {?}
620
+ */
621
+ getDeclaredColWidthTotal() {
622
+ /** @type {?} */
623
+ let total = 0;
624
+ if (this.showSelected) {
625
+ total += SELECT_COL_WIDTH;
626
+ }
627
+ if (this.showTableTotal) {
628
+ total += this.lineNumberColWidth;
629
+ }
630
+ (this.tableCols || []).forEach((/**
631
+ * @param {?} col
632
+ * @return {?}
633
+ */
634
+ (col) => {
635
+ if (this.isColVisible(col)) {
636
+ total += this.getColDeclaredWidth(col);
637
+ }
638
+ }));
639
+ return total;
640
+ }
641
+ /**
642
+ * 模板里 th / td / 合计 col 用的列宽:声明宽 + 该列按比例分到的补宽
546
643
  * @param {?} col
547
644
  * @return {?}
548
645
  */
549
646
  getColDisplayWidth(col) {
550
647
  /** @type {?} */
551
- const base = col && col.width != null && col.width > 0
552
- ? col.width
553
- : ColWidth.fixColWidth;
554
- if (this.fluidExtraWidth <= 0 ||
555
- !col ||
556
- !this.fluidExtraTargetCol ||
557
- col !== this.fluidExtraTargetCol) {
558
- return base;
648
+ const declared = this.getColDeclaredWidth(col);
649
+ if (!col || this.fluidExtraWidth <= 0) {
650
+ return declared;
559
651
  }
560
- return base + this.fluidExtraWidth;
652
+ /** @type {?} */
653
+ const extra = this.fluidExtraByCol.get(col);
654
+ return declared + (extra > 0 ? extra : 0);
561
655
  }
562
656
  /**
563
- * 按当前 layout 刷新 fluid 补宽目标列(仅 dealScroll / sync 时调用)
657
+ * 把 fluidExtra 按各可见业务列声明宽比例分配(最大余数法),
658
+ * 勾选列 / 序号列不参与;保证各列补宽之和等于 fluidExtra。
564
659
  * @private
660
+ * @param {?} fluidExtra
565
661
  * @return {?}
566
662
  */
567
- refreshFluidExtraTargetCol() {
568
- this.fluidExtraTargetCol = null;
569
- if (this.fluidExtraWidth <= 0 ||
570
- !this.tableCols ||
571
- !this.tableCols.length) {
663
+ rebuildFluidExtraByCol(fluidExtra) {
664
+ this.fluidExtraByCol = new Map();
665
+ if (fluidExtra <= 0 || !this.tableCols || !this.tableCols.length) {
572
666
  return;
573
667
  }
574
- for (let i = this.tableCols.length - 1; i >= 0; i--) {
575
- /** @type {?} */
576
- const c = this.tableCols[i];
577
- if (c && c.isShow && c.fixed !== "right") {
578
- this.fluidExtraTargetCol = c;
668
+ /** @type {?} */
669
+ const parts = [];
670
+ /** @type {?} */
671
+ let sumDeclared = 0;
672
+ this.tableCols.forEach((/**
673
+ * @param {?} col
674
+ * @return {?}
675
+ */
676
+ (col) => {
677
+ if (!this.isColVisible(col)) {
579
678
  return;
580
679
  }
680
+ /** @type {?} */
681
+ const declared = this.getColDeclaredWidth(col);
682
+ sumDeclared += declared;
683
+ parts.push({ col, declared, share: 0, frac: 0 });
684
+ }));
685
+ if (sumDeclared <= 0 || !parts.length) {
686
+ return;
581
687
  }
582
- for (let i = this.tableCols.length - 1; i >= 0; i--) {
688
+ /** @type {?} */
689
+ let assigned = 0;
690
+ parts.forEach((/**
691
+ * @param {?} part
692
+ * @return {?}
693
+ */
694
+ (part) => {
583
695
  /** @type {?} */
584
- const c = this.tableCols[i];
585
- if (c && c.isShow) {
586
- this.fluidExtraTargetCol = c;
696
+ const exact = (fluidExtra * part.declared) / sumDeclared;
697
+ part.share = Math.floor(exact);
698
+ part.frac = exact - part.share;
699
+ assigned += part.share;
700
+ }));
701
+ /** @type {?} */
702
+ let remain = fluidExtra - assigned;
703
+ parts
704
+ .slice()
705
+ .sort((/**
706
+ * @param {?} a
707
+ * @param {?} b
708
+ * @return {?}
709
+ */
710
+ (a, b) => b.frac - a.frac))
711
+ .forEach((/**
712
+ * @param {?} part
713
+ * @return {?}
714
+ */
715
+ (part) => {
716
+ if (remain <= 0) {
587
717
  return;
588
718
  }
589
- }
719
+ part.share += 1;
720
+ remain -= 1;
721
+ }));
722
+ parts.forEach((/**
723
+ * @param {?} part
724
+ * @return {?}
725
+ */
726
+ (part) => {
727
+ if (part.share > 0) {
728
+ this.fluidExtraByCol.set(part.col, part.share);
729
+ }
730
+ }));
731
+ }
732
+ /**
733
+ * 把横向布局结果写回组件状态(dealScroll / syncHorizontalScroll 共用)
734
+ * @private
735
+ * @param {?} layout
736
+ * @return {?}
737
+ */
738
+ applyHorizontalLayout(layout) {
739
+ this.fluidExtraWidth = layout.fluidExtra;
740
+ this.fluidHorizontal = layout.isFluid;
741
+ this.rebuildFluidExtraByCol(layout.fluidExtra);
742
+ this.tableColWidthTotal = layout.displayTotal;
590
743
  }
591
744
  /**
592
745
  * fluid → 100%;固定 → scroll.x(与表体同一套横向宽度)
@@ -701,23 +854,7 @@ export class HdTableComponent {
701
854
  // ng-zorro 只在 AfterViewInit 绑一次 header/body 的 scroll 同步;
702
855
  // 若先以 y=null 创建再改成有 y,表头监听会丢,表现为列头不跟着横滚。
703
856
  this.presetScrollBeforeRemount(useVirtual);
704
- this.showTable = false;
705
- this.cdr.markForCheck();
706
- setTimeout((/**
707
- * @return {?}
708
- */
709
- () => {
710
- this.showTable = true;
711
- this.cdr.markForCheck();
712
- setTimeout((/**
713
- * @return {?}
714
- */
715
- () => {
716
- this.dealScroll();
717
- this.cdr.markForCheck();
718
- this.afterTableRender(useVirtual);
719
- }));
720
- }));
857
+ this.remountTable(useVirtual);
721
858
  return;
722
859
  }
723
860
  /** @type {?} */
@@ -729,32 +866,40 @@ export class HdTableComponent {
729
866
  const nextHasX = !!(this.scroll && this.scroll.x);
730
867
  /** @type {?} */
731
868
  const nextHasY = !!(this.scroll && this.scroll.y);
732
- // 运行中 x/y 从有变无/从无变有时,也必须重建:
733
- // - y:ng-zorro 只在 AfterViewInit 绑一次 header/body 同步
734
- // - x:空表 scroll.x=null(table-layout:auto)→ 有数据后设 scroll.x(fixed),
735
- // 不重建时勾选列仍按 auto 均摊撑开(收款编辑等异步灌数页)
869
+ // scroll.x / scroll.y 从无到有(或反过来)时必须重建,原地改值不生效:
870
+ // - y:ng-zorro 8 只在 AfterViewInit 绑一次表头/表体滚动同步,且决定表头是否拆成独立 table
871
+ // - x:决定是否带 ant-table-fixed(table-layout: fixed),勾选列锁宽依赖它
736
872
  if (prevHasY !== nextHasY || prevHasX !== nextHasX) {
737
- this.showTable = false;
873
+ this.remountTable(useVirtual);
874
+ return;
875
+ }
876
+ this.cdr.markForCheck();
877
+ this.afterTableRender(useVirtual);
878
+ }
879
+ /**
880
+ * 销毁并重建 nz-table:等 DOM 出来后再按真实容器宽重算一次横向布局
881
+ * @private
882
+ * @param {?} useVirtual
883
+ * @return {?}
884
+ */
885
+ remountTable(useVirtual) {
886
+ this.showTable = false;
887
+ this.cdr.markForCheck();
888
+ setTimeout((/**
889
+ * @return {?}
890
+ */
891
+ () => {
892
+ this.showTable = true;
738
893
  this.cdr.markForCheck();
739
894
  setTimeout((/**
740
895
  * @return {?}
741
896
  */
742
897
  () => {
743
- this.showTable = true;
898
+ this.dealScroll();
744
899
  this.cdr.markForCheck();
745
- setTimeout((/**
746
- * @return {?}
747
- */
748
- () => {
749
- this.dealScroll();
750
- this.cdr.markForCheck();
751
- this.afterTableRender(useVirtual);
752
- }));
900
+ this.afterTableRender(useVirtual);
753
901
  }));
754
- return;
755
- }
756
- this.cdr.markForCheck();
757
- this.afterTableRender(useVirtual);
902
+ }));
758
903
  }
759
904
  /**
760
905
  * 重建前预设 scroll,保证 AfterViewInit 时 header/body 结构已正确
@@ -1472,27 +1617,27 @@ export class HdTableComponent {
1472
1617
  getVirtualScrollY(maxOffset) {
1473
1618
  return `calc(100vh - ${maxOffset}px)`;
1474
1619
  }
1475
- /**
1476
- * @private
1477
- * @return {?}
1478
- */
1479
- hasTableData() {
1480
- return !!(this.tableData &&
1481
- this.tableData.content &&
1482
- this.tableData.content.length);
1483
- }
1484
- /**
1485
- * 按声明列总宽 + 容器宽,计算 scroll.x 与 fluid 补宽。
1486
- * 列少:scroll.x = 内容区宽(clientWidth),差额加到最后业务列(勾选保持 40);
1487
- * 列多:scroll.x = 声明总宽。
1488
- * 比较是否超宽用 offsetWidth(含 Y 槽),避免「仅因纵滚条」误开横滚;
1489
- * 补宽目标用 clientWidth,且 scroll.x 用 floor,避免表宽多 1px 逼出 X 轴滚动条。
1620
+ /*
1621
+ * 横向布局(勾选列锁 40px 的关键)
1622
+ *
1623
+ * 勾选列只有在 table-layout: fixed 下才锁得住:ng-zorro 8 仅在 nzScroll.x 有值时
1624
+ * 给 table 加 ant-table-fixed;auto 布局下 table 宽 100%、每列都有 nzWidth,
1625
+ * 剩余空间会按比例摊到所有列(含勾选列),单元格上的 max-width 也不生效。
1626
+ * 所以只要有列(无论有没有数据)就一定设置 scroll.x:
1627
+ * - 列少:scroll.x = 容器宽,差额按声明宽比例分到各业务列(fluid,不出真横滚)
1628
+ * - 列多:scroll.x = 声明总宽,正常横滚
1629
+ * less 里勾选列的 40px 只是 fixed 布局下的兜底。
1630
+ */
1631
+ /**
1632
+ * 按声明列宽合计 + 容器宽算出横向布局。
1633
+ * 判断「是否超宽」用 offsetWidth(含竖滚条槽),避免只因竖滚条就误开横滚;
1634
+ * 补宽目标用 clientWidth 并向下取整,避免表宽多 1px 逼出横滚条。
1490
1635
  * @private
1491
1636
  * @param {?} declaredColWidth
1492
1637
  * @return {?}
1493
1638
  */
1494
1639
  resolveHorizontalLayout(declaredColWidth) {
1495
- if (!this.hasTableData() || declaredColWidth <= 0) {
1640
+ if (declaredColWidth <= 0) {
1496
1641
  return {
1497
1642
  scrollX: null,
1498
1643
  fluidExtra: 0,
@@ -1501,108 +1646,57 @@ export class HdTableComponent {
1501
1646
  };
1502
1647
  }
1503
1648
  /** @type {?} */
1504
- let viewportCompare = this.nzTableComponent
1649
+ let compareWidth = this.nzTableComponent
1505
1650
  ? getTableScrollXViewportWidth(this.nzTableComponent)
1506
1651
  : 0;
1507
- // 表体尚未量到宽时(异步灌数 / spin / 刚 remount),用宿主宽兜底
1508
- if (viewportCompare <= 0 && this.hostEl && this.hostEl.nativeElement) {
1509
- /** @type {?} */
1510
- const hostW = ((/** @type {?} */ (this.hostEl.nativeElement))).offsetWidth;
1511
- if (hostW > 0) {
1512
- viewportCompare = hostW;
1513
- }
1652
+ // 表体还没渲染出来(刚重建 / 在 spin 里)时用宿主宽兜底
1653
+ if (compareWidth <= 0 && this.hostEl && this.hostEl.nativeElement) {
1654
+ compareWidth = ((/** @type {?} */ (this.hostEl.nativeElement))).offsetWidth;
1514
1655
  }
1515
- if (viewportCompare > 0) {
1516
- if (declaredColWidth > viewportCompare + 1) {
1517
- return {
1518
- scrollX: `${Math.ceil(declaredColWidth)}px`,
1519
- fluidExtra: 0,
1520
- displayTotal: declaredColWidth,
1521
- isFluid: false,
1522
- };
1523
- }
1524
- /** @type {?} */
1525
- const fillWidth = this.nzTableComponent
1526
- ? getTableViewportWidth(this.nzTableComponent)
1527
- : 0;
1528
- /** @type {?} */
1529
- const target = Math.floor(fillWidth > 0 ? fillWidth : viewportCompare);
1530
- /** @type {?} */
1531
- const fluidExtra = Math.max(0, target - declaredColWidth);
1532
- return {
1533
- scrollX: `${target}px`,
1534
- fluidExtra,
1535
- displayTotal: declaredColWidth + fluidExtra,
1536
- isFluid: true,
1537
- };
1656
+ // 仍量不到(如宿主在 display:none 里):先按声明宽走 fixed,等 ResizeObserver 触发再转 fluid
1657
+ if (compareWidth <= 0) {
1658
+ return fixedLayout(declaredColWidth);
1538
1659
  }
1539
- // 视口仍测不到:至少用声明宽设 scroll.x,强制 fixed 布局锁勾选列,
1540
- // 避免落回 table-layout:auto 被均摊撑开;后续 sync/remount 再转 fluid。
1541
- return {
1542
- scrollX: `${Math.ceil(declaredColWidth)}px`,
1543
- fluidExtra: 0,
1544
- displayTotal: declaredColWidth,
1545
- isFluid: false,
1546
- };
1660
+ // 1px 容差,避免亚像素误判
1661
+ if (declaredColWidth > compareWidth + 1) {
1662
+ return fixedLayout(declaredColWidth);
1663
+ }
1664
+ /** @type {?} */
1665
+ const fillWidth = this.nzTableComponent
1666
+ ? getTableViewportWidth(this.nzTableComponent)
1667
+ : 0;
1668
+ /** @type {?} */
1669
+ const containerWidth = Math.floor(fillWidth > 0 ? fillWidth : compareWidth);
1670
+ return fluidLayout(containerWidth, declaredColWidth);
1547
1671
  }
1548
1672
  /**
1549
- * 表格渲染后按实际容器宽度校正横向 scroll / fluid 补宽
1673
+ * 表格渲染后按真实容器宽校正横向布局;只改 x,y 保持不变
1550
1674
  * @private
1551
1675
  * @return {?}
1552
1676
  */
1553
1677
  syncHorizontalScroll() {
1554
- /** @type {?} */
1555
- let declared = 0;
1556
- if (this.showSelected) {
1557
- declared += 40;
1558
- }
1559
- if (this.showTableTotal) {
1560
- declared += this.lineNumberColWidth;
1561
- }
1562
- if (this.tableCols) {
1563
- this.tableCols.forEach((/**
1564
- * @param {?} item
1565
- * @return {?}
1566
- */
1567
- (item) => {
1568
- if (item && item.isShow !== false) {
1569
- declared += item.width > 0 ? item.width : ColWidth.fixColWidth;
1570
- }
1571
- }));
1572
- }
1573
1678
  /** @type {?} */
1574
1679
  const prevHasX = !!(this.scroll && this.scroll.x);
1575
1680
  /** @type {?} */
1576
- const layout = this.resolveHorizontalLayout(declared);
1577
- /** @type {?} */
1578
- const currentY = this.scroll ? this.scroll.y : null;
1579
- /** @type {?} */
1580
- const nextHasX = !!layout.scrollX;
1581
- /** @type {?} */
1582
- const sameX = this.scroll && this.scroll.x === layout.scrollX;
1681
+ const layout = this.resolveHorizontalLayout(this.getDeclaredColWidthTotal());
1583
1682
  /** @type {?} */
1584
- const sameExtra = this.fluidExtraWidth === layout.fluidExtra;
1585
- /** @type {?} */
1586
- const sameFluid = this.fluidHorizontal === layout.isFluid;
1587
- if (sameX &&
1588
- sameExtra &&
1589
- sameFluid &&
1590
- this.scroll &&
1591
- this.scroll.y === currentY) {
1683
+ const unchanged = this.scroll &&
1684
+ this.scroll.x === layout.scrollX &&
1685
+ this.fluidExtraWidth === layout.fluidExtra &&
1686
+ this.fluidHorizontal === layout.isFluid;
1687
+ if (unchanged) {
1592
1688
  setTimeout((/**
1593
1689
  * @return {?}
1594
1690
  */
1595
1691
  () => this.syncTotalFooterWithBody()));
1596
1692
  return;
1597
1693
  }
1598
- this.fluidExtraWidth = layout.fluidExtra;
1599
- this.fluidHorizontal = layout.isFluid;
1600
- this.refreshFluidExtraTargetCol();
1601
- this.tableColWidthTotal = layout.displayTotal;
1602
- this.scroll = { x: layout.scrollX, y: currentY };
1694
+ this.applyHorizontalLayout(layout);
1695
+ this.refreshStickyOffsets();
1696
+ this.scroll = { x: layout.scrollX, y: this.scroll ? this.scroll.y : null };
1603
1697
  this.cdr.markForCheck();
1604
- // sync 阶段若补上了 scroll.x,需重建才能切到 fixed 布局
1605
- if (prevHasX !== nextHasX) {
1698
+ // x 从无到有(或反过来)要重建才能切换 table-layout
1699
+ if (prevHasX !== !!layout.scrollX) {
1606
1700
  this.applyTableScrollMode(true);
1607
1701
  return;
1608
1702
  }
@@ -1843,18 +1937,21 @@ export class HdTableComponent {
1843
1937
  }), 100);
1844
1938
  }
1845
1939
  /**
1940
+ * 左/右冻结偏移按展示宽累计(fluid 比例补宽后各列变宽,不能再用声明宽)。
1941
+ * 须在 applyHorizontalLayout 之后调用。
1942
+ * @private
1846
1943
  * @return {?}
1847
1944
  */
1848
- dealScroll() {
1945
+ refreshStickyOffsets() {
1849
1946
  /** @type {?} */
1850
- let colWidth = 0;
1947
+ let leftOffset = 0;
1851
1948
  if (this.showSelected) {
1852
- colWidth += 40;
1949
+ leftOffset += SELECT_COL_WIDTH;
1853
1950
  }
1854
1951
  if (this.showTableTotal) {
1855
- colWidth += this.lineNumberColWidth; // 序号列(固定宽,不随位数变化)
1952
+ leftOffset += this.lineNumberColWidth;
1856
1953
  }
1857
- this.tableCols.forEach((/**
1954
+ (this.tableCols || []).forEach((/**
1858
1955
  * @param {?} item
1859
1956
  * @return {?}
1860
1957
  */
@@ -1862,34 +1959,45 @@ export class HdTableComponent {
1862
1959
  if (!item.width) {
1863
1960
  item.width = ColWidth.fixColWidth;
1864
1961
  }
1865
- if (item.isShow !== false) {
1866
- item.fixedWidth = colWidth;
1867
- colWidth += item.width;
1962
+ if (this.isColVisible(item)) {
1963
+ item.fixedWidth = leftOffset;
1964
+ leftOffset += this.getColDisplayWidth(item);
1868
1965
  }
1869
1966
  }));
1870
- // 右侧固定列:从右往左累计偏移,避免多列都 right:0 互相遮挡
1871
1967
  /** @type {?} */
1872
1968
  let rightOffset = 0;
1873
- for (let i = this.tableCols.length - 1; i >= 0; i--) {
1969
+ for (let i = (this.tableCols || []).length - 1; i >= 0; i--) {
1874
1970
  /** @type {?} */
1875
1971
  const item = this.tableCols[i];
1876
- if (item.isShow === false) {
1972
+ if (!this.isColVisible(item)) {
1877
1973
  continue;
1878
1974
  }
1879
1975
  if (item.fixed === "right") {
1880
1976
  item.fixedRightWidth = rightOffset;
1881
- rightOffset += item.width;
1977
+ rightOffset += this.getColDisplayWidth(item);
1882
1978
  }
1883
1979
  else {
1884
1980
  item.fixedRightWidth = 0;
1885
1981
  }
1886
1982
  }
1983
+ }
1984
+ /**
1985
+ * @return {?}
1986
+ */
1987
+ dealScroll() {
1988
+ (this.tableCols || []).forEach((/**
1989
+ * @param {?} item
1990
+ * @return {?}
1991
+ */
1992
+ (item) => {
1993
+ if (!item.width) {
1994
+ item.width = ColWidth.fixColWidth;
1995
+ }
1996
+ }));
1887
1997
  /** @type {?} */
1888
- const layout = this.resolveHorizontalLayout(colWidth);
1889
- this.fluidExtraWidth = layout.fluidExtra;
1890
- this.fluidHorizontal = layout.isFluid;
1891
- this.refreshFluidExtraTargetCol();
1892
- this.tableColWidthTotal = layout.displayTotal;
1998
+ const layout = this.resolveHorizontalLayout(this.getDeclaredColWidthTotal());
1999
+ this.applyHorizontalLayout(layout);
2000
+ this.refreshStickyOffsets();
1893
2001
  /** @type {?} */
1894
2002
  const maxOffset = this.getScrollYMaxOffset();
1895
2003
  /** @type {?} */
@@ -2855,7 +2963,7 @@ export class HdTableComponent {
2855
2963
  HdTableComponent.decorators = [
2856
2964
  { type: Component, args: [{
2857
2965
  selector: "hd-table",
2858
- template: "<ng-container>\n <hd-button-group>\n <ng-template #buttonGroupLeft>\n <ng-container *ngTemplateOutlet=\"tableLeftButton\"></ng-container>\n <hd-button *ngIf=\"showOperateColWarpButton\" type=\"default\" (click)=\"toggleShowDetail()\">{{showDetail ?\n '\u7F29\u7565\u663E\u793A': '\u5C55\u5F00\u663E\u793A'}}</hd-button>\n </ng-template>\n <ng-template #buttonGroupRight>\n <ng-container *ngTemplateOutlet=\"tableRightButton\"></ng-container>\n <ng-container *ngIf=\"showColSettings\">\n <span class=\"hd-table-col-settings\" nz-dropdown nzTrigger=\"click\" [nzDropdownMenu]=\"menu\"\n [nzVisible]=\"isDropdownVisible\" (click)=\"confirmDropdown()\" title=\"\u5217\u8BBE\u7F6E\">\n <svg class=\"hd-table-col-settings-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M4.92031 1.80756C5.02551 1.42884 5.37033 1.16675 5.76339 1.16675H8.23667C8.62973 1.16675 8.97455 1.42884 9.07975 1.80756L9.37802 2.88133L10.4571 2.60273C10.8377 2.50448 11.2371 2.67206 11.4336 3.01245L12.6703 5.15438C12.8668 5.49478 12.8122 5.92445 12.5369 6.20491L11.7561 7.00008L12.5369 7.79525C12.8122 8.07572 12.8668 8.50539 12.6703 8.84579L11.4336 10.9877C11.2371 11.3281 10.8377 11.4957 10.4571 11.3974L9.37802 11.1188L9.07975 12.1926C8.97455 12.5713 8.62973 12.8334 8.23667 12.8334H5.76339C5.37033 12.8334 5.02551 12.5713 4.92031 12.1926L4.62206 11.1189L3.54315 11.3974C3.16258 11.4957 2.76318 11.3281 2.56666 10.9877L1.33001 8.84579C1.13349 8.50539 1.18806 8.07572 1.46343 7.79525L2.24419 7.00008L1.46344 6.20491C1.18806 5.92445 1.13349 5.49478 1.33002 5.15438L2.56666 3.01245C2.76319 2.67206 3.16258 2.50448 3.54316 2.60273L4.62206 2.88127L4.92031 1.80756ZM4.54541 10.843L4.54552 10.8433L4.54541 10.843ZM5.98508 2.33341L5.66952 3.46945C5.54185 3.92906 5.06958 4.20173 4.60771 4.08249L3.46618 3.78778L2.45122 5.54572L3.2773 6.38705C3.6115 6.72742 3.6115 7.27275 3.2773 7.61312L2.45122 8.45444L3.46617 10.2124L4.60771 9.91768C5.06958 9.79844 5.54185 10.0711 5.66952 10.5307L5.98508 11.6667H8.01498L8.33056 10.5307C8.45823 10.071 8.9305 9.79838 9.39237 9.91762L10.5341 10.2124L11.5491 8.45444L10.723 7.61312C10.3888 7.27275 10.3888 6.72742 10.723 6.38705L11.5491 5.54572L10.5341 3.78778L9.39237 4.08254C8.9305 4.20178 8.45823 3.92912 8.33056 3.46951L8.01498 2.33341H5.98508ZM7.00003 5.83342C6.3557 5.83342 5.83337 6.35575 5.83337 7.00008C5.83337 7.64441 6.3557 8.16675 7.00003 8.16675C7.64436 8.16675 8.1667 7.64441 8.1667 7.00008C8.1667 6.35575 7.64436 5.83342 7.00003 5.83342ZM4.6667 7.00008C4.6667 5.71142 5.71137 4.66675 7.00003 4.66675C8.2887 4.66675 9.33337 5.71142 9.33337 7.00008C9.33337 8.28875 8.2887 9.33342 7.00003 9.33342C5.71137 9.33342 4.6667 8.28875 4.6667 7.00008Z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <nz-dropdown-menu #menu=\"nzDropdownMenu\">\n <div class=\"hd-table-col-settings-dropdown\">\n <div class=\"hd-table-col-settings-list\">\n <div *ngIf=\"showListNodes && nowListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"nowListNodes\" nzCheckable nzDraggable nzBlockNode\n nzShowExpand=\"false\" (nzCheckBoxChange)=\"checkAction($event)\" [nzBeforeDrop]=\"beforeDrop\"\n [nzTreeTemplate]=\"nzTreeTemplate\">\n </nz-tree>\n <ng-template #nzTreeTemplate let-node>\n <span\n class=\"ng-tns-c31-110 draggable ng-star-inserted ant-tree-node-content-wrapper ant-tree-node-content-wrapper-close\"\n [title]=\"node.key\" draggable=\"true\" aria-grabbed=\"true\">\n <span class=\"ant-tree-title\">\n <div class=\"hd-table-tree-node\">\n <span>{{node.key}}</span>\n <div *ngIf=\"!node.origin.disabled\" class=\"hd-table-tree-node-img\">\n <i nz-icon nzType=\"caret-up\" nzTheme=\"outline\"></i>\n <i nz-icon nzType=\"caret-down\" nzTheme=\"outline\"></i>\n </div>\n </div>\n </span>\n </span>\n </ng-template>\n </div>\n <div *ngIf=\"showListNodes && hideListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"hideListNodes\" nzCheckable nzShowExpand=\"false\"\n (nzCheckBoxChange)=\"checkAction($event)\">\n </nz-tree>\n </div>\n </div>\n <div class=\"hd-table-col-settings-footer\">\n <hd-button style=\"margin-right: 4px;\" type=\"default\" size=\"small\" (clickAction)=\"cancelDropdown()\">\u53D6\u6D88\n </hd-button>\n <hd-button type=\"primary\" size=\"small\" (clickAction)=\"submitGrids()\">\u5B8C\u6210</hd-button>\n </div>\n </div>\n </nz-dropdown-menu>\n </ng-container>\n </ng-template>\n </hd-button-group>\n <hd-space type=\"row\" size=\"12\"></hd-space>\n <ng-container *ngTemplateOutlet=\"tableTotal\"></ng-container>\n <hd-space *ngIf=\"tableTotal\" type=\"row\" size=\"12\"></hd-space>\n <nz-table *ngIf=\"showTable\" #hdTable class=\"hd-table-container\" [class.hd-table--virtual]=\"useVirtualScroll\"\n [class.hd-table--scroll-y]=\"!!(scroll && scroll.y)\" [class.hd-table--scroll-x]=\"!!(scroll && scroll.x)\"\n [class.hd-table--fluid-x]=\"fluidHorizontal\" [class.hd-table--has-select]=\"showSelected\"\n [class.hd-table--has-total]=\"showTableTotal\" [nzScroll]=\"scroll\" [nzShowPagination]=\"pagination\"\n [nzShowSizeChanger]=\"pagination\" [nzShowQuickJumper]=\"pagination\" [nzFrontPagination]=\"useFrontPagination\"\n nzSize=\"middle\" [nzData]=\"tableData.content\" [nzTotal]=\"getTableTotalCount()\" [(nzPageIndex)]=\"tablePageIndex\"\n [nzLoading]=\"tableLoading\" [nzPageSizeOptions]=\"[ 10, 50, 100, 200, 500, 1000 ]\" [(nzPageSize)]=\"tablePageSize\"\n (nzPageSizeChange)=\"pagination ? search(true) : null\" (nzPageIndexChange)=\"pagination ? search(false) : null\"\n (nzCurrentPageDataChange)=\"showSelected ? currentPageDataChange($event) : null\" [nzShowTotal]=\"tableTotalTemplate\"\n [nzFooter]=\"showTableTotal ? tableTotalFooter : null\" [nzVirtualScroll]=\"useVirtualScroll\"\n [nzVirtualItemSize]=\"useVirtualScroll ? effectiveVirtualItemSize : 0\" [nzVirtualForTrackBy]=\"virtualTrackByRow\">\n <thead (nzSortChange)=\"sort($event)\" nzSingleSort>\n <tr>\n <th nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showSelected && selectType !== 'radio'\" nzShowCheckbox\n [(nzChecked)]=\"isAllDisplayDataChecked\" [nzIndeterminate]=\"isIndeterminate\"\n (nzCheckedChange)=\"checkAll($event)\"></th>\n <th nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showSelected && selectType === 'radio'\"></th>\n <th class=\"hd-table-line-no-col\" [nzWidth]=\"lineNumberColWidthPx\" [nzLeft]=\"lineNumberLeft\"\n *ngIf=\"showTableTotal\">\u5E8F\u53F7</th>\n <ng-container *ngFor=\"let col of tableCols\">\n <th *ngIf=\"col.isShow\" [nzWidth]=\"getColDisplayWidth(col) + 'px'\" [nzAlign]=\"col.align\"\n [nzLeft]=\"getLeftSticky(col)\" [nzRight]=\"getRightSticky(col)\" nz-resizable nzBounds=\"window\" nzPreview\n (nzResizeEnd)=\"onResize($event, col)\" [nzShowSort]=\"col.canSort\" [nzSortKey]=\"col.name\"\n [nzSort]=\"getColSort(col)\">\n <span class=\"hd-table-col-title\">\n <span class=\"hd-table-col-require\" *ngIf=\"col.require && col.editType\">*</span>\n <ng-container *ngIf=\"getTitleParts(col) as titleParts; else plainTitle\">\n <span class=\"hd-table-title-with-bar\">{{ titleParts[0] }}<i class=\"hd-table-row-no-bar\"></i>{{\n titleParts[1] }}</span>\n </ng-container>\n <ng-template #plainTitle>{{ col.title }}</ng-template>\n </span>\n <nz-resize-handle nzDirection=\"right\">\n <div class=\"resize-trigger\"></div>\n </nz-resize-handle>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody>\n <ng-template *ngIf=\"useVirtualScroll\" nz-virtual-scroll let-data let-index=\"index\">\n <tr class=\"hd-table-virtual-row\" [class.hd-table-row-invalid]=\"isInvalidRow(data)\">\n <ng-container *ngTemplateOutlet=\"tableCells; context: { $implicit: data, index: index }\"></ng-container>\n </tr>\n </ng-template>\n <ng-container *ngIf=\"!useVirtualScroll\">\n <tr *ngFor=\"let data of hdTable.data; trackBy: trackByRow; index as i\"\n [class.hd-table-row-invalid]=\"isInvalidRow(data)\">\n <ng-container *ngTemplateOutlet=\"tableCells; context: { $implicit: data, index: i }\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n <ng-template #tableTotalTemplate>\n \u5171 {{ getTableTotalCount() }} \u6761\u6570\u636E\n </ng-template>\n <ng-template #tableTotalFooter>\n <!--\n \u5217\u603B\u5BBD < \u5BB9\u5668\uFF1Ascroll.x=\u5BB9\u5668\u5BBD\uFF0C\u5DEE\u989D\u8865\u5230\u6700\u540E\u4E1A\u52A1\u5217\uFF08\u52FE\u9009\u4FDD\u6301 40\uFF09\uFF1B\u53EF\u62D6\u62FD\u3002\n \u5217\u603B\u5BBD > \u5BB9\u5668\uFF1Ascroll.x=\u58F0\u660E\u603B\u5BBD\uFF0C\u6A2A\u6EDA\u540C\u6B65\u3002\n -->\n <div class=\"hd-table-total-footer\" [class.hd-table-total-footer--fluid]=\"isTotalFooterFluid\"\n [class.hd-table-total-footer--y-gutter]=\"totalFooterNeedYGutter\">\n <table class=\"hd-table-total-footer-table\" [style.width]=\"totalFooterTableWidth\">\n <colgroup>\n <!-- \u52FE\u9009/\u5E8F\u53F7\u9501\u5BBD\uFF0C\u4E0D\u53C2\u4E0E\u5747\u644A -->\n <col *ngIf=\"showSelected\" style=\"width: 40px; min-width: 40px; max-width: 40px;\" />\n <col *ngIf=\"showTableTotal\" [style.width.px]=\"lineNumberColWidth\" [style.min-width.px]=\"lineNumberColWidth\"\n [style.max-width.px]=\"lineNumberColWidth\" />\n <ng-container *ngFor=\"let col of tableCols; trackBy: trackByCol\">\n <col *ngIf=\"col.isShow\" [style.width.px]=\"getColDisplayWidth(col)\" />\n </ng-container>\n </colgroup>\n <tr class=\"hd-table-total\">\n <td *ngIf=\"showSelected\" class=\"hd-table-total-footer-cell hd-table-total-footer-select\"\n [class.hd-table-total-footer-sticky-left]=\"!isTotalFooterFluid\" style=\"left: 0;\">&nbsp;</td>\n <td class=\"hd-table-total-footer-cell hd-table-total-footer-line-no\"\n [class.hd-table-total-footer-sticky-left]=\"!isTotalFooterFluid\"\n [style.left]=\"!isTotalFooterFluid ? lineNumberLeft : null\">\u5408\u8BA1</td>\n <ng-container *ngFor=\"let col of tableCols; let colIndex = index; trackBy: trackByCol\">\n <td *ngIf=\"col.isShow\" class=\"hd-table-total-footer-cell\"\n [class.hd-table-total-footer-sticky-left]=\"!isTotalFooterFluid && col.fixed === 'left'\"\n [class.hd-table-total-footer-sticky-right]=\"!isTotalFooterFluid && col.fixed === 'right'\"\n [class.hd-table-total-align-left]=\"getTableTotalCellAlign(col, colIndex) === 'left'\"\n [class.hd-table-total-align-center]=\"getTableTotalCellAlign(col, colIndex) === 'center'\"\n [class.hd-table-total-align-right]=\"getTableTotalCellAlign(col, colIndex) === 'right'\"\n [style.left]=\"!isTotalFooterFluid && col.fixed === 'left' ? (col.fixedWidth || 0) + 'px' : null\"\n [style.right]=\"!isTotalFooterFluid && col.fixed === 'right' ? (col.fixedRightWidth || 0) + 'px' : null\"\n [ngStyle]=\"{'text-align': getTableTotalCellAlign(col, colIndex)}\">\n {{ getTableTotalCellValue(col, colIndex) }}\n </td>\n </ng-container>\n </tr>\n </table>\n </div>\n </ng-template>\n </nz-table>\n</ng-container>\n\n<ng-template #tableCells let-data let-index=\"index\">\n <td nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showSelected && selectType !== 'radio'\" nzShowCheckbox\n [nzChecked]=\"mapOfCheckedId[data[selectField]]\" [nzDisabled]=\"isSelectDisabled(data)\"\n (nzCheckedChange)=\"refreshStatus($event, data)\"></td>\n <td nzWidth=\"40px\" nzLeft=\"0px\" class=\"hd-table-select-radio\" *ngIf=\"showSelected && selectType === 'radio'\">\n <label nz-radio [nzDisabled]=\"isSelectDisabled(data)\" [ngModel]=\"!!mapOfCheckedId[data[selectField]]\"\n (ngModelChange)=\"onRadioSelect($event, data)\"></label>\n </td>\n <td class=\"hd-table-line-no-col\" [nzWidth]=\"lineNumberColWidthPx\" [nzLeft]=\"lineNumberLeft\" *ngIf=\"showTableTotal\">{{\n getLineNumber(index) }}</td>\n <ng-container *ngFor=\"let col of tableCols; trackBy: trackByCol\">\n <td *ngIf=\"col.isShow\" [style.max-width.px]=\"getColDisplayWidth(col)\" [nzAlign]=\"col.align\"\n [nzLeft]=\"getLeftSticky(col)\" [nzRight]=\"getRightSticky(col)\"\n [ngClass]=\"(col.canWarp && showDetail) ? 'common-td-wrap' : ''\">\n <ng-container *ngIf=\"col.title === '\u64CD\u4F5C';else notOperateTemplate\">\n <div class=\"common-btn-group\">\n <ng-container *ngFor=\"let btn of col.btnList\">\n <ng-container *ngIf=\"!needShowConfirm(btn, data);else showConfirmTemplate\">\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\"\n (click)=\"triggerEvent(btn.click || null, data)\">{{ getBtnName(btn, data) }}</a>\n </ng-container>\n <ng-template #showConfirmTemplate>\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\" nz-popconfirm\n [nzPopconfirmTitle]=\"'\u786E\u8BA4\u8981' + getBtnName(btn, data) + '\u5417?'\"\n (nzOnConfirm)=\"triggerEvent(btn.click || null, data)\">{{\n getBtnName(btn, data) }}</a>\n </ng-template>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #notOperateTemplate>\n <ng-container *ngIf=\"hasInlineEdit(col); else displayCellTpl\">\n <div class=\"hd-table-cell-edit\">\n <ng-container [ngSwitch]=\"col.editType\">\n <input *ngSwitchCase=\"'input'\" nz-input class=\"hd-table-cell-edit-control\"\n [placeholder]=\"col.placeholder || ''\" [disabled]=\"isEditDisabled(col, data)\" [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onCellChange(col, data, $event)\" />\n <nz-input-number *ngSwitchCase=\"'inputNumber'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"col.placeholder || ''\" [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzMin]=\"getInputNumberProp(col, 'min', 0)\" [nzMax]=\"getInputNumberProp(col, 'max', 99999999)\"\n [nzStep]=\"getInputNumberProp(col, 'step', 1)\" [nzPrecision]=\"getInputNumberProp(col, 'precision', 4)\"\n [ngModel]=\"data[col.name]\" (ngModelChange)=\"onCellChange(col, data, $event)\">\n </nz-input-number>\n <nz-select *ngSwitchCase=\"'select'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"col.placeholder || '\u8BF7\u9009\u62E9'\" [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzAllowClear]=\"col.selectOption && col.selectOption.hdAllowClear !== false\"\n [nzShowSearch]=\"!col.selectOption || col.selectOption.hdShowSearch !== false\"\n [nzServerSearch]=\"!!(col.selectOption && col.selectOption.hdServerSearch)\" [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onSelectChange(col, data, $event)\"\n (nzOpenChange)=\"onSelectOpenChange(col, data, $event)\" (nzOnSearch)=\"onSelectSearch(col, data, $event)\">\n <nz-option *ngFor=\"let selectItem of getSelectList(col, data)\"\n [nzValue]=\"selectItem[col.selectOption.value]\" [nzLabel]=\"getSelectOptionLabel(col, selectItem)\">\n </nz-option>\n </nz-select>\n <nz-date-picker *ngSwitchCase=\"'date'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"col.placeholder || '\u8BF7\u9009\u62E9\u65E5\u671F'\" [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzDisabledDate]=\"getDisabledDate(col)\" [nzShowToday]=\"isDateShowToday(col)\"\n [nzShowTime]=\"isDateShowTime(col)\" [nzFormat]=\"getDateFormat(col, false)\" [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onCellChange(col, data, $event)\">\n </nz-date-picker>\n <nz-range-picker *ngSwitchCase=\"'dateRange'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"getRangePlaceholder(col)\" [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzDisabledDate]=\"getDisabledDate(col)\" [nzFormat]=\"getDateFormat(col, true)\" [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onCellChange(col, data, $event)\">\n </nz-range-picker>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #displayCellTpl>\n <div [class.hd-table-cell-with-actions]=\"col.btnList && col.btnList.length\">\n <div class=\"hd-table-cell-value\" [class.hd-table-cell-value--rowno]=\"hasRowNo(col)\"\n [class.hd-table-cell-value--edit]=\"isEditable(col, data)\">\n <ng-container *ngIf=\"col.name === 'state' || col.isState;else otherTemplate\">\n <hd-status [status]=\"data[getStateField(col)]\">\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <span *ngIf=\"cell.overflow && !(col.canWarp && showDetail)\" class=\"hd-table-cell-ellipsis\"\n nz-tooltip [nzTooltipTitle]=\"cell.title\">{{ cell.display }}</span>\n <span *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\">{{ cell.display }}</span>\n </ng-container>\n </hd-status>\n </ng-container>\n <ng-template #otherTemplate>\n <ng-container *ngIf=\"col.click && (!col.canClick || col.canClick(data));else noClickTemplate\">\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <a *ngIf=\"cell.overflow && !(col.canWarp && showDetail)\" class=\"hd-table-cell-ellipsis\" nz-tooltip\n [nzTooltipTitle]=\"cell.title\" [ngStyle]=\"{'color': getLinkCellColor(col, data, cell.isEmpty)}\"\n (click)=\"triggerEvent(col.click || null, data)\">{{ cell.display }}</a>\n <a *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\"\n [ngStyle]=\"{'color': getLinkCellColor(col, data, cell.isEmpty)}\"\n (click)=\"triggerEvent(col.click || null, data)\">{{ cell.display }}</a>\n </ng-container>\n </ng-container>\n <ng-template #noClickTemplate>\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <span *ngIf=\"cell.overflow && !(col.canWarp && showDetail)\" class=\"hd-table-cell-ellipsis\"\n nz-tooltip [nzTooltipTitle]=\"cell.title\" [ngStyle]=\"{'color': getPlainCellColor(col, data)}\">{{\n cell.display }}</span>\n <span *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\"\n [ngStyle]=\"{'color': getPlainCellColor(col, data)}\">{{ cell.display }}</span>\n </ng-container>\n </ng-template>\n </ng-template>\n <span class=\"hd-table-row-no\" *ngIf=\"hasRowNo(col) && getRowNoText(col, data, index)\">\n <i class=\"hd-table-row-no-bar\"></i>{{ getRowNoText(col, data, index) }}\n </span>\n <a *ngIf=\"isEditable(col, data)\" class=\"hd-table-edit-icon\" href=\"javascript:;\" title=\"\u7F16\u8F91\"\n (click)=\"onEditClick($event, col, data)\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M8.10797 1.42626C8.44968 1.08456 9.0037 1.08456 9.34541 1.42626L10.9746 3.05542C11.3163 3.39713 11.3163 3.95115 10.9746 4.29286L5.01002 10.2574C4.87077 10.3967 4.68863 10.4849 4.49305 10.5078L2.72936 10.7142C2.18281 10.7782 1.71357 10.3278 1.7551 9.77914L1.89441 7.93871C1.9102 7.73007 2.00024 7.53399 2.14819 7.38604L8.10797 1.42626ZM7.67304 3.51111L8.88972 4.72779L9.94337 3.67414L8.72669 2.45746L7.67304 3.51111ZM8.06477 5.55274L6.84808 4.33606L3.04959 8.13456L2.94515 9.51434L4.25672 9.36079L8.06477 5.55274ZM12.25 12.8333L1.75 12.8333V11.6666L12.25 11.6666V12.8333Z\"\n fill=\"currentColor\" />\n </svg>\n </a>\n </div>\n <div class=\"common-btn-group hd-table-cell-actions\" *ngIf=\"col.btnList && col.btnList.length\">\n <ng-container *ngFor=\"let btn of col.btnList\">\n <ng-container *ngIf=\"!needShowConfirm(btn, data);else cellActionConfirmTpl\">\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\"\n (click)=\"triggerEvent(btn.click || null, data)\">{{ getBtnName(btn, data) }}</a>\n </ng-container>\n <ng-template #cellActionConfirmTpl>\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\" nz-popconfirm\n [nzPopconfirmTitle]=\"'\u786E\u8BA4\u8981' + getBtnName(btn, data) + '\u5417?'\"\n (nzOnConfirm)=\"triggerEvent(btn.click || null, data)\">{{\n getBtnName(btn, data) }}</a>\n </ng-template>\n </ng-container>\n </div>\n </div>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n</ng-template>",
2966
+ template: "<ng-container>\n <hd-button-group>\n <ng-template #buttonGroupLeft>\n <ng-container *ngTemplateOutlet=\"tableLeftButton\"></ng-container>\n <hd-button *ngIf=\"showOperateColWarpButton\" type=\"default\" (click)=\"toggleShowDetail()\">{{showDetail ?\n '\u7F29\u7565\u663E\u793A': '\u5C55\u5F00\u663E\u793A'}}</hd-button>\n </ng-template>\n <ng-template #buttonGroupRight>\n <ng-container *ngTemplateOutlet=\"tableRightButton\"></ng-container>\n <ng-container *ngIf=\"showColSettings\">\n <span class=\"hd-table-col-settings\" nz-dropdown nzTrigger=\"click\" [nzDropdownMenu]=\"menu\"\n [nzVisible]=\"isDropdownVisible\" (click)=\"confirmDropdown()\" title=\"\u5217\u8BBE\u7F6E\">\n <svg class=\"hd-table-col-settings-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M4.92031 1.80756C5.02551 1.42884 5.37033 1.16675 5.76339 1.16675H8.23667C8.62973 1.16675 8.97455 1.42884 9.07975 1.80756L9.37802 2.88133L10.4571 2.60273C10.8377 2.50448 11.2371 2.67206 11.4336 3.01245L12.6703 5.15438C12.8668 5.49478 12.8122 5.92445 12.5369 6.20491L11.7561 7.00008L12.5369 7.79525C12.8122 8.07572 12.8668 8.50539 12.6703 8.84579L11.4336 10.9877C11.2371 11.3281 10.8377 11.4957 10.4571 11.3974L9.37802 11.1188L9.07975 12.1926C8.97455 12.5713 8.62973 12.8334 8.23667 12.8334H5.76339C5.37033 12.8334 5.02551 12.5713 4.92031 12.1926L4.62206 11.1189L3.54315 11.3974C3.16258 11.4957 2.76318 11.3281 2.56666 10.9877L1.33001 8.84579C1.13349 8.50539 1.18806 8.07572 1.46343 7.79525L2.24419 7.00008L1.46344 6.20491C1.18806 5.92445 1.13349 5.49478 1.33002 5.15438L2.56666 3.01245C2.76319 2.67206 3.16258 2.50448 3.54316 2.60273L4.62206 2.88127L4.92031 1.80756ZM4.54541 10.843L4.54552 10.8433L4.54541 10.843ZM5.98508 2.33341L5.66952 3.46945C5.54185 3.92906 5.06958 4.20173 4.60771 4.08249L3.46618 3.78778L2.45122 5.54572L3.2773 6.38705C3.6115 6.72742 3.6115 7.27275 3.2773 7.61312L2.45122 8.45444L3.46617 10.2124L4.60771 9.91768C5.06958 9.79844 5.54185 10.0711 5.66952 10.5307L5.98508 11.6667H8.01498L8.33056 10.5307C8.45823 10.071 8.9305 9.79838 9.39237 9.91762L10.5341 10.2124L11.5491 8.45444L10.723 7.61312C10.3888 7.27275 10.3888 6.72742 10.723 6.38705L11.5491 5.54572L10.5341 3.78778L9.39237 4.08254C8.9305 4.20178 8.45823 3.92912 8.33056 3.46951L8.01498 2.33341H5.98508ZM7.00003 5.83342C6.3557 5.83342 5.83337 6.35575 5.83337 7.00008C5.83337 7.64441 6.3557 8.16675 7.00003 8.16675C7.64436 8.16675 8.1667 7.64441 8.1667 7.00008C8.1667 6.35575 7.64436 5.83342 7.00003 5.83342ZM4.6667 7.00008C4.6667 5.71142 5.71137 4.66675 7.00003 4.66675C8.2887 4.66675 9.33337 5.71142 9.33337 7.00008C9.33337 8.28875 8.2887 9.33342 7.00003 9.33342C5.71137 9.33342 4.6667 8.28875 4.6667 7.00008Z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <nz-dropdown-menu #menu=\"nzDropdownMenu\">\n <div class=\"hd-table-col-settings-dropdown\">\n <div class=\"hd-table-col-settings-list\">\n <div *ngIf=\"showListNodes && nowListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"nowListNodes\" nzCheckable nzDraggable nzBlockNode\n nzShowExpand=\"false\" (nzCheckBoxChange)=\"checkAction($event)\" [nzBeforeDrop]=\"beforeDrop\"\n [nzTreeTemplate]=\"nzTreeTemplate\">\n </nz-tree>\n <ng-template #nzTreeTemplate let-node>\n <span\n class=\"ng-tns-c31-110 draggable ng-star-inserted ant-tree-node-content-wrapper ant-tree-node-content-wrapper-close\"\n [title]=\"node.key\" draggable=\"true\" aria-grabbed=\"true\">\n <span class=\"ant-tree-title\">\n <div class=\"hd-table-tree-node\">\n <span>{{node.key}}</span>\n <div *ngIf=\"!node.origin.disabled\" class=\"hd-table-tree-node-img\">\n <i nz-icon nzType=\"caret-up\" nzTheme=\"outline\"></i>\n <i nz-icon nzType=\"caret-down\" nzTheme=\"outline\"></i>\n </div>\n </div>\n </span>\n </span>\n </ng-template>\n </div>\n <div *ngIf=\"showListNodes && hideListNodes.length > 0\" nz-menu style=\"padding: 5px 10px;\">\n <nz-tree *ngIf=\"showListNodes\" [nzData]=\"hideListNodes\" nzCheckable nzShowExpand=\"false\"\n (nzCheckBoxChange)=\"checkAction($event)\">\n </nz-tree>\n </div>\n </div>\n <div class=\"hd-table-col-settings-footer\">\n <hd-button style=\"margin-right: 4px;\" type=\"default\" size=\"small\" (clickAction)=\"cancelDropdown()\">\u53D6\u6D88\n </hd-button>\n <hd-button type=\"primary\" size=\"small\" (clickAction)=\"submitGrids()\">\u5B8C\u6210</hd-button>\n </div>\n </div>\n </nz-dropdown-menu>\n </ng-container>\n </ng-template>\n </hd-button-group>\n <hd-space type=\"row\" size=\"12\"></hd-space>\n <ng-container *ngTemplateOutlet=\"tableTotal\"></ng-container>\n <hd-space *ngIf=\"tableTotal\" type=\"row\" size=\"12\"></hd-space>\n <nz-table *ngIf=\"showTable\" #hdTable class=\"hd-table-container\" [class.hd-table--virtual]=\"useVirtualScroll\"\n [class.hd-table--scroll-y]=\"!!(scroll && scroll.y)\" [class.hd-table--scroll-x]=\"!!(scroll && scroll.x)\"\n [class.hd-table--fluid-x]=\"fluidHorizontal\" [class.hd-table--has-select]=\"showSelected\"\n [class.hd-table--has-total]=\"showTableTotal\" [nzScroll]=\"scroll\" [nzShowPagination]=\"pagination\"\n [nzShowSizeChanger]=\"pagination\" [nzShowQuickJumper]=\"pagination\" [nzFrontPagination]=\"useFrontPagination\"\n nzSize=\"middle\" [nzData]=\"tableData.content\" [nzTotal]=\"getTableTotalCount()\" [(nzPageIndex)]=\"tablePageIndex\"\n [nzLoading]=\"tableLoading\" [nzPageSizeOptions]=\"[ 10, 50, 100, 200, 500, 1000 ]\" [(nzPageSize)]=\"tablePageSize\"\n (nzPageSizeChange)=\"pagination ? search(true) : null\" (nzPageIndexChange)=\"pagination ? search(false) : null\"\n (nzCurrentPageDataChange)=\"showSelected ? currentPageDataChange($event) : null\" [nzShowTotal]=\"tableTotalTemplate\"\n [nzFooter]=\"showTableTotal ? tableTotalFooter : null\" [nzVirtualScroll]=\"useVirtualScroll\"\n [nzVirtualItemSize]=\"useVirtualScroll ? effectiveVirtualItemSize : 0\" [nzVirtualForTrackBy]=\"virtualTrackByRow\">\n <thead (nzSortChange)=\"sort($event)\" nzSingleSort>\n <tr>\n <th nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showSelected && selectType !== 'radio'\" nzShowCheckbox\n [(nzChecked)]=\"isAllDisplayDataChecked\" [nzIndeterminate]=\"isIndeterminate\"\n (nzCheckedChange)=\"checkAll($event)\"></th>\n <th nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showSelected && selectType === 'radio'\"></th>\n <th class=\"hd-table-line-no-col\" [nzWidth]=\"lineNumberColWidthPx\" [nzLeft]=\"lineNumberLeft\"\n *ngIf=\"showTableTotal\">\u5E8F\u53F7</th>\n <ng-container *ngFor=\"let col of tableCols\">\n <th *ngIf=\"col.isShow\" [nzWidth]=\"getColDisplayWidth(col) + 'px'\" [nzAlign]=\"col.align\"\n [nzLeft]=\"getLeftSticky(col)\" [nzRight]=\"getRightSticky(col)\" nz-resizable nzBounds=\"window\" nzPreview\n (nzResizeEnd)=\"onResize($event, col)\" [nzShowSort]=\"col.canSort\" [nzSortKey]=\"col.name\"\n [nzSort]=\"getColSort(col)\">\n <span class=\"hd-table-col-title\">\n <span class=\"hd-table-col-require\" *ngIf=\"col.require && col.editType\">*</span>\n <ng-container *ngIf=\"getTitleParts(col) as titleParts; else plainTitle\">\n <span class=\"hd-table-title-with-bar\">{{ titleParts[0] }}<i class=\"hd-table-row-no-bar\"></i>{{\n titleParts[1] }}</span>\n </ng-container>\n <ng-template #plainTitle>{{ col.title }}</ng-template>\n </span>\n <nz-resize-handle nzDirection=\"right\">\n <div class=\"resize-trigger\"></div>\n </nz-resize-handle>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody>\n <ng-template *ngIf=\"useVirtualScroll\" nz-virtual-scroll let-data let-index=\"index\">\n <tr class=\"hd-table-virtual-row\" [class.hd-table-row-invalid]=\"isInvalidRow(data)\">\n <ng-container *ngTemplateOutlet=\"tableCells; context: { $implicit: data, index: index }\"></ng-container>\n </tr>\n </ng-template>\n <ng-container *ngIf=\"!useVirtualScroll\">\n <tr *ngFor=\"let data of hdTable.data; trackBy: trackByRow; index as i\"\n [class.hd-table-row-invalid]=\"isInvalidRow(data)\">\n <ng-container *ngTemplateOutlet=\"tableCells; context: { $implicit: data, index: i }\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n <ng-template #tableTotalTemplate>\n \u5171 {{ getTableTotalCount() }} \u6761\u6570\u636E\n </ng-template>\n <ng-template #tableTotalFooter>\n <!--\n \u5217\u603B\u5BBD < \u5BB9\u5668\uFF1Ascroll.x=\u5BB9\u5668\u5BBD\uFF0C\u5DEE\u989D\u6309\u58F0\u660E\u5BBD\u6BD4\u4F8B\u5206\u5230\u5404\u4E1A\u52A1\u5217\uFF08\u52FE\u9009\u4FDD\u6301 40\uFF09\uFF1B\u53EF\u62D6\u62FD\u3002\n \u5217\u603B\u5BBD > \u5BB9\u5668\uFF1Ascroll.x=\u58F0\u660E\u603B\u5BBD\uFF0C\u6A2A\u6EDA\u540C\u6B65\u3002\n -->\n <div class=\"hd-table-total-footer\" [class.hd-table-total-footer--fluid]=\"isTotalFooterFluid\"\n [class.hd-table-total-footer--y-gutter]=\"totalFooterNeedYGutter\">\n <table class=\"hd-table-total-footer-table\" [style.width]=\"totalFooterTableWidth\">\n <colgroup>\n <!-- \u52FE\u9009/\u5E8F\u53F7\u9501\u5BBD\uFF0C\u4E0D\u53C2\u4E0E\u5747\u644A -->\n <col *ngIf=\"showSelected\" style=\"width: 40px; min-width: 40px; max-width: 40px;\" />\n <col *ngIf=\"showTableTotal\" [style.width.px]=\"lineNumberColWidth\" [style.min-width.px]=\"lineNumberColWidth\"\n [style.max-width.px]=\"lineNumberColWidth\" />\n <ng-container *ngFor=\"let col of tableCols; trackBy: trackByCol\">\n <col *ngIf=\"col.isShow\" [style.width.px]=\"getColDisplayWidth(col)\" />\n </ng-container>\n </colgroup>\n <tr class=\"hd-table-total\">\n <td *ngIf=\"showSelected\" class=\"hd-table-total-footer-cell hd-table-total-footer-select\"\n [class.hd-table-total-footer-sticky-left]=\"!isTotalFooterFluid\" style=\"left: 0;\">&nbsp;</td>\n <td class=\"hd-table-total-footer-cell hd-table-total-footer-line-no\"\n [class.hd-table-total-footer-sticky-left]=\"!isTotalFooterFluid\"\n [style.left]=\"!isTotalFooterFluid ? lineNumberLeft : null\">\u5408\u8BA1</td>\n <ng-container *ngFor=\"let col of tableCols; let colIndex = index; trackBy: trackByCol\">\n <td *ngIf=\"col.isShow\" class=\"hd-table-total-footer-cell\"\n [class.hd-table-total-footer-sticky-left]=\"!isTotalFooterFluid && col.fixed === 'left'\"\n [class.hd-table-total-footer-sticky-right]=\"!isTotalFooterFluid && col.fixed === 'right'\"\n [class.hd-table-total-align-left]=\"getTableTotalCellAlign(col, colIndex) === 'left'\"\n [class.hd-table-total-align-center]=\"getTableTotalCellAlign(col, colIndex) === 'center'\"\n [class.hd-table-total-align-right]=\"getTableTotalCellAlign(col, colIndex) === 'right'\"\n [style.left]=\"!isTotalFooterFluid && col.fixed === 'left' ? (col.fixedWidth || 0) + 'px' : null\"\n [style.right]=\"!isTotalFooterFluid && col.fixed === 'right' ? (col.fixedRightWidth || 0) + 'px' : null\"\n [ngStyle]=\"{'text-align': getTableTotalCellAlign(col, colIndex)}\">\n {{ getTableTotalCellValue(col, colIndex) }}\n </td>\n </ng-container>\n </tr>\n </table>\n </div>\n </ng-template>\n </nz-table>\n</ng-container>\n\n<ng-template #tableCells let-data let-index=\"index\">\n <td nzWidth=\"40px\" nzLeft=\"0px\" *ngIf=\"showSelected && selectType !== 'radio'\" nzShowCheckbox\n [nzChecked]=\"mapOfCheckedId[data[selectField]]\" [nzDisabled]=\"isSelectDisabled(data)\"\n (nzCheckedChange)=\"refreshStatus($event, data)\"></td>\n <td nzWidth=\"40px\" nzLeft=\"0px\" class=\"hd-table-select-radio\" *ngIf=\"showSelected && selectType === 'radio'\">\n <label nz-radio [nzDisabled]=\"isSelectDisabled(data)\" [ngModel]=\"!!mapOfCheckedId[data[selectField]]\"\n (ngModelChange)=\"onRadioSelect($event, data)\"></label>\n </td>\n <td class=\"hd-table-line-no-col\" [nzWidth]=\"lineNumberColWidthPx\" [nzLeft]=\"lineNumberLeft\" *ngIf=\"showTableTotal\">{{\n getLineNumber(index) }}</td>\n <ng-container *ngFor=\"let col of tableCols; trackBy: trackByCol\">\n <td *ngIf=\"col.isShow\" [style.max-width.px]=\"getColDisplayWidth(col)\" [nzAlign]=\"col.align\"\n [nzLeft]=\"getLeftSticky(col)\" [nzRight]=\"getRightSticky(col)\"\n [ngClass]=\"(col.canWarp && showDetail) ? 'common-td-wrap' : ''\">\n <ng-container *ngIf=\"col.title === '\u64CD\u4F5C';else notOperateTemplate\">\n <div class=\"common-btn-group\">\n <ng-container *ngFor=\"let btn of col.btnList\">\n <ng-container *ngIf=\"!needShowConfirm(btn, data);else showConfirmTemplate\">\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\"\n (click)=\"triggerEvent(btn.click || null, data)\">{{ getBtnName(btn, data) }}</a>\n </ng-container>\n <ng-template #showConfirmTemplate>\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\" nz-popconfirm\n [nzPopconfirmTitle]=\"'\u786E\u8BA4\u8981' + getBtnName(btn, data) + '\u5417?'\"\n (nzOnConfirm)=\"triggerEvent(btn.click || null, data)\">{{\n getBtnName(btn, data) }}</a>\n </ng-template>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #notOperateTemplate>\n <ng-container *ngIf=\"hasInlineEdit(col); else displayCellTpl\">\n <div class=\"hd-table-cell-edit\">\n <ng-container [ngSwitch]=\"col.editType\">\n <input *ngSwitchCase=\"'input'\" nz-input class=\"hd-table-cell-edit-control\"\n [placeholder]=\"col.placeholder || ''\" [disabled]=\"isEditDisabled(col, data)\" [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onCellChange(col, data, $event)\" />\n <nz-input-number *ngSwitchCase=\"'inputNumber'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"col.placeholder || ''\" [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzMin]=\"getInputNumberProp(col, 'min', 0)\" [nzMax]=\"getInputNumberProp(col, 'max', 99999999)\"\n [nzStep]=\"getInputNumberProp(col, 'step', 1)\" [nzPrecision]=\"getInputNumberProp(col, 'precision', 4)\"\n [ngModel]=\"data[col.name]\" (ngModelChange)=\"onCellChange(col, data, $event)\">\n </nz-input-number>\n <nz-select *ngSwitchCase=\"'select'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"col.placeholder || '\u8BF7\u9009\u62E9'\" [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzAllowClear]=\"col.selectOption && col.selectOption.hdAllowClear !== false\"\n [nzShowSearch]=\"!col.selectOption || col.selectOption.hdShowSearch !== false\"\n [nzServerSearch]=\"!!(col.selectOption && col.selectOption.hdServerSearch)\" [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onSelectChange(col, data, $event)\"\n (nzOpenChange)=\"onSelectOpenChange(col, data, $event)\" (nzOnSearch)=\"onSelectSearch(col, data, $event)\">\n <nz-option *ngFor=\"let selectItem of getSelectList(col, data)\"\n [nzValue]=\"selectItem[col.selectOption.value]\" [nzLabel]=\"getSelectOptionLabel(col, selectItem)\">\n </nz-option>\n </nz-select>\n <nz-date-picker *ngSwitchCase=\"'date'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"col.placeholder || '\u8BF7\u9009\u62E9\u65E5\u671F'\" [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzDisabledDate]=\"getDisabledDate(col)\" [nzShowToday]=\"isDateShowToday(col)\"\n [nzShowTime]=\"isDateShowTime(col)\" [nzFormat]=\"getDateFormat(col, false)\" [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onCellChange(col, data, $event)\">\n </nz-date-picker>\n <nz-range-picker *ngSwitchCase=\"'dateRange'\" class=\"hd-table-cell-edit-control\"\n [nzPlaceHolder]=\"getRangePlaceholder(col)\" [nzDisabled]=\"isEditDisabled(col, data)\"\n [nzDisabledDate]=\"getDisabledDate(col)\" [nzFormat]=\"getDateFormat(col, true)\" [ngModel]=\"data[col.name]\"\n (ngModelChange)=\"onCellChange(col, data, $event)\">\n </nz-range-picker>\n </ng-container>\n </div>\n </ng-container>\n <ng-template #displayCellTpl>\n <div [class.hd-table-cell-with-actions]=\"col.btnList && col.btnList.length\">\n <div class=\"hd-table-cell-value\" [class.hd-table-cell-value--rowno]=\"hasRowNo(col)\"\n [class.hd-table-cell-value--edit]=\"isEditable(col, data)\">\n <ng-container *ngIf=\"col.name === 'state' || col.isState;else otherTemplate\">\n <hd-status [status]=\"data[getStateField(col)]\">\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <span *ngIf=\"cell.overflow && !(col.canWarp && showDetail)\" class=\"hd-table-cell-ellipsis\"\n nz-tooltip [nzTooltipTitle]=\"cell.title\">{{ cell.display }}</span>\n <span *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\">{{ cell.display }}</span>\n </ng-container>\n </hd-status>\n </ng-container>\n <ng-template #otherTemplate>\n <ng-container *ngIf=\"col.click && (!col.canClick || col.canClick(data));else noClickTemplate\">\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <a *ngIf=\"cell.overflow && !(col.canWarp && showDetail)\" class=\"hd-table-cell-ellipsis\" nz-tooltip\n [nzTooltipTitle]=\"cell.title\" [ngStyle]=\"{'color': getLinkCellColor(col, data, cell.isEmpty)}\"\n (click)=\"triggerEvent(col.click || null, data)\">{{ cell.display }}</a>\n <a *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\"\n [ngStyle]=\"{'color': getLinkCellColor(col, data, cell.isEmpty)}\"\n (click)=\"triggerEvent(col.click || null, data)\">{{ cell.display }}</a>\n </ng-container>\n </ng-container>\n <ng-template #noClickTemplate>\n <ng-container *ngIf=\"(data | hdTableCell:col) as cell\">\n <span *ngIf=\"cell.overflow && !(col.canWarp && showDetail)\" class=\"hd-table-cell-ellipsis\"\n nz-tooltip [nzTooltipTitle]=\"cell.title\" [ngStyle]=\"{'color': getPlainCellColor(col, data)}\">{{\n cell.display }}</span>\n <span *ngIf=\"!cell.overflow || (col.canWarp && showDetail)\"\n [ngStyle]=\"{'color': getPlainCellColor(col, data)}\">{{ cell.display }}</span>\n </ng-container>\n </ng-template>\n </ng-template>\n <span class=\"hd-table-row-no\" *ngIf=\"hasRowNo(col) && getRowNoText(col, data, index)\">\n <i class=\"hd-table-row-no-bar\"></i>{{ getRowNoText(col, data, index) }}\n </span>\n <a *ngIf=\"isEditable(col, data)\" class=\"hd-table-edit-icon\" href=\"javascript:;\" title=\"\u7F16\u8F91\"\n (click)=\"onEditClick($event, col, data)\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M8.10797 1.42626C8.44968 1.08456 9.0037 1.08456 9.34541 1.42626L10.9746 3.05542C11.3163 3.39713 11.3163 3.95115 10.9746 4.29286L5.01002 10.2574C4.87077 10.3967 4.68863 10.4849 4.49305 10.5078L2.72936 10.7142C2.18281 10.7782 1.71357 10.3278 1.7551 9.77914L1.89441 7.93871C1.9102 7.73007 2.00024 7.53399 2.14819 7.38604L8.10797 1.42626ZM7.67304 3.51111L8.88972 4.72779L9.94337 3.67414L8.72669 2.45746L7.67304 3.51111ZM8.06477 5.55274L6.84808 4.33606L3.04959 8.13456L2.94515 9.51434L4.25672 9.36079L8.06477 5.55274ZM12.25 12.8333L1.75 12.8333V11.6666L12.25 11.6666V12.8333Z\"\n fill=\"currentColor\" />\n </svg>\n </a>\n </div>\n <div class=\"common-btn-group hd-table-cell-actions\" *ngIf=\"col.btnList && col.btnList.length\">\n <ng-container *ngFor=\"let btn of col.btnList\">\n <ng-container *ngIf=\"!needShowConfirm(btn, data);else cellActionConfirmTpl\">\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\"\n (click)=\"triggerEvent(btn.click || null, data)\">{{ getBtnName(btn, data) }}</a>\n </ng-container>\n <ng-template #cellActionConfirmTpl>\n <a *ngIf=\"btn.permission ? btn.permission(data) : true\"\n [class]=\"isDangerBtn(btn, data) ? 'common-danger-btn': ''\" nz-popconfirm\n [nzPopconfirmTitle]=\"'\u786E\u8BA4\u8981' + getBtnName(btn, data) + '\u5417?'\"\n (nzOnConfirm)=\"triggerEvent(btn.click || null, data)\">{{\n getBtnName(btn, data) }}</a>\n </ng-template>\n </ng-container>\n </div>\n </div>\n </ng-template>\n </ng-template>\n </td>\n </ng-container>\n</ng-template>",
2859
2967
  changeDetection: ChangeDetectionStrategy.OnPush,
2860
2968
  styles: ["::ng-deep .common-btn-group>a{font-size:14px;font-weight:400;color:#20b95d!important;white-space:nowrap}::ng-deep .common-btn-group .common-danger-btn:hover{color:#f05b24!important}::ng-deep .common-btn-group>a:hover{color:#20bd62!important}::ng-deep .common-btn-group>a:not(:last-child)::after{content:'';margin:0 2px}::ng-deep .common-billNumber>a{color:#3b77e3}button{box-shadow:unset;text-shadow:unset;padding:0 6px!important}::ng-deep .ant-form-item-label>label{color:#4b504e;font-size:14px}::ng-deep .ant-input-number-input{height:32px}::ng-deep .ant-input-number{height:32px}textarea.ant-input{height:auto;min-height:32px}::ng-deep .ant-select-selection--multiple{min-height:32px}::ng-deep .ant-select-selection--multiple .ant-select-selection__rendered>ul>li.ant-select-search--inline:only-child{margin-left:4px}::ng-deep .ant-select-selection__rendered>ul>li{height:26px!important;margin-top:3px!important;line-height:26px!important}::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}::ng-deep .ant-select-selection--single{height:32px!important}::ng-deep .ant-input{height:32px}::ng-deep .ant-input[disabled]:hover{border-color:#d9d9d9!important}::ng-deep .ant-select-selection__rendered{line-height:32px!important}::ng-deep .ant-calendar-range-picker-input{text-align:left!important}::ng-deep .ant-calendar-picker{width:100%!important}::ng-deep .ant-row{margin-right:0!important;margin-left:0!important}::ng-deep .ant-col-6{padding-left:12px;padding-right:12px}::ng-deep .ant-col-12{padding-left:12px;padding-right:12px}::ng-deep .ant-col-18{padding-left:12px;padding-right:12px}::ng-deep .ant-col-24{padding-left:12px;padding-right:12px}::ng-deep .ant-alert-info{background-color:#f5f8f6;border:1px solid #cfe3d4}::ng-deep .hd-table-container .ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-th-right-sticky{z-index:2;transform:translateZ(0)}::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-right-sticky{background:#f5f8f6!important}::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-right-sticky{background:#fff}::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-right-sticky{background:#ecf8f1!important}::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-th-right-sticky{box-shadow:none!important}::ng-deep .hd-table-container .ant-table-fixed-right{right:0!important}:host ::ng-deep th{background:#f5f8f6!important;font-weight:700!important;white-space:nowrap;font-size:14px;font-family:PingFangSC-Medium,PingFang SC;color:#2a3634;padding:8px!important;box-sizing:border-box}:host ::ng-deep td{font-weight:400;font-style:normal;font-size:14px;color:#2a3634;text-align:left;white-space:nowrap;padding:8px!important;box-sizing:border-box}::ng-deep .ant-pagination-options{display:inline-flex;align-items:center}::ng-deep .ant-pagination-options .ant-select,::ng-deep .ant-pagination-options .ant-select-selection--single{min-width:100px}::ng-deep .ant-pagination-options-size-changer.ant-select{min-width:100px}::ng-deep .ant-time-picker{width:100%}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child{width:-webkit-max-content!important;width:-moz-max-content!important;width:max-content!important;min-width:var(--hd-cascader-menu-min-width,auto);max-width:560px}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child .ant-cascader-menu-item{white-space:nowrap}.ant-input-number-disabled,.ant-input[disabled],.ant-select-disabled{color:#4b504e}.nz-resizable-preview{position:absolute;top:0;left:0;z-index:8;border:1px dashed #d1d1d1}.nz-resizable-handle{position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:9}.nz-resizable-handle-top{width:100%;height:10px;top:-5px;left:0}.nz-resizable-handle-right{height:100%}.nz-resizable-handle-bottom{width:100%;height:10px;bottom:-5px;left:0}.nz-resizable-handle-left{width:10px;height:100%;top:0;left:-5px}.nz-resizable-handle-topRight{width:20px;height:20px;top:-5px;right:-5px;z-index:10}.nz-resizable-handle-bottomRight{width:20px;height:20px;right:-5px;bottom:-5px;z-index:10}.nz-resizable-handle-bottomLeft{width:20px;height:20px;bottom:-5px;left:-5px;z-index:10}.nz-resizable-handle-topLeft{width:20px;height:20px;top:-5px;left:-5px;z-index:10}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-bottom,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-top{cursor:row-resize}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-left,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-right{cursor:col-resize}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-bottomRight,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-topLeft{cursor:nwse-resize}.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-bottomLeft,.nz-resizable:not(.nz-resizable-resizing) .nz-resizable-handle-topRight{cursor:nesw-resize}.hd-table-col-settings{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:32px;height:32px;padding:0;margin-left:12px;cursor:pointer;color:#2a3634;background:0 0;border:1px solid #e5e6eb;border-radius:4px;vertical-align:middle;flex-shrink:0}.hd-table-col-settings:hover{color:#20b95d;background:#f5f8f6;border-color:#20b95d}.hd-table-col-settings .hd-table-col-settings-icon{display:block;width:14px;height:14px;flex-shrink:0}.hd-table-cell-with-actions{display:inline-flex;flex-wrap:wrap;align-items:center;-moz-column-gap:12px;column-gap:12px;row-gap:6px;max-width:100%}.hd-table-cell-with-actions .hd-table-cell-value{min-width:0}.hd-table-cell-with-actions .hd-table-cell-actions{flex-shrink:0}.hd-table-col-settings-dropdown{background:#fff;border:1px solid #e5e6eb;border-radius:4px;box-shadow:0 6px 16px rgba(0,0,0,.08),0 3px 6px rgba(0,0,0,.06);overflow:hidden}.hd-table-col-settings-list{max-height:400px;overflow-y:auto}.hd-table-col-settings-footer{text-align:right;background:#fff;padding:4px;border-top:1px solid #f0f0f0}.hd-table-container ::ng-deep .ant-pagination-options-quick-jumper input{border-radius:2px;border:1px solid #d9d9d9}.hd-table-container ::ng-deep .ant-pagination-options .ant-select-selection{border-radius:2px}.hd-table-container ::ng-deep .ant-table-thead>tr>th{border-bottom:1px solid #ecf1ed;white-space:nowrap;text-overflow:ellipsis}.hd-table-container ::ng-deep .ant-table-tbody>tr>td{border-bottom:1px solid #ecf1ed;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.hd-table-container ::ng-deep .ant-table-tbody>tr>td.hd-table-line-no-col,.hd-table-container ::ng-deep .ant-table-thead>tr>th.hd-table-line-no-col{width:72px!important;min-width:72px!important;max-width:72px!important;box-sizing:border-box}.hd-table-container ::ng-deep .ant-table-tbody>tr>td.ant-table-selection-column,.hd-table-container ::ng-deep .ant-table-thead>tr>th.ant-table-selection-column{width:40px!important;min-width:40px!important;max-width:40px!important;box-sizing:border-box;padding-left:8px!important;padding-right:8px!important}.hd-table-container .hd-table-cell-value--edit,.hd-table-container .hd-table-cell-value--rowno{display:inline-flex;align-items:center;min-width:0}.hd-table-container .hd-table-cell-value--edit>a:not(.hd-table-edit-icon),.hd-table-container .hd-table-cell-value--edit>hd-status,.hd-table-container .hd-table-cell-value--edit>span:not(.hd-table-row-no),.hd-table-container .hd-table-cell-value--rowno>a:not(.hd-table-edit-icon),.hd-table-container .hd-table-cell-value--rowno>hd-status,.hd-table-container .hd-table-cell-value--rowno>span:not(.hd-table-row-no){min-width:0}.hd-table-container .hd-table-row-no{display:inline-flex;flex-shrink:0;align-items:center;margin-left:4px;color:#1d1f29;font-size:14px;line-height:22px}.hd-table-container .hd-table-row-no-bar{display:inline-block;flex:0 0 auto;align-self:center;width:1px;height:14px;margin-right:4px;background:#1d1f29;vertical-align:middle}.hd-table-container .hd-table-edit-icon{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;margin-left:2px;width:14px;height:14px;color:#20b95d;line-height:1;cursor:pointer}.hd-table-container .hd-table-edit-icon:hover{color:#20bd62}.hd-table-container .hd-table-edit-icon svg{display:block;width:14px;height:14px}.hd-table-container .hd-table-col-title{display:inline-flex;align-items:center}.hd-table-container .hd-table-col-require{margin-right:4px;color:#f5222d;font-family:SimSun,sans-serif}.hd-table-container .hd-table-title-with-bar{display:inline-flex;align-items:center}.hd-table-container .hd-table-title-with-bar .hd-table-row-no-bar{width:1px;height:14px;margin:0 4px;align-self:center}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid.ant-table-row-hover>td,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid.ant-table-row-hover>td.ant-table-td-left-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid.ant-table-row-hover>td.ant-table-td-right-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid:hover>td,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid:hover>td.ant-table-td-left-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid:hover>td.ant-table-td-right-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid>td,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid>td.ant-table-td-left-sticky,.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid>td.ant-table-td-right-sticky{background:#f7f8fa!important;color:#868a9c!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-btn-group>a{color:#20b95d!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-btn-group>a:hover{color:#20bd62!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-btn-group .common-danger-btn:hover{color:#f05b24!important}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .hd-table-cell-value>a{color:#20b95d}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .common-billNumber>a{color:#3b77e3}.hd-table-container ::ng-deep .ant-table-tbody>tr.hd-table-row-invalid .hd-status-text{color:#868a9c!important}.hd-table-container ::ng-deep cdk-virtual-scroll-viewport.ant-table-body .hd-table-virtual-row>td{box-sizing:border-box}.hd-table-container.hd-table--scroll-x ::ng-deep .ant-table-body>table,.hd-table-container.hd-table--scroll-x ::ng-deep .ant-table-header>table,.hd-table-container.hd-table--scroll-x ::ng-deep .cdk-virtual-scroll-content-wrapper>table{table-layout:fixed}.hd-table-container:not(.hd-table--scroll-y):not(.hd-table--scroll-x) ::ng-deep .ant-table-body{max-height:none!important;overflow-y:visible!important}.hd-table-container.hd-table--scroll-x:not(.hd-table--scroll-y) ::ng-deep .ant-table-body{overflow-y:hidden!important}.hd-table-container.hd-table--fluid-x ::ng-deep .ant-table-body{overflow-x:hidden!important}.hd-table-container.hd-table--fluid-x.hd-table--scroll-y ::ng-deep .ant-table-header{margin-bottom:0!important;padding-bottom:0!important;overflow-x:hidden!important}.hd-table-container.hd-table--has-total ::ng-deep .ant-table-footer{padding:0;overflow:hidden;background:#fafafa;border-top:1px solid #e8e8e8}.hd-table-total-footer{width:100%;box-sizing:border-box;overflow-x:auto;overflow-y:hidden;background:#fafafa;scrollbar-width:thin;scrollbar-color:transparent transparent}.hd-table-total-footer::-webkit-scrollbar{width:12px;height:0}.hd-table-total-footer::-webkit-scrollbar-track{background:0 0}.hd-table-total-footer::-webkit-scrollbar-thumb{background:padding-box;border:4px solid transparent}.hd-table-total-footer::-webkit-scrollbar-corner{background:0 0}.hd-table-total-footer.hd-table-total-footer--y-gutter{overflow-y:scroll}.hd-table-total-footer.hd-table-total-footer--fluid{overflow-x:hidden}.hd-table-total-footer-table{table-layout:fixed;border-collapse:separate;border-spacing:0}.hd-table-total-footer-cell{padding:12px 8px;font-weight:500;background:#fafafa;box-sizing:border-box;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border-bottom:0}.hd-table-total-footer-cell.hd-table-total-align-left{text-align:left!important}.hd-table-total-footer-cell.hd-table-total-align-center{text-align:center!important}.hd-table-total-footer-cell.hd-table-total-align-right{text-align:right!important}.hd-table-select-radio{text-align:center}.hd-table-select-radio ::ng-deep .ant-radio-wrapper{margin-right:0}.hd-table-total-footer-select{width:40px;min-width:40px;max-width:40px;padding-left:8px;padding-right:8px;text-align:center}.hd-table-total-footer-line-no{width:72px;min-width:72px;max-width:72px}.hd-table-total-footer-sticky-left,.hd-table-total-footer-sticky-right{position:-webkit-sticky;position:sticky;z-index:2;background:#fafafa}::ng-deep .ant-dropdown-menu{border-radius:0}::ng-deep .ant-dropdown{margin-top:8px!important}.common-td-wrap{white-space:normal!important;word-break:break-all}.hd-table-cell-ellipsis{display:block;max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.nz-resizable-preview{border-width:0 1px 0 0}.resize-trigger{width:10px;height:15px;position:relative;top:calc((100% - 15px)/ 2)}.resize-trigger::after{position:absolute;top:calc((100% - 15px)/ 2);left:0;background:#d5d5d5;content:'';width:1px;height:15px;z-index:1}.nz-resizable-handle-right{position:absolute;width:10px;top:0;right:-5px;z-index:inherit}::ng-deep .ant-table-th-right-sticky .nz-resizable-handle-right{right:0}.hd-table-tree-node{display:inline-flex;align-items:center;padding-right:10px}.hd-table-tree-node .hd-table-tree-node-img{display:flex;flex-direction:column;position:absolute;right:0;margin-top:-2.5px}.hd-table-tree-node .hd-table-tree-node-img i{opacity:.3}.hd-table-tree-node .hd-table-tree-node-img i:last-child{margin-top:-5px}img{width:20px;height:20px}.ant-table-th-left-sticky{z-index:2}::ng-deep .ant-table-thead>tr>th .ant-table-header-column .ant-table-column-sorters>:not(.ant-table-column-sorter){position:unset}.hd-table-cell-edit{width:100%;min-width:0}.hd-table-cell-edit-control{width:100%!important}::ng-deep .hd-table-cell-edit .ant-calendar-picker,::ng-deep .hd-table-cell-edit .ant-input,::ng-deep .hd-table-cell-edit .ant-input-number,::ng-deep .hd-table-cell-edit .ant-select{width:100%}::ng-deep .hd-table-cell-edit .ant-input,::ng-deep .hd-table-cell-edit .ant-input-number,::ng-deep .hd-table-cell-edit .ant-select-selection{height:32px}::ng-deep .hd-table-cell-edit .ant-input-number-input{height:30px}::ng-deep .hd-table-cell-edit .ant-select-selection__rendered{line-height:30px}"]
2861
2969
  }] }
@@ -3091,28 +3199,26 @@ if (false) {
3091
3199
  */
3092
3200
  HdTableComponent.prototype.virtualScrollActive;
3093
3201
  /**
3094
- * 列宽合计(含勾选/序号 + fluid 补宽),footer 表宽与横向 scroll 共用
3202
+ * 实际渲染列宽合计(含勾选/序号 + 补宽),合计 footer 表宽用
3095
3203
  * @type {?}
3096
3204
  */
3097
3205
  HdTableComponent.prototype.tableColWidthTotal;
3098
3206
  /**
3099
- * fluid:声明列总宽 < 容器时,把差额补到最后一列业务列(不改缓存宽),
3100
- * 并设 scroll.x = 容器宽,避免表宽 100% 均摊撑开勾选列;拖拽改宽仍写 col.width。
3207
+ * 待按比例分给各业务列的总补宽;只影响展示,不写回 col.width(列宽缓存、拖拽仍用声明宽)
3101
3208
  * @type {?}
3102
3209
  */
3103
3210
  HdTableComponent.prototype.fluidExtraWidth;
3104
3211
  /**
3105
- * 列总宽未超出容器(fluid 补宽吃满):不需要真正横滚,
3106
- * 用于关掉 ng-zorro fixed-header 带来的常驻 X 轴滚动条。
3212
+ * 列少、靠补宽吃满容器:模板据此加 hd-table--fluid-x,隐藏 fixed-header 常驻的横滚槽
3107
3213
  * @type {?}
3108
3214
  */
3109
3215
  HdTableComponent.prototype.fluidHorizontal;
3110
3216
  /**
3111
- * fluid 补宽目标列缓存,避免模板每格 CD 时反复扫 tableCols
3217
+ * 各业务列分到的补宽(按列对象取,applyHorizontalLayout 时整表重建)
3112
3218
  * @type {?}
3113
3219
  * @private
3114
3220
  */
3115
- HdTableComponent.prototype.fluidExtraTargetCol;
3221
+ HdTableComponent.prototype.fluidExtraByCol;
3116
3222
  /**
3117
3223
  * 数据更新后待复位纵向滚动位置
3118
3224
  * @type {?}
@@ -3228,4 +3334,4 @@ if (false) {
3228
3334
  */
3229
3335
  HdTableComponent.prototype.commonSessionService;
3230
3336
  }
3231
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZmFudGFzeS1uZ3pvcnJvLyIsInNvdXJjZXMiOlsiaGQtdGFibGUvaGQtdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEtBQUssV0FBVyxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsWUFBWSxHQUdiLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RSxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLHFCQUFxQixHQUN0QixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFJTCxnQkFBZ0IsRUFDaEIsUUFBUSxHQUNULE1BQU0sb0JBQW9CLENBQUM7QUFPNUIsTUFBTSxPQUFPLGdCQUFnQjs7Ozs7O0lBa0szQixZQUNVLE1BQWtCLEVBQ2xCLEdBQXNCLEVBQ3RCLG9CQUEwQztRQUYxQyxXQUFNLEdBQU4sTUFBTSxDQUFZO1FBQ2xCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLHlCQUFv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O0lBR2pDLGtEQUErQjs7Ozs7O0lBRy9CLCtDQUF3Qzs7Ozs7SUFDeEMsaURBQWlEOzs7OztJQUNqRCw4Q0FBdUM7Ozs7OztJQUd2QyxtREFLSzs7Ozs7SUFDTCx3REFBK0Q7Ozs7O0lBQy9ELCtDQUtLOzs7OztJQUNMLG9EQUEyRDs7Ozs7O0lBRTNELG9EQUEyRDs7Ozs7O0lBOFEzRCw4Q0FBaUM7O0lBb0ZqQyxzQ0FHRTs7Ozs7SUFHRiw2Q0FBcUQ7O0lBRXJELHNDQUVFOztJQTJZRixzQ0FnQ0U7Ozs7O0lBcHhCQSxrQ0FBMEI7Ozs7O0lBQzFCLCtCQUE4Qjs7Ozs7SUFDOUIsZ0RBQWtEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0ICogYXMgbG9jYWxmb3JhZ2UgZnJvbSBcImxvY2FsZm9yYWdlXCI7XG5pbXBvcnQge1xuICBJbnB1dEJvb2xlYW4sXG4gIE56Rm9ybWF0QmVmb3JlRHJvcEV2ZW50LFxuICBOekZvcm1hdEVtaXRFdmVudCxcbn0gZnJvbSBcIm5nLXpvcnJvLWFudGQvY29yZVwiO1xuaW1wb3J0IHsgTnpSZXNpemVFdmVudCB9IGZyb20gXCJuZy16b3Jyby1hbnRkL3Jlc2l6YWJsZVwiO1xuaW1wb3J0IHsgTnpUYWJsZUNvbXBvbmVudCB9IGZyb20gXCJuZy16b3Jyby1hbnRkL3RhYmxlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGVsYXkgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IFRvdGFsT3B0aW9uIH0gZnJvbSBcIi4uL2hkLWRldGFpbC1saW5lcy9oZC1kZXRhaWwtbGluZXMuc2VydmljZVwiO1xuaW1wb3J0IHsgQ29sV2lkdGggfSBmcm9tIFwiLi4vbW9kZWwvY29sV2lkdGhcIjtcbmltcG9ydCB7IFBhZ2UgfSBmcm9tIFwiLi4vbW9kZWwvY29tbW9uLXR5cGVcIjtcbmltcG9ydCB7IENvbW1vblNlc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2UvY29tbW9uLXNlc3Npb24uc2VydmljZVwiO1xuaW1wb3J0IHtcbiAgZ2V0VGFibGVTY3JvbGxYVmlld3BvcnRXaWR0aCxcbiAgZ2V0VGFibGVWaWV3cG9ydFdpZHRoLFxufSBmcm9tIFwiLi4vdXRpbHMvaGQtdGFibGUtc2Nyb2xsLnV0aWxcIjtcbmltcG9ydCB7XG4gIEhkVGFibGVDZWxsQ2hhbmdlLFxuICBIZFRhYmxlQ29sdW1uLFxuICBPcGVyYXRlQnRuLFxuICBUYWJsZUNhY2hlT3B0aW9uLFxuICBUcmVlR3JpZCxcbn0gZnJvbSBcIi4vaGQtdGFibGUuc2VydmljZVwiO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImhkLXRhYmxlXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vaGQtdGFibGUuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2hkLXRhYmxlLmNvbXBvbmVudC5sZXNzXCJdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgSGRUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgdXVpZDogc3RyaW5nO1xuICBASW5wdXQoKSB0YWJsZUNvbHM6IEFycmF5PEhkVGFibGVDb2x1bW4+ID0gW107XG4gIEBJbnB1dCgpIHRhYmxlRGF0YTogUGFnZTxhbnk+O1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgc2hvd1NlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKlxuICAgKiDli77pgInliJflvaLmgIHjgIJjaGVja2JveO+8muWkmumAie+8iOm7mOiupO+8ie+8m3JhZGlv77ya5Y2V6YCJ77yM5peg6KGo5aS05YWo6YCJ77yMc2VsZWN0RXZlbnQg5LuN5Zue5Lyg5pWw57uE77yIMCDmiJYgMSDmnaHvvInjgIJcbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdFR5cGU6IFwiY2hlY2tib3hcIiB8IFwicmFkaW9cIiA9IFwiY2hlY2tib3hcIjtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dPcGVyYXRlQ29sV2FycEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiog5piv5ZCm5bGV56S65YiX6K6+572u77yI6b2/6L2u77yJ77yM6buY6K6k5byA5ZCv77yb5by556qX562J5Zy65pmv5Y+v5LygIGZhbHNlIOWFs+mXrSAqL1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgc2hvd0NvbFNldHRpbmdzOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHZpcnR1YWxTY3JvbGw6IGJvb2xlYW4gPSB0cnVlO1xuICAvKiog5omL5Yqo5oyH5a6a6KGM6auY77yb5LiN5Lyg5YiZ5Zyo6aaW5bGP5riy5p+T5ZCO6Ieq5Yqo5rWL6YePICovXG4gIEBJbnB1dCgpIHZpcnR1YWxJdGVtU2l6ZTogbnVtYmVyO1xuICBASW5wdXQoKSBzZWxlY3RGaWVsZDogc3RyaW5nID0gXCJiaWxsTnVtYmVyXCI7XG4gIC8qKlxuICAgKiDooYzli77pgInnpoHnlKjlrZfmrrXlkI3jgILlrprkuYnlkI7lj5blvZPliY3ooYzor6XlrZfmrrXvvJpcbiAgICog5Li6IHRydWUg5pe256aB55So6K+l6KGM5Yu+6YCJ77yI5YWo6YCJ5Lmf5Lya6Lez6L+H77yJ44CCXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3REaXNhYmxlZEZpZWxkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiDooYzlpLHmlYjlrZfmrrXlkI3jgILlrprkuYnlkI7lj5blvZPliY3ooYzor6XlrZfmrrXvvJpcbiAgICog5Li6IHRydWUg5pe25pW06KGM6IOM5pmv6Imy5Li6ICNGN0Y4RkHjgIJcbiAgICovXG4gIEBJbnB1dCgpIHJvd0ludmFsaWRGaWVsZDogc3RyaW5nO1xuICAvLyDlkIjorqHljLrln5/vvIjnsbvlnovkuI4gaGQtZGV0YWlsLWxpbmVzIOeahCBUb3RhbE9wdGlvbiDkuIDoh7TvvIlcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dUYWJsZVRvdGFsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRhYmxlVG90YWxPcHRpb246IEFycmF5PFRvdGFsT3B0aW9uPjtcbiAgLyoqXG4gICAqIOWQiOiuoeWIl+aAu+aVsO+8iOWQq+W6j+WPt+WIl++8jOS4jiBoZC1kZXRhaWwtbGluZXMg5LiA6Ie077yJ77ybXG4gICAqIOS4jeS8oOWImeaMieW9k+WJjeWPr+ingeaVsOaNruWIl+aVsCArIDHvvIjluo/lj7fvvInmjqjnrpfjgIJcbiAgICovXG4gIEBJbnB1dCgpIGNvbHVtbnNOdW1iZXI6IG51bWJlciB8IHN0cmluZztcbiAgQE91dHB1dCgpIHNvcnRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHNlbGVjdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgdGFibGVTZWFyY2hFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLyoqIOihjOWGhee8lui+keWPmOabtO+8iOW3suWGmeWbnuihjOWvueixoe+8m3ByZXZpb3VzKiDkvpvmjqXlj6PlpLHotKXlm57mu5rvvIkgKi9cbiAgQE91dHB1dCgpIGNlbGxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEhkVGFibGVDZWxsQ2hhbmdlPigpO1xuICBASW5wdXQoKSB0YWJsZUxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIOaYr+WQpuaYvuekuuWIhumhte+8m2ZhbHNlIOaXtuS4gOasoeWxleekuiB0YWJsZURhdGEuY29udGVudCDlhajpg6jooYwgKi9cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHBhZ2luYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuICAvKipcbiAgICog5piv5ZCm5YmN56uv5YiG6aG177yI5a+5IGNvbnRlbnQg5YWo6YeP5YiH54mH77yJ44CCXG4gICAqIHRydWXvvJrnv7vpobXkuI3op6blj5EgdGFibGVTZWFyY2hFdmVudO+8jOmAguWQiOivpuaDheWFqOmHj+aVsOaNru+8m1xuICAgKiBmYWxzZe+8iOm7mOiupO+8ie+8muacjeWKoeerr+WIhumhte+8jOe/u+mhteinpuWPkeafpeivou+8iOeOsOacieWIl+ihqOihjOS4uu+8ieOAglxuICAgKiDkuI4gcGFnaW5hdGlvbj1mYWxzZSDlkIzml7bnlKjml7bku6XkuI3liIbpobXkuLrlh4bjgIJcbiAgICovXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBmcm9udFBhZ2luYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8g6KGo5qC85YiG6aG15Y+C5pWwXG4gIEBJbnB1dCgpIHRhYmxlUGFnZUluZGV4OiBudW1iZXIgPSAxO1xuICBASW5wdXQoKSB0YWJsZVBhZ2VTaXplOiBudW1iZXIgPSAxMDA7XG4gIEBJbnB1dCgpIGlzRmlyc3RFbnRyeVNlYXJjaDogYm9vbGVhbjtcbiAgQElucHV0KCkgaXNDcm9zc1BhZ2VTZWxlY3Q6IGJvb2xlYW47XG4gIEBPdXRwdXQoKSB0YWJsZVBhZ2VJbmRleENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgdGFibGVQYWdlU2l6ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgdGFibGVQYWdlU2l6ZUNoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBDb250ZW50Q2hpbGQoXCJ0YWJsZVRvdGFsXCIsIHsgc3RhdGljOiBmYWxzZSB9KSB0YWJsZVRvdGFsOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKFwidGFibGVMZWZ0QnV0dG9uXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICB0YWJsZUxlZnRCdXR0b246IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoXCJ0YWJsZVJpZ2h0QnV0dG9uXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICB0YWJsZVJpZ2h0QnV0dG9uOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBzY3JvbGwgPSBudWxsO1xuXG4gIC8vIOihqOagvOWLvumAieWPguaVsFxuICBpc0FsbERpc3BsYXlEYXRhQ2hlY2tlZCA9IGZhbHNlO1xuICBpc0luZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgbGlzdE9mRGlzcGxheURhdGEgPSBbXTtcbiAgbGlzdE9mQWxsRGF0YSA9IFtdO1xuICBsaXN0T2ZTZWxlY3Rpb246IEFycmF5PGFueT4gfCBUZW1wbGF0ZVJlZjx2b2lkPjtcbiAgbWFwT2ZDaGVja2VkSWQ6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG4gIG1hcE9mQ2hlY2tMaXN0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gIC8vIOWQiOiuoeWPguaVsFxuICB0YWJsZVRvdGFsT3B0aW9uTGlzdCA9IFtdO1xuICAvLyDnvJPlrZjkv6Hmga9cbiAgdGFibGVDYWNoZU9wdGlvbjogVGFibGVDYWNoZU9wdGlvbiA9IG5ldyBUYWJsZUNhY2hlT3B0aW9uKCk7XG4gIHVzZXJTZXNzaW9uOiBhbnk7XG5cbiAgdGFibGVDb2xzQ2FjaGU6IEFycmF5PEhkVGFibGVDb2x1bW4+ID0gW107XG4gIHNob3dUYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBzZWxlY3RDb2xMaXN0Tm9kZXM6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICBzZWxlY3RDb2xMaXN0Tm9kZXNDYWNoZTogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIHNob3dMaXN0Tm9kZXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBpc0Ryb3Bkb3duVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyDorr7nva7liJfnmoTlj6/op4Hmk43kvZzmlbDnu4RcbiAgbm93TGlzdE5vZGVzOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgLy8g6K6+572u5YiX55qE5LiN5Y+v6KeB5pON5L2c5pWw57uEXG4gIGhpZGVMaXN0Tm9kZXM6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuXG4gIC8vIOeCueWHu+aXtumcgOimgeacieS4tOaXtuaVsOe7hOWtmOaUvuS4pOS4qnRyZWUs55So5LqO5Y+W5raI5pe25YCZ5oGi5aSN6LCD5pW05YmN55qE54q25oCBXG4gIGNhbmNlbE5vd0xpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIGNhbmNlbEhpZGVMaXN0Tm9kZXM6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICBzaG93RGV0YWlsOiBib29sZWFuID0gZmFsc2U7XG4gIGxvY2FsZm9yYWdlOiBhbnkgPSBudWxsO1xuICBsb2NhbHRpb25UbXA6IHN0cmluZyA9IFwiXCI7XG4gIGlzRmlyc3RFbnRyeVNlYXJjaExvY2FsOiBib29sZWFuID0gdHJ1ZTtcbiAgaXNDcm9zc1BhZ2VTZWxlY3RMb2NhbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiDoh6rliqjmtYvph4/liY3nmoTlhZzlupXooYzpq5jvvIzmtYvph4/lrozmiJDlkI7kvJrmm7TmlrAgKi9cbiAgbWVhc3VyZWRWaXJ0dWFsSXRlbVNpemUgPSA0NztcblxuICAvKiog6K6w5b2V5b2T5YmN5piv5ZCm5aSE5LqO6Jma5ouf5rua5Yqo5qih5byP77yM55So5LqO5YiH5o2iIHBhZ2VTaXplIOaXtumHjeW7uuihqOagvCAqL1xuICBwcml2YXRlIHZpcnR1YWxTY3JvbGxBY3RpdmU6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcblxuICAvKiog5YiX5a695ZCI6K6h77yI5ZCr5Yu+6YCJL+W6j+WPtyArIGZsdWlkIOihpeWuve+8ie+8jGZvb3RlciDooajlrr3kuI7mqKrlkJEgc2Nyb2xsIOWFseeUqCAqL1xuICB0YWJsZUNvbFdpZHRoVG90YWwgPSAwO1xuXG4gIC8qKlxuICAgKiBmbHVpZO+8muWjsOaYjuWIl+aAu+WuvSA8IOWuueWZqOaXtu+8jOaKiuW3rumineihpeWIsOacgOWQjuS4gOWIl+S4muWKoeWIl++8iOS4jeaUuee8k+WtmOWuve+8ie+8jFxuICAgKiDlubborr4gc2Nyb2xsLnggPSDlrrnlmajlrr3vvIzpgb/lhY3ooajlrr0gMTAwJSDlnYfmkYrmkpHlvIDli77pgInliJfvvJvmi5bmi73mlLnlrr3ku43lhpkgY29sLndpZHRo44CCXG4gICAqL1xuICBmbHVpZEV4dHJhV2lkdGggPSAwO1xuXG4gIC8qKlxuICAgKiDliJfmgLvlrr3mnKrotoXlh7rlrrnlmajvvIhmbHVpZCDooaXlrr3lkIPmu6HvvInvvJrkuI3pnIDopoHnnJ/mraPmqKrmu5rvvIxcbiAgICog55So5LqO5YWz5o6JIG5nLXpvcnJvIGZpeGVkLWhlYWRlciDluKbmnaXnmoTluLjpqbsgWCDovbTmu5rliqjmnaHjgIJcbiAgICovXG4gIGZsdWlkSG9yaXpvbnRhbCA9IGZhbHNlO1xuXG4gIC8qKiBmbHVpZCDooaXlrr3nm67moIfliJfnvJPlrZjvvIzpgb/lhY3mqKHmnb/mr4/moLwgQ0Qg5pe25Y+N5aSN5omrIHRhYmxlQ29scyAqL1xuICBwcml2YXRlIGZsdWlkRXh0cmFUYXJnZXRDb2w6IEhkVGFibGVDb2x1bW4gPSBudWxsO1xuXG4gIC8qKiDmlbDmja7mm7TmlrDlkI7lvoXlpI3kvY3nurXlkJHmu5rliqjkvY3nva4gKi9cbiAgcHJpdmF0ZSBwZW5kaW5nUmVzZXRTY3JvbGxUb3AgPSBmYWxzZTtcblxuICAvKiog5b2T5YmN5o6S5bqP77yM6KGo5qC86YeN5bu65ZCO55So5LqO5oGi5aSN6KGo5aS05o6S5bqP5oCBICovXG4gIHByaXZhdGUgY3VycmVudFNvcnRLZXk6IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgY3VycmVudFNvcnRWYWx1ZTogc3RyaW5nID0gbnVsbDtcblxuICBAVmlld0NoaWxkKFwiaGRUYWJsZVwiLCB7IHN0YXRpYzogZmFsc2UgfSkgbnpUYWJsZUNvbXBvbmVudDogTnpUYWJsZUNvbXBvbmVudDtcblxuICBwcml2YXRlIHRvdGFsRm9vdGVyU2Nyb2xsQm91bmRCb2R5OiBIVE1MRWxlbWVudCA9IG51bGw7XG4gIHByaXZhdGUgdG90YWxGb290ZXJTY3JvbGxIYW5kbGVyOiAoKSA9PiB2b2lkID0gbnVsbDtcbiAgcHJpdmF0ZSB0b3RhbEZvb3RlclN5bmNSZXRyeSA9IDA7XG5cbiAgLyoqIOihqOS9k+acieerlua7muadoeaXtuWQiOiuoSBmb290ZXIg5omN6aKE55WZ5Y+z5L6n5rua5Yqo5p2h5qe9ICovXG4gIHRvdGFsRm9vdGVyTmVlZFlHdXR0ZXIgPSBmYWxzZTtcblxuICAvKiog6KeG5Y+jL+WuueWZqOWwuuWvuOWPmOWMluaXtumHjeeulyBzY3JvbGwueCDkuI7lkIjorqHlr7npvZAgKi9cbiAgcHJpdmF0ZSB2aWV3cG9ydFJlc2l6ZVRpbWVyOiBhbnkgPSBudWxsO1xuICBwcml2YXRlIGJvdW5kT25WaWV3cG9ydFJlc2l6ZTogKCkgPT4gdm9pZCA9IG51bGw7XG4gIHByaXZhdGUgaG9zdFJlc2l6ZU9ic2VydmVyOiBhbnkgPSBudWxsO1xuXG4gIC8qKiBzZWxlY3Qg5bGV5byAIC8g5pCc57Si6Ziy5oqW77yI5a+56b2QIGZvcm0tbGluZXPvvIkgKi9cbiAgcHJpdmF0ZSBzZWxlY3RPcGVuQ2hhbmdlU3ViamVjdCA9IG5ldyBTdWJqZWN0PHtcbiAgICBmbjogKG9wZW46IGJvb2xlYW4sIGxpbmU6IGFueSkgPT4gYW55O1xuICAgIG9wZW46IGJvb2xlYW47XG4gICAgbGluZTogYW55O1xuICAgIGNvbDogSGRUYWJsZUNvbHVtbjtcbiAgfT4oKTtcbiAgcHJpdmF0ZSBzZWxlY3RPcGVuQ2hhbmdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc2VsZWN0U2VhcmNoU3ViamVjdCA9IG5ldyBTdWJqZWN0PHtcbiAgICBmbjogKGtleXdvcmQ6IHN0cmluZywgbGluZTogYW55KSA9PiBhbnk7XG4gICAga2V5d29yZDogc3RyaW5nO1xuICAgIGxpbmU6IGFueTtcbiAgICBjb2w6IEhkVGFibGVDb2x1bW47XG4gIH0+KCk7XG4gIHByaXZhdGUgc2VsZWN0U2VhcmNoU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG4gIC8qKiDlvILmraXlm57lhpkgb3B0aW9ucyDnmoTorqLpmIXvvIzpgb/lhY3ov57ngrnmkJzntKLms4TmvI8gKi9cbiAgcHJpdmF0ZSBzZWxlY3RMb2FkZXJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGhvc3RFbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBjb21tb25TZXNzaW9uU2VydmljZTogQ29tbW9uU2Vzc2lvblNlcnZpY2UsXG4gICkge1xuICAgIHRoaXMubG9jYWxmb3JhZ2UgPSBsb2NhbGZvcmFnZS5jcmVhdGVJbnN0YW5jZSh7XG4gICAgICBkcml2ZXI6IGxvY2FsZm9yYWdlLklOREVYRUREQixcbiAgICAgIG5hbWU6IFwiaGQtZnNjbVwiLCAvLyDorr7nva7lrZjlgqjlupPnmoTlkI3np7BcbiAgICAgIHZlcnNpb246IDEuMCwgLy8g6K6+572u5a2Y5YKo5bqT55qE54mI5pysXG4gICAgICBzdG9yZU5hbWU6IFwiaGQtZnNjbS1zdG9yZVwiLCAvLyDorr7nva7lrZjlgqjlupPnmoTlrZjlgqjnqbrpl7TlkI3np7BcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5iaW5kVG90YWxGb290ZXJTY3JvbGxTeW5jKCk7XG4gICAgdGhpcy51bmJpbmRWaWV3cG9ydFJlc2l6ZVN5bmMoKTtcbiAgICBpZiAodGhpcy5zZWxlY3RPcGVuQ2hhbmdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdE9wZW5DaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0U2VhcmNoU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdFNlYXJjaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RMb2FkZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc2VsZWN0TG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIOS+m+S4muWKoeWcqOiHquihjOWGmeWbniBvcHRpb25zIOWQjuinpuWPkSBPblB1c2gg5Yi35paw77yI5LyY5YWIIHJldHVybiBPYnNlcnZhYmxlL1Byb21pc2Ug55Sx57uE5Lu25aSE55CG77yJICovXG4gIG1hcmtGb3JDaGVjaygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRmlyc3RFbnRyeVNlYXJjaCA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuaXNGaXJzdEVudHJ5U2VhcmNoTG9jYWwgPSB0aGlzLmlzRmlyc3RFbnRyeVNlYXJjaDtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNDcm9zc1BhZ2VTZWxlY3QgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuaXNDcm9zc1BhZ2VTZWxlY3RMb2NhbCA9IHRoaXMuaXNDcm9zc1BhZ2VTZWxlY3Q7XG4gICAgfVxuICAgIHRoaXMubG9jYWx0aW9uVG1wID0gbG9jYXRpb24ucGF0aG5hbWU7XG4gICAgaWYgKHRoaXMubG9jYWx0aW9uVG1wKSB7XG4gICAgICB0aGlzLmxvY2FsdGlvblRtcCA9IHRoaXMubG9jYWx0aW9uVG1wLnJlcGxhY2UoL1xcLy9nLCBcIl9cIik7XG4gICAgfVxuICAgIHRoaXMudXNlclNlc3Npb24gPSB0aGlzLmNvbW1vblNlc3Npb25TZXJ2aWNlLmdldFNlc3Npb24oXG4gICAgICBcIl9fanlfYXV0aG9yaXphdGlvbl9zZXNzaW9uX19cIixcbiAgICApO1xuICAgIC8vIOeUqOS6juW8gOWPkeeOr+Wig+iwg+ivlVxuICAgIGlmICghdGhpcy51c2VyU2Vzc2lvbikge1xuICAgICAgdGhpcy51c2VyU2Vzc2lvbiA9IHtcbiAgICAgICAgdXNlckNvZGU6IFwiZGV2XCIsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuYmluZFZpZXdwb3J0UmVzaXplU3luYygpO1xuICAgIHRoaXMuZGVsZXRlSGlkZUl0ZW0oKTtcbiAgICBpZiAoIXRoaXMudGFibGVDb2xzIHx8IHRoaXMudGFibGVDb2xzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubG9jYWxmb3JhZ2VcbiAgICAgIC5yZWFkeSgpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuZ2V0SW5pdExvY2FsZm9yYWdlKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwibG9jYWxmb3JhZ2XliqDovb3lvILluLhzdGVwMVwiLCBlKTtcbiAgICAgICAgdGhyb3cgXCJsb2NhbGZvcmFnZeWKoOi9veW8guW4uFwiO1xuICAgICAgfSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2UpIHtcbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzW1wic2VsZWN0VHlwZVwiXSAmJlxuICAgICAgY2hhbmdlc1tcInNlbGVjdFR5cGVcIl1bXCJwcmV2aW91c1ZhbHVlXCJdICE9IG51bGwgJiZcbiAgICAgIGNoYW5nZXNbXCJzZWxlY3RUeXBlXCJdW1wiY3VycmVudFZhbHVlXCJdICE9PVxuICAgICAgICBjaGFuZ2VzW1wic2VsZWN0VHlwZVwiXVtcInByZXZpb3VzVmFsdWVcIl1cbiAgICApIHtcbiAgICAgIHRoaXMucmVzZXRTdGF0dXMoKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY2hhbmdlc1tcInRhYmxlRGF0YVwiXSB8fFxuICAgICAgY2hhbmdlc1tcInRhYmxlVG90YWxPcHRpb25cIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJzaG93VGFibGVUb3RhbFwiXSB8fFxuICAgICAgY2hhbmdlc1tcImNvbHVtbnNOdW1iZXJcIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZUNvbHNcIl1cbiAgICApIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlVGFibGVUb3RhbCgpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNoYW5nZXMgJiZcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl0gJiZcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJjdXJyZW50VmFsdWVcIl0gJiZcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJwcmV2aW91c1ZhbHVlXCJdXG4gICAgKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJjdXJyZW50VmFsdWVcIl1bXCJwYWdlU2l6ZVwiXSAhPT1cbiAgICAgICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wicHJldmlvdXNWYWx1ZVwiXVtcInBhZ2VTaXplXCJdIHx8XG4gICAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJjdXJyZW50VmFsdWVcIl1bXCJwYWdlTnVtYmVyXCJdICE9PVxuICAgICAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl1bXCJwcmV2aW91c1ZhbHVlXCJdW1wicGFnZU51bWJlclwiXVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ1Jlc2V0U2Nyb2xsVG9wID0gdHJ1ZTtcbiAgICAgICAgLy8gcGFnZVNpemUvcGFnZU51bWJlciDlj5jljJbkuZ/opoHph43nrpcgc2Nyb2xsIC8gZmx1aWTjgIJcbiAgICAgICAgLy8g5Lia5Yqh5bi45oqKIFBhZ2UucGFnZVNpemUg5YaZ5oiQIGNvbnRlbnQubGVuZ3Ro77yI5aaC5pS25qy+57yW6L6RIHRvUGFnZe+8ie+8jFxuICAgICAgICAvLyB2aXJ0dWFsU2Nyb2xsPWZhbHNlIOaXtuiLpei/memHjOi3s+i/h++8jOepuuihqOWIneWni+WMluWQjueahCBmbHVpZCDkuI3kvJrooaXkuIrvvIzli77pgInliJfooqvmkpHlvIDjgIJcbiAgICAgICAgLy8gYXBwbHlUYWJsZVNjcm9sbE1vZGUoZmFsc2UpIOWcqOaooeW8j+acquWPmOaXtuWPqiBkZWFsU2Nyb2xs77yM5LiN5Lya5by65Yi26YeN5bu65riF5o6S5bqP5oCB44CCXG4gICAgICAgIHRoaXMuYXBwbHlUYWJsZVNjcm9sbE1vZGUoZmFsc2UpO1xuICAgICAgICAvLyDnv7vpobUv5pS5IHBhZ2VTaXpl77ya5Li75Yqo5aSa5qyh5aSN5L2N77yM6KaG55uWIENESyDlvILmraXmuLLmn5Pml7bluo9cbiAgICAgICAgdGhpcy5zY2hlZHVsZVJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5pc0Nyb3NzUGFnZVNlbGVjdExvY2FsKSB7XG4gICAgICAgIHRoaXMucmVzZXRTdGF0dXMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1tcInRhYmxlRGF0YVwiXSkge1xuICAgICAgdGhpcy5wZW5kaW5nUmVzZXRTY3JvbGxUb3AgPSB0cnVlO1xuICAgICAgLy8g5LiN6K665piv5ZCm6Jma5ouf5rua5Yqo6YO96KaB6YeN566XIHNjcm9sbCAvIGZsdWlk44CCXG4gICAgICAvLyDmlLbmrL4v5LuY5qy+57yW6L6R562J6aG1IFt2aXJ0dWFsU2Nyb2xsXT1mYWxzZSArIOW8guatpeeBjOaVsOaNru+8muWOn+WFiOi3s+i/h+S8muWvvOiHtFxuICAgICAgLy8g56m66KGo5Yid5aeL5YyW5ZCO5LiN5YaN6KGl5a6977yM5Yu+6YCJ5YiX6KKr5Z2H5pGK5pKR5byA44CCXG4gICAgICB0aGlzLmFwcGx5VGFibGVTY3JvbGxNb2RlKGZhbHNlKTtcbiAgICAgIC8vIOaVsOaNruabtOaWsOWQjuWkjeS9jee6teWQkea7muWKqO+8iOWQq+iZmuaLn+a7muWKqOWcuuaZr++8iVxuICAgICAgdGhpcy5zY2hlZHVsZVJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY2hhbmdlc1tcInRhYmxlQ29sc1wiXSAmJlxuICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1tcInRhYmxlQ29sc1wiXS5jdXJyZW50VmFsdWUpICE9PVxuICAgICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2VzW1widGFibGVDb2xzXCJdLnByZXZpb3VzVmFsdWUpICYmXG4gICAgICBjaGFuZ2VzW1widGFibGVDb2xzXCJdLnByZXZpb3VzVmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhpcy5kZWxldGVIaWRlSXRlbSgpO1xuICAgICAgaWYgKCF0aGlzLnRhYmxlQ29scyB8fCB0aGlzLnRhYmxlQ29scy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2NhbGZvcmFnZVxuICAgICAgICAucmVhZHkoKVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5nZXRJbml0TG9jYWxmb3JhZ2UoKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJsb2NhbGZvcmFnZeWKoOi9veW8guW4uHN0ZXAyXCIsIGUpO1xuICAgICAgICAgIHRocm93IFwibG9jYWxmb3JhZ2XliqDovb3lvILluLhcIjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKGNoYW5nZXNbXCJwYWdpbmF0aW9uXCJdICYmICFjaGFuZ2VzW1wicGFnaW5hdGlvblwiXS5maXJzdENoYW5nZSkgfHxcbiAgICAgIChjaGFuZ2VzW1wiZnJvbnRQYWdpbmF0aW9uXCJdICYmICFjaGFuZ2VzW1wiZnJvbnRQYWdpbmF0aW9uXCJdLmZpcnN0Q2hhbmdlKVxuICAgICkge1xuICAgICAgLy8g5YiG6aG15qih5byP5YiH5o2i6ZyA6YeN5bu6IG56LXRhYmxl77yIZnJvbnQgLyBzZXJ2ZXIgLyBub25l77yJXG4gICAgICB0aGlzLnRhYmxlUGFnZUluZGV4ID0gMTtcbiAgICAgIHRoaXMuYXBwbHlUYWJsZVNjcm9sbE1vZGUodHJ1ZSk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICAvKiog5piv5ZCm6LWw5YmN56uv5YiG6aG177yI5a+5IGNvbnRlbnQg5YiH54mH77yM5LiN6K+35rGC5ZCO56uv77yJICovXG4gIGdldCB1c2VGcm9udFBhZ2luYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5wYWdpbmF0aW9uICYmICEhdGhpcy5mcm9udFBhZ2luYXRpb247XG4gIH1cblxuICBkZWxldGVIaWRlSXRlbSgpIHtcbiAgICAvLyDpppblhYjmioppc1Nob3fkuLpmYWxzZeaVsOaNruWJlOmZpOaOiVxuICAgIHRoaXMudGFibGVDb2xzID0gdGhpcy50YWJsZUNvbHMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAvLyDlpoLmnpzlr7nosaHmsqHmnIkgaXNTaG93IOWxnuaAp++8jOWImem7mOiupOS4uiB0cnVl77yM5L+d55WZ6K+l5a+56LGhXG4gICAgICBpZiAoIWl0ZW0uaGFzT3duUHJvcGVydHkoXCJpc1Nob3dcIikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICAvLyDlpoLmnpzlr7nosaHmnIkgaXNTaG93IOWxnuaAp++8jOWImeajgOafpeWFtuWAvOaYr+WQpuS4uiB0cnVlXG4gICAgICByZXR1cm4gaXRlbS5pc1Nob3cgPT09IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBzb3J0KHNvcnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfSkge1xuICAgIHRoaXMuY3VycmVudFNvcnRLZXkgPSBzb3J0ICYmIHNvcnQua2V5O1xuICAgIHRoaXMuY3VycmVudFNvcnRWYWx1ZSA9IHNvcnQgJiYgc29ydC52YWx1ZTtcbiAgICB0aGlzLnNvcnRFdmVudC5lbWl0KHNvcnQpO1xuICB9XG5cbiAgZ2V0Q29sU29ydChjb2w6IEhkVGFibGVDb2x1bW4pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIWNvbCB8fCAhY29sLmNhblNvcnQgfHwgIXRoaXMuY3VycmVudFNvcnRLZXkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY29sLm5hbWUgPT09IHRoaXMuY3VycmVudFNvcnRLZXkgPyB0aGlzLmN1cnJlbnRTb3J0VmFsdWUgOiBudWxsO1xuICB9XG5cbiAgdG9nZ2xlU2hvd0RldGFpbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dEZXRhaWwgPSAhdGhpcy5zaG93RGV0YWlsO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMucmVmcmVzaFZpcnR1YWxTY3JvbGxWaWV3cG9ydCh0cnVlKTtcbiAgfVxuXG4gIGdldCBlZmZlY3RpdmVWaXJ0dWFsSXRlbVNpemUoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy52aXJ0dWFsSXRlbVNpemUgIT0gbnVsbCAmJiB0aGlzLnZpcnR1YWxJdGVtU2l6ZSA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnZpcnR1YWxJdGVtU2l6ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWVhc3VyZWRWaXJ0dWFsSXRlbVNpemU7XG4gIH1cblxuICAvKipcbiAgICog57q15ZCR5Y+v55So6auY5bqm5omj5YeP77ya5oyJ6ZKu5Yy6L+WQiOiuoS/liIbpobXnrYnlm7rlrprljaDkvY3jgIJcbiAgICog5b+F6aG75LiOIGRlYWxTY3JvbGwgLyBwcmVzZXRTY3JvbGxCZWZvcmVSZW1vdW50IOS9v+eUqOWQjOS4gOWll++8jOWQpuWImeS8muivr+WIpOOAjOiDveaUvuS4i+OAjeiAjOS4jeiuviBzY3JvbGwueeOAglxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTY3JvbGxZTWF4T2Zmc2V0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuICh0aGlzLnRhYmxlVG90YWwgPyAxODAgOiAxNDApICsgMjE2O1xuICB9XG5cbiAgLyoqXG4gICAqIOW9k+WJjeinhuWPo+WunumZheWxleekuueahOihjOaVsOOAglxuICAgKiDliY3nq6/liIbpobXmjIkgcGFnZUluZGV4L3BhZ2VTaXplIOWIh+eJh+S8sOeul++8jOmBv+WFjeeUqOWFqOmHjyBsZW5ndGgg6K+v5Yik6ZyA6KaB57q15ZCR5rua5Yqo44CCXG4gICAqL1xuICBwcml2YXRlIGdldFZpc2libGVSb3dDb3VudCgpOiBudW1iZXIge1xuICAgIGNvbnN0IGNvbnRlbnQgPVxuICAgICAgdGhpcy50YWJsZURhdGEgJiYgdGhpcy50YWJsZURhdGEuY29udGVudCA/IHRoaXMudGFibGVEYXRhLmNvbnRlbnQgOiBbXTtcbiAgICBjb25zdCB0b3RhbCA9IGNvbnRlbnQubGVuZ3RoO1xuICAgIGlmICghdGhpcy51c2VGcm9udFBhZ2luYXRpb24pIHtcbiAgICAgIHJldHVybiB0b3RhbDtcbiAgICB9XG4gICAgaWYgKHRvdGFsIDw9IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBwYWdlU2l6ZSA9XG4gICAgICBOdW1iZXIodGhpcy50YWJsZVBhZ2VTaXplKSA+IDAgPyBOdW1iZXIodGhpcy50YWJsZVBhZ2VTaXplKSA6IDEwO1xuICAgIGNvbnN0IHBhZ2VJbmRleCA9XG4gICAgICBOdW1iZXIodGhpcy50YWJsZVBhZ2VJbmRleCkgPiAwID8gTnVtYmVyKHRoaXMudGFibGVQYWdlSW5kZXgpIDogMTtcbiAgICBjb25zdCBzdGFydCA9IChwYWdlSW5kZXggLSAxKSAqIHBhZ2VTaXplO1xuICAgIGlmIChzdGFydCA+PSB0b3RhbCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLm1pbihwYWdlU2l6ZSwgdG90YWwgLSBzdGFydCk7XG4gIH1cblxuICAvKiog5b2T5YmN6aG15YaF5a656auY5bqm5piv5ZCm6LaF5Ye66KeG5Y+j77yI6ZyA6KaB6KGo5YaF57q15ZCR5rua5Yqo77yJICovXG4gIGdldCBuZWVkc1ZlcnRpY2FsU2Nyb2xsKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJvd0NvdW50ID0gdGhpcy5nZXRWaXNpYmxlUm93Q291bnQoKTtcbiAgICBpZiAocm93Q291bnQgPD0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBtYXhPZmZzZXQgPSB0aGlzLmdldFNjcm9sbFlNYXhPZmZzZXQoKTtcbiAgICBjb25zdCBlc3RpbWF0ZWRIZWlnaHQgPSByb3dDb3VudCAqIHRoaXMuZWZmZWN0aXZlVmlydHVhbEl0ZW1TaXplO1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gZXN0aW1hdGVkSGVpZ2h0ID4gd2luZG93LmlubmVySGVpZ2h0IC0gbWF4T2Zmc2V0O1xuICAgIH1cbiAgICByZXR1cm4gcm93Q291bnQgPiAxMDA7XG4gIH1cblxuICAvKiog5b2T5YmN6aG15pWw5o2u6IO95a6M5pW05bGV56S65pe25LiN5ZCv55So6Jma5ouf5rua5Yqo77yM6YG/5YWN5bCR6YeP5pWw5o2u5Lmf5Ye6546w5rua5Yqo5p2hICovXG4gIGdldCB1c2VWaXJ0dWFsU2Nyb2xsKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy52aXJ0dWFsU2Nyb2xsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5lZWRzVmVydGljYWxTY3JvbGw7XG4gIH1cblxuICBnZXRSaWdodFN0aWNreShjb2w6IEhkVGFibGVDb2x1bW4pOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gY29sLmZpeGVkID09PSBcInJpZ2h0XCIgPyBgJHtjb2wuZml4ZWRSaWdodFdpZHRoIHx8IDB9cHhgIDogbnVsbDtcbiAgfVxuXG4gIGdldExlZnRTdGlja3koY29sOiBIZFRhYmxlQ29sdW1uKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIGNvbC5maXhlZCA9PT0gXCJsZWZ0XCIgPyBgJHtjb2wuZml4ZWRXaWR0aCB8fCAwfXB4YCA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICog5bqP5Y+35YiX5Zu65a6a5a6977yI5ZCrIHBhZGRpbmfvvIzlj6/lrrnnurMgNiDkvY3lpoIgMTk5OTk177yJ44CCXG4gICAqIOS4jemUgeatu+aXtuihqOS9k+S8mumaj+S9jeaVsOWPmOWuve+8iDHihpJ+NjRweO+8jDE5OTk5NeKGkn42N3B477yJ77yM5ZCI6K6h6KGM5a+55LiN6b2Q44CCXG4gICAqL1xuICByZWFkb25seSBsaW5lTnVtYmVyQ29sV2lkdGggPSA3MjtcblxuICAvKiog5byA5ZCv5ZCI6K6h5pe25bqP5Y+35YiX55qEIGxlZnTvvIjli77pgInliJfljaAgNDBweO+8iSAqL1xuICBnZXQgbGluZU51bWJlckxlZnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zaG93U2VsZWN0ZWQgPyBcIjQwcHhcIiA6IFwiMHB4XCI7XG4gIH1cblxuICBnZXQgbGluZU51bWJlckNvbFdpZHRoUHgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5saW5lTnVtYmVyQ29sV2lkdGggKyBcInB4XCI7XG4gIH1cblxuICAvKipcbiAgICog5pegIHNjcm9sbC54IOaXtuWQiOiuoei1sCBmbHVpZO+8iHdpZHRoOjEwMCXvvInjgIJcbiAgICog5YiX5bCR5pe25Lmf5Lya6K6+IHNjcm9sbC5477yI6KGl5a695ZCD5ruh77yJ77yM5ZCI6K6h6LWw5Zu65a6a6KGo5a6944CCXG4gICAqL1xuICBnZXQgaXNUb3RhbEZvb3RlckZsdWlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhKHRoaXMuc2Nyb2xsICYmIHRoaXMuc2Nyb2xsLngpO1xuICB9XG5cbiAgLyoqIOWxleekuueUqOWIl+Wuve+8mmZsdWlkIOaXtuacgOWQjuS4gOWIl+S4muWKoeWIlyA9IOWjsOaYjuWuvSArIGZsdWlkRXh0cmFXaWR0aCAqL1xuICBnZXRDb2xEaXNwbGF5V2lkdGgoY29sOiBIZFRhYmxlQ29sdW1uKTogbnVtYmVyIHtcbiAgICBjb25zdCBiYXNlID1cbiAgICAgIGNvbCAmJiBjb2wud2lkdGggIT0gbnVsbCAmJiBjb2wud2lkdGggPiAwXG4gICAgICAgID8gY29sLndpZHRoXG4gICAgICAgIDogQ29sV2lkdGguZml4Q29sV2lkdGg7XG4gICAgaWYgKFxuICAgICAgdGhpcy5mbHVpZEV4dHJhV2lkdGggPD0gMCB8fFxuICAgICAgIWNvbCB8fFxuICAgICAgIXRoaXMuZmx1aWRFeHRyYVRhcmdldENvbCB8fFxuICAgICAgY29sICE9PSB0aGlzLmZsdWlkRXh0cmFUYXJnZXRDb2xcbiAgICApIHtcbiAgICAgIHJldHVybiBiYXNlO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZSArIHRoaXMuZmx1aWRFeHRyYVdpZHRoO1xuICB9XG5cbiAgLyoqIOaMieW9k+WJjSBsYXlvdXQg5Yi35pawIGZsdWlkIOihpeWuveebruagh+WIl++8iOS7hSBkZWFsU2Nyb2xsIC8gc3luYyDml7bosIPnlKjvvIkgKi9cbiAgcHJpdmF0ZSByZWZyZXNoRmx1aWRFeHRyYVRhcmdldENvbCgpOiB2b2lkIHtcbiAgICB0aGlzLmZsdWlkRXh0cmFUYXJnZXRDb2wgPSBudWxsO1xuICAgIGlmIChcbiAgICAgIHRoaXMuZmx1aWRFeHRyYVdpZHRoIDw9IDAgfHxcbiAgICAgICF0aGlzLnRhYmxlQ29scyB8fFxuICAgICAgIXRoaXMudGFibGVDb2xzLmxlbmd0aFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gdGhpcy50YWJsZUNvbHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGMgPSB0aGlzLnRhYmxlQ29sc1tpXTtcbiAgICAgIGlmIChjICYmIGMuaXNTaG93ICYmIGMuZml4ZWQgIT09IFwicmlnaHRcIikge1xuICAgICAgICB0aGlzLmZsdWlkRXh0cmFUYXJnZXRDb2wgPSBjO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSB0aGlzLnRhYmxlQ29scy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgYyA9IHRoaXMudGFibGVDb2xzW2ldO1xuICAgICAgaWYgKGMgJiYgYy5pc1Nob3cpIHtcbiAgICAgICAgdGhpcy5mbHVpZEV4dHJhVGFyZ2V0Q29sID0gYztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBmbHVpZCDihpIgMTAwJe+8m+WbuuWumiDihpIgc2Nyb2xsLnjvvIjkuI7ooajkvZPlkIzkuIDlpZfmqKrlkJHlrr3luqbvvIkgKi9cbiAgZ2V0IHRvdGFsRm9vdGVyVGFibGVXaWR0aCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzVG90YWxGb290ZXJGbHVpZCkge1xuICAgICAgcmV0dXJuIFwiMTAwJVwiO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zY3JvbGwgJiYgdGhpcy5zY3JvbGwueFxuICAgICAgPyBTdHJpbmcodGhpcy5zY3JvbGwueClcbiAgICAgIDogdGhpcy50YWJsZUNvbFdpZHRoVG90YWwgPiAwXG4gICAgICAgID8gdGhpcy50YWJsZUNvbFdpZHRoVG90YWwgKyBcInB4XCJcbiAgICAgICAgOiBcIjEwMCVcIjtcbiAgfVxuXG4gIC8qKiDlvZPliY3pobXooYzlj7fvvIjot6jpobXov57nu63vvIzku44gMSDlvIDlp4vvvIkgKi9cbiAgZ2V0TGluZU51bWJlcihpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBwYWdlID1cbiAgICAgIE51bWJlcih0aGlzLnRhYmxlUGFnZUluZGV4KSA+IDAgPyBOdW1iZXIodGhpcy50YWJsZVBhZ2VJbmRleCkgOiAxO1xuICAgIGNvbnN0IHNpemUgPVxuICAgICAgTnVtYmVyKHRoaXMudGFibGVQYWdlU2l6ZSkgPiAwID8gTnVtYmVyKHRoaXMudGFibGVQYWdlU2l6ZSkgOiAwO1xuICAgIGNvbnN0IHJvd0luZGV4ID0gTnVtYmVyKGluZGV4KSA+PSAwID8gTnVtYmVyKGluZGV4KSA6IDA7XG4gICAgcmV0dXJuIChwYWdlIC0gMSkgKiBzaXplICsgcm93SW5kZXggKyAxO1xuICB9XG5cbiAgdHJhY2tCeVJvdyA9IChpbmRleDogbnVtYmVyLCBkYXRhOiBhbnkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGtleSA9IGRhdGEgJiYgZGF0YVt0aGlzLnNlbGVjdEZpZWxkXTtcbiAgICByZXR1cm4ga2V5ICE9IG51bGwgPyBTdHJpbmcoa2V5KSA6IGByb3ctJHtpbmRleH1gO1xuICB9O1xuXG4gIC8qKiDomZrmi5/mu5rliqjmjInmlbDnu4TkuIvmoIfov73ouKrvvIzpgb/lhY3kuJrliqHkuLvplK4gdHJhY2tCeSDlr7zoh7QgQ0RLIOihjOWkjeeUqOmUmeS9jSAqL1xuICB2aXJ0dWFsVHJhY2tCeVJvdyA9IChpbmRleDogbnVtYmVyKTogbnVtYmVyID0+IGluZGV4O1xuXG4gIHRyYWNrQnlDb2wgPSAoX2luZGV4OiBudW1iZXIsIGNvbDogSGRUYWJsZUNvbHVtbik6IHN0cmluZyA9PiB7XG4gICAgcmV0dXJuIGNvbC50aXRsZTtcbiAgfTtcblxuICBnZXRJbml0TG9jYWxmb3JhZ2UoKSB7XG4gICAgLy8g6aaW5YWI6I635Y+W5b2T5YmNaGQtdGFibGXlrZjlgqjnmoTmlbDmja4g5aaC5p6c5rKh5pyJ77yM5YiZ5Yid5aeL5YyW5LiL5b2T5YmN55qE5pWw5o2uXG4gICAgdGhpcy5sb2NhbGZvcmFnZVxuICAgICAgLmdldEl0ZW0oXG4gICAgICAgIFwiaGQtdGFibGVfXCIgK1xuICAgICAgICAgIHRoaXMudXNlclNlc3Npb24udXNlckNvZGUgK1xuICAgICAgICAgIFwiX1wiICtcbiAgICAgICAgICB0aGlzLmxvY2FsdGlvblRtcCArXG4gICAgICAgICAgXCJfXCIgK1xuICAgICAgICAgIHRoaXMudXVpZCxcbiAgICAgIClcbiAgICAgIC50aGVuKCh2YWx1ZTogVGFibGVDYWNoZU9wdGlvbikgPT4ge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24gPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLm5vcm1hbGl6ZVRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnBhZ2luYXRpb24gJiZcbiAgICAgICAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5wYWdlU2l6ZSAmJlxuICAgICAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLnBhZ2VTaXplID4gMTBcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMudGFibGVQYWdlU2l6ZSA9IHRoaXMudGFibGVDYWNoZU9wdGlvbi5wYWdlU2l6ZTtcbiAgICAgICAgICAgIHRoaXMudGFibGVQYWdlU2l6ZUNoYW5nZS5lbWl0KHRoaXMudGFibGVQYWdlU2l6ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbiA9IG5ldyBUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLnBhZ2VTaXplID0gdGhpcy50YWJsZVBhZ2VTaXplO1xuICAgICAgICB9XG4gICAgICAgIC8vIOacjeWKoeerr+WIhumhteaJjeWcqOWIneWni+WMluaXtuaKmyBwYWdlU2l6ZUNoYW5nZUV2ZW50IOinpuWPkeeItuafpeivou+8m+WJjeerr+WIhumhteS4jeaKm1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5wYWdpbmF0aW9uICYmXG4gICAgICAgICAgIXRoaXMuZnJvbnRQYWdpbmF0aW9uICYmXG4gICAgICAgICAgdGhpcy5pc0ZpcnN0RW50cnlTZWFyY2hMb2NhbFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnRhYmxlUGFnZVNpemVDaGFuZ2VFdmVudC5lbWl0KHRoaXMudGFibGVQYWdlU2l6ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5pc0ZpcnN0RW50cnlTZWFyY2hMb2NhbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbml0VGFibGUoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24gPSBuZXcgVGFibGVDYWNoZU9wdGlvbigpO1xuICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgPSB0aGlzLnRhYmxlUGFnZVNpemU7XG4gICAgICAgIHRoaXMuaW5pdFRhYmxlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGluaXRUYWJsZSgpIHtcbiAgICB0aGlzLnNob3dUYWJsZSA9IGZhbHNlO1xuICAgIGlmICghdGhpcy51dWlkKSB7XG4gICAgICB0aHJvdyBcImhkLXRhYmxl57y65aSxdXVpZOWPguaVsO+8jOivt+S9v+eUqOe8lui+keWZqOaPkuS7tueUn+aIkOW5tue7mWhkLXRhYmxl6LWL5LqIdXVpZOWxnuaAp1wiO1xuICAgIH1cbiAgICBpZiAodGhpcy5qdWRnZVJlcGVhdENvbHMoKSkge1xuICAgICAgdGhpcy5kZWFsQ29scygpO1xuICAgICAgdGhpcy5zZXRDb2xzKCk7XG4gICAgICB0aGlzLmRlYWxPcGVyYXRlQnRuKCk7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUgPSBudWxsO1xuICAgICAgdGhpcy5hcHBseVRhYmxlU2Nyb2xsTW9kZSh0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvKiog6Jma5oufL+aZrumAmuaooeW8j+WIh+aNouaXtumHjeW7uuihqOagvO+8jOmBv+WFjeaui+eVmea7muWKqOWuueWZqCAqL1xuICBhcHBseVRhYmxlU2Nyb2xsTW9kZShmb3JjZVJlbW91bnQgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IHVzZVZpcnR1YWwgPSB0aGlzLnVzZVZpcnR1YWxTY3JvbGw7XG4gICAgY29uc3QgbW9kZUNoYW5nZWQgPVxuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsQWN0aXZlICE9PSBudWxsICYmXG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUgIT09IHVzZVZpcnR1YWw7XG4gICAgdGhpcy52aXJ0dWFsU2Nyb2xsQWN0aXZlID0gdXNlVmlydHVhbDtcblxuICAgIGlmIChmb3JjZVJlbW91bnQgfHwgbW9kZUNoYW5nZWQpIHtcbiAgICAgIC8vIOW/hemhu+WFiOWGmeWlvSBzY3JvbGwuee+8jOWGjeWIm+W7uiBuei10YWJsZeOAglxuICAgICAgLy8gbmctem9ycm8g5Y+q5ZyoIEFmdGVyVmlld0luaXQg57uR5LiA5qyhIGhlYWRlci9ib2R5IOeahCBzY3JvbGwg5ZCM5q2l77ybXG4gICAgICAvLyDoi6XlhYjku6UgeT1udWxsIOWIm+W7uuWGjeaUueaIkOaciSB577yM6KGo5aS055uR5ZCs5Lya5Lii77yM6KGo546w5Li65YiX5aS05LiN6Lef552A5qiq5rua44CCXG4gICAgICB0aGlzLnByZXNldFNjcm9sbEJlZm9yZVJlbW91bnQodXNlVmlydHVhbCk7XG4gICAgICB0aGlzLnNob3dUYWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93VGFibGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5kZWFsU2Nyb2xsKCk7XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgdGhpcy5hZnRlclRhYmxlUmVuZGVyKHVzZVZpcnR1YWwpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZIYXNYID0gISEodGhpcy5zY3JvbGwgJiYgdGhpcy5zY3JvbGwueCk7XG4gICAgY29uc3QgcHJldkhhc1kgPSAhISh0aGlzLnNjcm9sbCAmJiB0aGlzLnNjcm9sbC55KTtcbiAgICB0aGlzLmRlYWxTY3JvbGwoKTtcbiAgICBjb25zdCBuZXh0SGFzWCA9ICEhKHRoaXMuc2Nyb2xsICYmIHRoaXMuc2Nyb2xsLngpO1xuICAgIGNvbnN0IG5leHRIYXNZID0gISEodGhpcy5zY3JvbGwgJiYgdGhpcy5zY3JvbGwueSk7XG4gICAgLy8g6L+Q6KGM5LitIHgveSDku47mnInlj5jml6Av5LuO5peg5Y+Y5pyJ5pe277yM5Lmf5b+F6aG76YeN5bu677yaXG4gICAgLy8gLSB577yabmctem9ycm8g5Y+q5ZyoIEFmdGVyVmlld0luaXQg57uR5LiA5qyhIGhlYWRlci9ib2R5IOWQjOatpVxuICAgIC8vIC0geO+8muepuuihqCBzY3JvbGwueD1udWxs77yIdGFibGUtbGF5b3V0OmF1dG/vvInihpIg5pyJ5pWw5o2u5ZCO6K6+IHNjcm9sbC5477yIZml4ZWTvvInvvIxcbiAgICAvLyAgIOS4jemHjeW7uuaXtuWLvumAieWIl+S7jeaMiSBhdXRvIOWdh+aRiuaSkeW8gO+8iOaUtuasvue8lui+keetieW8guatpeeBjOaVsOmhte+8iVxuICAgIGlmIChwcmV2SGFzWSAhPT0gbmV4dEhhc1kgfHwgcHJldkhhc1ggIT09IG5leHRIYXNYKSB7XG4gICAgICB0aGlzLnNob3dUYWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93VGFibGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5kZWFsU2Nyb2xsKCk7XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgdGhpcy5hZnRlclRhYmxlUmVuZGVyKHVzZVZpcnR1YWwpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuYWZ0ZXJUYWJsZVJlbmRlcih1c2VWaXJ0dWFsKTtcbiAgfVxuXG4gIC8qKiDph43lu7rliY3pooTorr4gc2Nyb2xs77yM5L+d6K+BIEFmdGVyVmlld0luaXQg5pe2IGhlYWRlci9ib2R5IOe7k+aehOW3suato+ehriAqL1xuICBwcml2YXRlIHByZXNldFNjcm9sbEJlZm9yZVJlbW91bnQodXNlVmlydHVhbDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IG1heE9mZnNldCA9IHRoaXMuZ2V0U2Nyb2xsWU1heE9mZnNldCgpO1xuICAgIGNvbnN0IHggPSB0aGlzLnNjcm9sbCA/IHRoaXMuc2Nyb2xsLnggOiBudWxsO1xuICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGwgJiYgIXVzZVZpcnR1YWwpIHtcbiAgICAgIHRoaXMuc2Nyb2xsID0geyB4LCB5OiBudWxsIH07XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2Nyb2xsID0ge1xuICAgICAgeCxcbiAgICAgIHk6IGBjYWxjKDEwMHZoIC0gJHttYXhPZmZzZXR9cHgpYCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhZnRlclRhYmxlUmVuZGVyKHVzZVZpcnR1YWw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodXNlVmlydHVhbCkge1xuICAgICAgdGhpcy5yZWZyZXNoVmlydHVhbFNjcm9sbFZpZXdwb3J0KHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsKSB7XG4gICAgICB0aGlzLm1lYXN1cmVWaXJ0dWFsSXRlbVNpemUodHJ1ZSk7XG4gICAgICAvLyDlrp7mtYvooYzpq5jlkI7lj6/og73ku47jgIzog73mlL7kuIvjgI3lj5jkuLrjgIzotoXlh7rjgI3vvIzpnIDliIfmjaLmu5rliqjmqKHlvI9cbiAgICAgIGlmICh0aGlzLnVzZVZpcnR1YWxTY3JvbGwpIHtcbiAgICAgICAgdGhpcy5hcHBseVRhYmxlU2Nyb2xsTW9kZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnN5bmNIb3Jpem9udGFsU2Nyb2xsKCk7XG4gICAgICB0aGlzLmZsdXNoUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlZnJlc2hWaXJ0dWFsU2Nyb2xsVmlld3BvcnQoZm9yY2VNZWFzdXJlID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudXNlVmlydHVhbFNjcm9sbCkge1xuICAgICAgaWYgKGZvcmNlTWVhc3VyZSkge1xuICAgICAgICB0aGlzLm1lYXN1cmVWaXJ0dWFsSXRlbVNpemUoZm9yY2VNZWFzdXJlKTtcbiAgICAgICAgdGhpcy5kZWFsU2Nyb2xsKCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgICAgdGhpcy5mbHVzaFJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3Qgdmlld3BvcnQgPVxuICAgICAgICB0aGlzLm56VGFibGVDb21wb25lbnQgJiYgdGhpcy5uelRhYmxlQ29tcG9uZW50LmNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcbiAgICAgIGlmICghdmlld3BvcnQpIHtcbiAgICAgICAgdGhpcy5zeW5jSG9yaXpvbnRhbFNjcm9sbCgpO1xuICAgICAgICB0aGlzLmZsdXNoUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVhc3VyZWQgPSB0aGlzLm1lYXN1cmVWaXJ0dWFsSXRlbVNpemUoZm9yY2VNZWFzdXJlKTtcbiAgICAgIGlmIChtZWFzdXJlZCkge1xuICAgICAgICB0aGlzLmRlYWxTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHZpZXdwb3J0LmNoZWNrVmlld3BvcnRTaXplKCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMubWVhc3VyZVZpcnR1YWxJdGVtU2l6ZShmb3JjZU1lYXN1cmUpO1xuICAgICAgICAgIHRoaXMuc3luY0hvcml6b250YWxTY3JvbGwoKTtcbiAgICAgICAgICB2aWV3cG9ydC5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgICAgICAgIHRoaXMuZmx1c2hSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZpZXdwb3J0LmNoZWNrVmlld3BvcnRTaXplKCk7XG4gICAgICAgIHRoaXMuc3luY0hvcml6b250YWxTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5mbHVzaFJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiog5pWw5o2u5Yi35paw5ZCO5bCG6KGo5L2T57q15ZCR5rua5Yqo5aSN5L2N5Yiw6aG26YOoICovXG4gIHByaXZhdGUgcmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm56VGFibGVDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbnpUYWJsZSA9IHRoaXMubnpUYWJsZUNvbXBvbmVudCBhcyBhbnk7XG4gICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLm56VGFibGVDb21wb25lbnQuY2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xuICAgIGlmICh2aWV3cG9ydCkge1xuICAgICAgaWYgKHR5cGVvZiAodmlld3BvcnQgYXMgYW55KS5zY3JvbGxUb09mZnNldCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICh2aWV3cG9ydCBhcyBhbnkpLnNjcm9sbFRvT2Zmc2V0KDApO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiAodmlld3BvcnQgYXMgYW55KS5zY3JvbGxUb0luZGV4ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgKHZpZXdwb3J0IGFzIGFueSkuc2Nyb2xsVG9JbmRleCgwKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZpZXdwb3J0RWwgPVxuICAgICAgICB2aWV3cG9ydC5lbGVtZW50UmVmICYmXG4gICAgICAgICh2aWV3cG9ydC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgaWYgKHZpZXdwb3J0RWwpIHtcbiAgICAgICAgdmlld3BvcnRFbC5zY3JvbGxUb3AgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBib2R5Q2FuZGlkYXRlcyA9IFtcbiAgICAgIG56VGFibGUubWl4VGFibGVCb2R5TmF0aXZlRWxlbWVudCxcbiAgICAgIG56VGFibGUudGFibGVCb2R5TmF0aXZlRWxlbWVudCxcbiAgICAgIG56VGFibGUudGFibGVCb2R5RWxlbWVudCAmJiBuelRhYmxlLnRhYmxlQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudCxcbiAgICBdO1xuICAgIGJvZHlDYW5kaWRhdGVzLmZvckVhY2goKGVsOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgaWYgKGVsKSB7XG4gICAgICAgIGVsLnNjcm9sbFRvcCA9IDA7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgdGFibGVNYWluID1cbiAgICAgIG56VGFibGUudGFibGVNYWluRWxlbWVudCAmJlxuICAgICAgKG56VGFibGUudGFibGVNYWluRWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KTtcbiAgICBpZiAoIXRhYmxlTWFpbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBub2RlcyA9IHRhYmxlTWFpbi5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCIuYW50LXRhYmxlLWJvZHksIGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydFwiLFxuICAgICk7XG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChub2RlcywgKGVsOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgZWwuc2Nyb2xsVG9wID0gMDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlbDmja7mm7TmlrDlkI7lpJrmrKHlsJ3or5XlpI3kvY3jgIJcbiAgICogbmctem9ycm8gOCArIENESyDomZrmi5/mu5rliqjkvJrlnKjmlbDmja7liLfmlrDlkI7lvILmraXmlLnlhpkgc2Nyb2xsVG9w77yM5Y2V5qyh5aSN5L2N57uP5bi46KKr6KaG55uW44CCXG4gICAqL1xuICBwcml2YXRlIHNjaGVkdWxlUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTogdm9pZCB7XG4gICAgLy8g5aSa5qyh5bCd6K+V77ya6KaG55uWIG56LXRhYmxlIC8gQ0RLIOiZmuaLn+a7muWKqOW8guatpeaUueWGmSBzY3JvbGxUb3BcbiAgICBjb25zdCBkZWxheXMgPSBbMCwgNTAsIDEwMF07XG4gICAgZGVsYXlzLmZvckVhY2goKG1zLCBpbmRleCkgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSBkZWxheXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHRoaXMucGVuZGluZ1Jlc2V0U2Nyb2xsVG9wID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0sIG1zKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmx1c2hSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGVuZGluZ1Jlc2V0U2Nyb2xsVG9wKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgfVxuXG4gIC8qKiDmnKrmiYvliqjkvKAgdmlydHVhbEl0ZW1TaXplIOaXtu+8jOS7juW3sua4suafk+ihjOa1i+mHj+ecn+WunumrmOW6piAqL1xuICBtZWFzdXJlVmlydHVhbEl0ZW1TaXplKGZvcmNlID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy52aXJ0dWFsSXRlbVNpemUgIT0gbnVsbCAmJiB0aGlzLnZpcnR1YWxJdGVtU2l6ZSA+IDAgJiYgIWZvcmNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHZpZXdwb3J0ID1cbiAgICAgIHRoaXMubnpUYWJsZUNvbXBvbmVudCAmJiB0aGlzLm56VGFibGVDb21wb25lbnQuY2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xuICAgIGNvbnN0IHRhYmxlQm9keSA9XG4gICAgICB0aGlzLm56VGFibGVDb21wb25lbnQgJiZcbiAgICAgICh0aGlzLm56VGFibGVDb21wb25lbnQudGFibGVCb2R5TmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgY29uc3Qgcm93ID1cbiAgICAgICh2aWV3cG9ydCAmJlxuICAgICAgICAoKHZpZXdwb3J0LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBcInRyLmhkLXRhYmxlLXZpcnR1YWwtcm93XCIsXG4gICAgICAgICkgYXMgSFRNTEVsZW1lbnQpKSB8fFxuICAgICAgKHRhYmxlQm9keSAmJiAodGFibGVCb2R5LnF1ZXJ5U2VsZWN0b3IoXCJ0Ym9keSB0clwiKSBhcyBIVE1MRWxlbWVudCkpO1xuICAgIGlmICghcm93IHx8IHJvdy5vZmZzZXRIZWlnaHQgPD0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBoZWlnaHQgPSByb3cub2Zmc2V0SGVpZ2h0O1xuICAgIGlmIChoZWlnaHQgPT09IHRoaXMubWVhc3VyZWRWaXJ0dWFsSXRlbVNpemUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5tZWFzdXJlZFZpcnR1YWxJdGVtU2l6ZSA9IGhlaWdodDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIOiuvue9ruWIl+eCueWHu+WPlua2iFxuICBjYW5jZWxEcm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmlzRHJvcGRvd25WaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5oaWRlTGlzdE5vZGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmNhbmNlbEhpZGVMaXN0Tm9kZXMpKTtcbiAgICB0aGlzLm5vd0xpc3ROb2RlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jYW5jZWxOb3dMaXN0Tm9kZXMpKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8vIOeCueWHu+inpuWPkeiuvue9ruWIl1xuICBjb25maXJtRHJvcGRvd24oKTogdm9pZCB7XG4gICAgLy8g5Li05pe25a2Y5pS+5LiL77yM5Y+W5raI55qE5pe25YCZ5oGi5aSN5Y6f5p2l55qE54q25oCBICAg5rex5ou36LSd5LiL5a+56LGh5pWw57uEXG4gICAgdGhpcy5jYW5jZWxIaWRlTGlzdE5vZGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmhpZGVMaXN0Tm9kZXMpKTtcbiAgICB0aGlzLmNhbmNlbE5vd0xpc3ROb2RlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5ub3dMaXN0Tm9kZXMpKTtcbiAgICB0aGlzLmlzRHJvcGRvd25WaXNpYmxlID0gdHJ1ZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHN1Ym1pdEdyaWRzKCkge1xuICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzID0gW107XG4gICAgdGhpcy5ub3dMaXN0Tm9kZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMucHVzaChpdGVtLnRpdGxlKTtcbiAgICB9KTtcbiAgICB0aGlzLnNhdmVUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgdGhpcy5pbml0VGFibGUoKTtcbiAgICB0aGlzLmlzRHJvcGRvd25WaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvLyDku47nvJPlrZjorr7nva7liJdcbiAgc2V0Q29scygpIHtcbiAgICB0aGlzLnNob3dMaXN0Tm9kZXMgPSBmYWxzZTtcbiAgICB0aGlzLm5vd0xpc3ROb2RlcyA9IFtdO1xuICAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IFtdO1xuICAgIGlmICh0aGlzLmhhc0NvbHNDYWNoZSgpKSB7XG4gICAgICBsZXQgeyBub3RJbmNvbHMsIGluY29scyB9ID0gdGhpcy50YWJsZUNvbHNDYWNoZS5yZWR1Y2UoXG4gICAgICAgIChhY2MsIGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAodGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMuaW5jbHVkZXMoaXRlbS50aXRsZSkpIHtcbiAgICAgICAgICAgIGFjYy5pbmNvbHMucHVzaChpdGVtKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjLm5vdEluY29scy5wdXNoKGl0ZW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LFxuICAgICAgICB7IG5vdEluY29sczogW10sIGluY29sczogW10gfSxcbiAgICAgICk7XG4gICAgICBpbmNvbHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmluZGV4T2YoYS50aXRsZSkgLVxuICAgICAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmluZGV4T2YoYi50aXRsZSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy50YWJsZUNvbHMgPSBpbmNvbHMuY29uY2F0KG5vdEluY29scyk7XG4gICAgfVxuXG4gICAgdGhpcy50YWJsZUNvbHMuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgIGlmICh0aGlzLmhhc0NvbHNDYWNoZSgpKSB7XG4gICAgICAgIGVsZW1lbnQuaXNTaG93ID0gdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMuaW5jbHVkZXMoZWxlbWVudC50aXRsZSlcbiAgICAgICAgICA/IHRydWVcbiAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICBpZiAoZWxlbWVudC5pc1Nob3cpIHtcbiAgICAgICAgICB0aGlzLm5vd0xpc3ROb2Rlcy5wdXNoKHtcbiAgICAgICAgICAgIHRpdGxlOiBlbGVtZW50LnRpdGxlLFxuICAgICAgICAgICAga2V5OiBlbGVtZW50LnRpdGxlLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IGVsZW1lbnQuZml4ZWQgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgICAgICAvLyBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNoZWNrZWQ6IHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmluY2x1ZGVzKGVsZW1lbnQudGl0bGUpXG4gICAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaGlkZUxpc3ROb2Rlcy5wdXNoKHtcbiAgICAgICAgICAgIHRpdGxlOiBlbGVtZW50LnRpdGxlLFxuICAgICAgICAgICAga2V5OiBlbGVtZW50LnRpdGxlLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IGVsZW1lbnQuZml4ZWQgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgICAgICAvLyBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNoZWNrZWQ6IHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmluY2x1ZGVzKGVsZW1lbnQudGl0bGUpXG4gICAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LmlzU2hvdyA9IHRydWU7XG4gICAgICAgIHRoaXMubm93TGlzdE5vZGVzLnB1c2goe1xuICAgICAgICAgIHRpdGxlOiBlbGVtZW50LnRpdGxlLFxuICAgICAgICAgIGtleTogZWxlbWVudC50aXRsZSxcbiAgICAgICAgICBjaGVja2VkOiB0cnVlLFxuICAgICAgICAgIC8vIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgICAgICAgIGRpc2FibGVkOiBlbGVtZW50LmZpeGVkID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIOiwg+aVtOWIl+WuveS4uue8k+WtmOWuveW6plxuICAgIGlmIChcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbiAmJlxuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocyAmJlxuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocy5zaXplICE9PSAwXG4gICAgKSB7XG4gICAgICB0aGlzLnRhYmxlQ29scy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgICAgaWYgKHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMuaGFzKGNvbC50aXRsZSkpIHtcbiAgICAgICAgICBjb2wud2lkdGggPSB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzLmdldChjb2wudGl0bGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmRlYWxDb2xzKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNob3dMaXN0Tm9kZXMgPSB0cnVlO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLy8g5ouW5ou95pON5L2cXG4gIGJlZm9yZURyb3AgPSAoYXJnOiBOekZvcm1hdEJlZm9yZURyb3BFdmVudCk6IE9ic2VydmFibGU8Ym9vbGVhbj4gPT4ge1xuICAgIGlmIChcbiAgICAgIGFyZy5ub2RlLm9yaWdpbi5kaXNhYmxlZCB8fFxuICAgICAgIWFyZy5kcmFnTm9kZS5vcmlnaW4uY2hlY2tlZCB8fFxuICAgICAgYXJnLnBvcyA9PT0gMFxuICAgICkge1xuICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG5vZGU6IFRyZWVHcmlkID0gbmV3IFRyZWVHcmlkKCk7XG4gICAgICBub2RlLmNoZWNrZWQgPSBhcmcuZHJhZ05vZGUub3JpZ2luLmNoZWNrZWQ7XG4gICAgICBub2RlLmRpc2FibGVkID0gYXJnLmRyYWdOb2RlLm9yaWdpbi5kaXNhYmxlZDtcbiAgICAgIG5vZGUuZXhwYW5kZWQgPSBhcmcuZHJhZ05vZGUub3JpZ2luLmV4cGFuZGVkO1xuICAgICAgbm9kZS5pc0xlYWYgPSBhcmcuZHJhZ05vZGUub3JpZ2luLmlzTGVhZjtcbiAgICAgIG5vZGUua2V5ID0gYXJnLmRyYWdOb2RlLm9yaWdpbi5rZXk7XG4gICAgICBub2RlLnNlbGVjdGFibGUgPSBhcmcuZHJhZ05vZGUub3JpZ2luLnNlbGVjdGFibGU7XG4gICAgICBub2RlLnRpdGxlID0gYXJnLmRyYWdOb2RlLm9yaWdpbi50aXRsZTtcbiAgICAgIC8vIOaLluaLveWFg+e0oOS4i+agh1xuICAgICAgbGV0IGRyYWdOb2RlSW5kZXggPSB0aGlzLm5vd0xpc3ROb2Rlcy5maW5kSW5kZXgoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udGl0bGUgPT0gYXJnLmRyYWdOb2RlLm9yaWdpbi50aXRsZTtcbiAgICAgIH0pO1xuICAgICAgLy8g55uu5qCH5L2N572u55qE5LiL5qCHXG4gICAgICBsZXQgbm9kZUluZGV4ID1cbiAgICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMuZmluZEluZGV4KChpdGVtKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGl0ZW0udGl0bGUgPT0gYXJnLm5vZGUub3JpZ2luLnRpdGxlO1xuICAgICAgICB9KSArIChhcmcucG9zID09PSAtMSA/IDAgOiBhcmcucG9zKTtcbiAgICAgIHRoaXMubm93TGlzdE5vZGVzLnNwbGljZShub2RlSW5kZXgsIDAsIG5vZGUpO1xuICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMuc3BsaWNlKFxuICAgICAgICBub2RlSW5kZXggPj0gZHJhZ05vZGVJbmRleCA/IGRyYWdOb2RlSW5kZXggOiBkcmFnTm9kZUluZGV4ICsgMSxcbiAgICAgICAgMSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gb2YodHJ1ZSkucGlwZShkZWxheSgxMDApKTtcbiAgICB9XG4gIH07XG5cbiAgbW92ZUVsZW1lbnROZWFyYnkoYXJyLCBlbGVtZW50VG9Nb3ZlVGl0bGUsIHRhcmdldEVsZW1lbnRUaXRsZSwgcG9zKSB7XG4gICAgY29uc3QgdG1wQXJyYXkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGFycikpO1xuICAgIGNvbnN0IHRhcmdldEluZGV4ID0gdG1wQXJyYXkuZmluZEluZGV4KFxuICAgICAgKGl0ZW0pID0+IGl0ZW0udGl0bGUgPT09IHRhcmdldEVsZW1lbnRUaXRsZSxcbiAgICApO1xuICAgIGNvbnN0IGVsZW1lbnRJbmRleCA9IHRtcEFycmF5LmZpbmRJbmRleChcbiAgICAgIChpdGVtKSA9PiBpdGVtLnRpdGxlID09PSBlbGVtZW50VG9Nb3ZlVGl0bGUsXG4gICAgKTtcbiAgICBjb25zdCBuZXdJbmRleCA9IHBvcyA8IDAgPyB0YXJnZXRJbmRleCArIHBvcyA6IHRhcmdldEluZGV4O1xuICAgIC8vIOenu+mZpOebruagh+WFg+e0oO+8jOW5tuaPkuWFpeWIsOaWsOeahOS9jee9rlxuICAgIGNvbnN0IHJlbW92ZWRFbGVtZW50ID0gdG1wQXJyYXkuc3BsaWNlKGVsZW1lbnRJbmRleCwgMSk7XG4gICAgdG1wQXJyYXkuc3BsaWNlKG5ld0luZGV4ICsgMSwgMCwgcmVtb3ZlZEVsZW1lbnRbMF0pO1xuICAgIHJldHVybiB0bXBBcnJheTtcbiAgfVxuXG4gIC8vIOWLvumAieaTjeS9nFxuICBjaGVja0FjdGlvbihldmVudDogTnpGb3JtYXRFbWl0RXZlbnQpOiB2b2lkIHtcbiAgICAvLyDli77pgInlj6rmnInlnKhoaWRlTGlzdE5vZGVzLOWPlua2iOWLvumAieWPquacieWcqG5vd0xpc3ROb2Rlc1xuICAgIGlmIChldmVudC5ub2RlLm9yaWdpbi5jaGVja2VkKSB7XG4gICAgICBsZXQgbm9kZTogVHJlZUdyaWQgPSBuZXcgVHJlZUdyaWQoKTtcbiAgICAgIG5vZGUgPSB0aGlzLmhpZGVMaXN0Tm9kZXMuZmluZCgoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS50aXRsZSA9PT0gZXZlbnQubm9kZS5vcmlnaW4udGl0bGU7XG4gICAgICB9KTtcbiAgICAgIG5vZGUuY2hlY2tlZCA9IHRydWU7XG4gICAgICAvLyDmib7liLDnrKzkuIDkuKpmaXhlZOWxnuaAp+S4unJpZ2h055qEdGl0bGXvvIzmib7liLDmj5LlhaXlhYPntKDnmoTkvY3nva5cbiAgICAgIGxldCB0aXRsZSA9IG51bGw7XG4gICAgICBmb3IgKGxldCBpID0gdGhpcy50YWJsZUNvbHNDYWNoZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBpZiAodGhpcy50YWJsZUNvbHNDYWNoZVtpXS5maXhlZCA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgdGl0bGUgPSB0aGlzLnRhYmxlQ29sc0NhY2hlW2ldLnRpdGxlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgdGVtcG9yYXJ5Tm9kZUxpc3QgPSB0aGlzLm5vd0xpc3ROb2Rlcy5zbGljZSgwKTtcbiAgICAgIGlmICghdGl0bGUpIHtcbiAgICAgICAgdGVtcG9yYXJ5Tm9kZUxpc3QucHVzaChub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5ub3dMaXN0Tm9kZXMuZmluZEluZGV4KFxuICAgICAgICAgIChub2RlKSA9PiBub2RlLnRpdGxlID09PSB0aXRsZSxcbiAgICAgICAgKTtcbiAgICAgICAgdGVtcG9yYXJ5Tm9kZUxpc3Quc3BsaWNlKGluZGV4LCAwLCBub2RlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubm93TGlzdE5vZGVzID0gdGVtcG9yYXJ5Tm9kZUxpc3Q7XG4gICAgICB0aGlzLmhpZGVMaXN0Tm9kZXMgPSB0aGlzLmhpZGVMaXN0Tm9kZXMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLnRpdGxlICE9PSBldmVudC5ub2RlLm9yaWdpbi50aXRsZTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiAodGhpcy5oaWRlTGlzdE5vZGVzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLnRhYmxlQ2FjaGVPcHRpb24gJiYgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMpIHtcbiAgICAgIC8vICAgdGhpcy5oaWRlTGlzdE5vZGVzID0gdGhpcy5nZXRIaWRlTGlzdE5vZGVzKCk7XG4gICAgICAvLyB9XG4gICAgICBsZXQgdGVtcG9yYXJ5Tm9kZUxpc3QgPSB0aGlzLmhpZGVMaXN0Tm9kZXMuc2xpY2UoMCk7XG4gICAgICB0aGlzLm5vd0xpc3ROb2Rlcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLnRpdGxlID09PSBldmVudC5ub2RlLm9yaWdpbi50aXRsZSkge1xuICAgICAgICAgIGNvbnN0IGlubmVySXRlbSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaXRlbSkpO1xuICAgICAgICAgIGlubmVySXRlbS5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgdGVtcG9yYXJ5Tm9kZUxpc3QucHVzaChpbm5lckl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IHRlbXBvcmFyeU5vZGVMaXN0O1xuXG4gICAgICAvLyDkuLrkuobpmLLmraLmnKrpgInmi6nnmoTmlbDnu4Tpobrluo/lm6DkuLpwdXNo5pa55rOV6ICM5pS55Y+Y77yM6YCa6L+H5Yid5aeL5pWw5o2u6I635Y+W5pi+56S655qE5a2X5q615YiX6KGoXG4gICAgICB0aGlzLm5vd0xpc3ROb2RlcyA9IHRoaXMubm93TGlzdE5vZGVzLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS50aXRsZSAhPT0gZXZlbnQubm9kZS5vcmlnaW4udGl0bGU7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvLyDpmLLmraLmnKrpgInmi6nnmoTmlbDnu4Tpobrluo/lm6DkuLpwdXNo5pa55rOV6ICM5pS55Y+Y77yM5LuO5Yid5aeL5pWw5o2u6I635Y+W6ZqQ6JeP5pyq5pi+56S655qE5a2X5q615YiX6KGoXG4gIGdldEhpZGVMaXN0Tm9kZXMoKTogQXJyYXk8VHJlZUdyaWQ+IHtcbiAgICBsZXQgdGVtcG9yYXJ5Tm9kZUxpc3Q6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICAgIC8vIOS7jnRhYmxlQ29sc0NhY2hl6YeM6Z2i5om+5rKh5pyJ5Zyoc3RvcmFnZemHjOmdouWHuueOsOeahOWtl+autSznu4TmiJBoaWRlTGlzdFxuICAgIHRoaXMudGFibGVDb2xzQ2FjaGUuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5pbmNsdWRlcyhpdGVtLnRpdGxlKSkge1xuICAgICAgICBsZXQgbm9kZUl0ZW06IFRyZWVHcmlkID0gbmV3IFRyZWVHcmlkKCk7XG4gICAgICAgIG5vZGVJdGVtLnRpdGxlID0gaXRlbS50aXRsZTtcbiAgICAgICAgbm9kZUl0ZW0ua2V5ID0gaXRlbS50aXRsZTtcbiAgICAgICAgbm9kZUl0ZW0uZGlzYWJsZWQgPSBpdGVtLmZpeGVkID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICBub2RlSXRlbS5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgIHRlbXBvcmFyeU5vZGVMaXN0LnB1c2gobm9kZUl0ZW0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0ZW1wb3JhcnlOb2RlTGlzdDtcbiAgfVxuXG4gIGRlYWxDb2xzKCkge1xuICAgIGlmICghdGhpcy50YWJsZUNvbHNbMF0ubWluV2lkdGgpIHtcbiAgICAgIHRoaXMudGFibGVDb2xzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICBzcGFuLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgICAgICBzcGFuLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICBzcGFuLnN0eWxlLndoaXRlU3BhY2UgPSBcIm5vd3JhcFwiO1xuICAgICAgICBzcGFuLnN0eWxlLmZvbnRTaXplID0gXCIxNHB4XCI7XG4gICAgICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7IC8vIOWwhuagt+W8j+S/ruaUueS4uiBpbmxpbmUtYmxvY2tcbiAgICAgICAgc3Bhbi5pbm5lclRleHQgPSBpdGVtLnRpdGxlO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNwYW4pO1xuICAgICAgICBpdGVtLm1pbldpZHRoID0gc3Bhbi5vZmZzZXRXaWR0aCArIDE2O1xuICAgICAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzcGFuKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyDlpITnkIblt6blj7PlkLjpmYTnmoTmlbDmja7lnKjmlbDnu4TkuK3nmoTkvY3nva5cbiAgICBjb25zdCBsZWZ0Rml4ZWRDb2xzID0gdGhpcy50YWJsZUNvbHMuZmlsdGVyKChjb2wpID0+IGNvbC5maXhlZCA9PT0gXCJsZWZ0XCIpO1xuICAgIGNvbnN0IHJpZ2h0Rml4ZWRDb2xzID0gdGhpcy50YWJsZUNvbHMuZmlsdGVyKFxuICAgICAgKGNvbCkgPT4gY29sLmZpeGVkID09PSBcInJpZ2h0XCIsXG4gICAgKTtcbiAgICBjb25zdCBub3JtYWxDb2xzID0gdGhpcy50YWJsZUNvbHMuZmlsdGVyKChjb2wpID0+ICFjb2wuZml4ZWQpO1xuICAgIGNvbnN0IHJlc3VsdENvbHMgPSBsZWZ0Rml4ZWRDb2xzLmNvbmNhdChub3JtYWxDb2xzKS5jb25jYXQocmlnaHRGaXhlZENvbHMpO1xuICAgIHRoaXMudGFibGVDb2xzID0gcmVzdWx0Q29scztcbiAgICBpZiAoIXRoaXMudGFibGVDb2xzQ2FjaGUgfHwgdGhpcy50YWJsZUNvbHNDYWNoZS5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIOe8k+WtmOS4gOS4i+ihqOagvOeahOaVsOaNrlxuICAgICAgdGhpcy50YWJsZUNvbHNDYWNoZSA9IFsuLi50aGlzLnRhYmxlQ29sc107XG4gICAgfVxuICB9XG5cbiAgbm9ybWFsaXplVGFibGVDYWNoZU9wdGlvbigpIHtcbiAgICBpZiAoIXRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMpIHtcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIH0gZWxzZSBpZiAoISh0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzIGluc3RhbmNlb2YgTWFwKSkge1xuICAgICAgY29uc3QgY29sV2lkdGhzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBjb2xXaWR0aHMuc2V0KGtleSwgKHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMgYXMgYW55KVtrZXldKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocyA9IGNvbFdpZHRocztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhc0NvbHNDYWNoZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24gJiZcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzICYmXG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5sZW5ndGggPiAwXG4gICAgKTtcbiAgfVxuXG4gIHNhdmVUYWJsZUNhY2hlT3B0aW9uKCkge1xuICAgIHRoaXMubG9jYWxmb3JhZ2Uuc2V0SXRlbShcbiAgICAgIFwiaGQtdGFibGVfXCIgK1xuICAgICAgICB0aGlzLnVzZXJTZXNzaW9uLnVzZXJDb2RlICtcbiAgICAgICAgXCJfXCIgK1xuICAgICAgICB0aGlzLmxvY2FsdGlvblRtcCArXG4gICAgICAgIFwiX1wiICtcbiAgICAgICAgdGhpcy51dWlkLFxuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLFxuICAgICk7XG4gIH1cblxuICBqdWRnZVJlcGVhdENvbHMoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRhYmxlQ29scy5sZW5ndGg7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgdGhpcy50YWJsZUNvbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHRoaXMudGFibGVDb2xzW2ldLnRpdGxlID09PSB0aGlzLnRhYmxlQ29sc1tqXS50aXRsZSkge1xuICAgICAgICAgIHRocm93IGBoZC10YWJsZee7hOS7tuS4reWIl+WQjSAke3RoaXMudGFibGVDb2xzW2ldLnRpdGxlfSDph43lpI1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgb25SZXNpemUoeyB3aWR0aCB9OiBOelJlc2l6ZUV2ZW50LCBjb2w6IEhkVGFibGVDb2x1bW4pOiB2b2lkIHtcbiAgICB0aGlzLm5vcm1hbGl6ZVRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICBsZXQgdGVtcFdpZHRoID0gMDtcbiAgICBpZiAod2lkdGggPiBjb2wubWluV2lkdGgpIHtcbiAgICAgIHRlbXBXaWR0aCA9IHdpZHRoO1xuICAgIH0gZWxzZSB7XG4gICAgICB0ZW1wV2lkdGggPSBjb2wubWluV2lkdGg7XG4gICAgfVxuICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMuc2V0KGNvbC50aXRsZSwgdGVtcFdpZHRoKTtcbiAgICB0aGlzLnNhdmVUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgdGhpcy50YWJsZUNvbHMgPSB0aGlzLnRhYmxlQ29scy5tYXAoKGUpID0+XG4gICAgICBlLnRpdGxlID09PSBjb2wudGl0bGUgPyB7IC4uLmUsIHdpZHRoOiB0ZW1wV2lkdGggfSA6IGUsXG4gICAgKTtcbiAgICB0aGlzLmRlYWxTY3JvbGwoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3luY1RvdGFsRm9vdGVyV2l0aEJvZHkoKSk7XG4gIH1cblxuICBkZWFsT3BlcmF0ZUJ0bigpIHtcbiAgICBsZXQgb3BlcmF0ZUNvbCA9IHRoaXMudGFibGVDb2xzLmZpbmQoKGNvbCkgPT4gY29sLnRpdGxlID09PSBcIuaTjeS9nFwiKSB8fCBudWxsO1xuICAgIGlmIChvcGVyYXRlQ29sKSB7XG4gICAgICBsZXQgdGV4dFN0ciA9IFwiXCI7XG4gICAgICBvcGVyYXRlQ29sLmJ0bkxpc3QuZm9yRWFjaCgoYnRuKSA9PiB7XG4gICAgICAgIGlmICghYnRuLmlzUmVwZWF0KSB7XG4gICAgICAgICAgdGV4dFN0ciArPSB0eXBlb2YgYnRuLm5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IFwi5pON5L2cXCIgOiBidG4ubmFtZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgIHNwYW4uc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgICBzcGFuLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgc3Bhbi5zdHlsZS53aGl0ZVNwYWNlID0gXCJub3dyYXBcIjtcbiAgICAgIHNwYW4uc3R5bGUuZm9udFNpemUgPSBcIjE0cHhcIjtcbiAgICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7IC8vIOWwhuagt+W8j+S/ruaUueS4uiBpbmxpbmUtYmxvY2tcbiAgICAgIHNwYW4uaW5uZXJUZXh0ID0gdGV4dFN0cjtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gICAgICBvcGVyYXRlQ29sLndpZHRoID1cbiAgICAgICAgc3Bhbi5vZmZzZXRXaWR0aCArXG4gICAgICAgIChvcGVyYXRlQ29sLmJ0bkxpc3QuZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5pc1JlcGVhdCkubGVuZ3RoIC0gMSkgKiA0ICtcbiAgICAgICAgMTY7XG4gICAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc3Bhbik7XG4gICAgfVxuICB9XG5cbiAgdHJpZ2dlckV2ZW50KGZuOiBhbnksIGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoZm4pIHtcbiAgICAgIGZuKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBuZWVkU2hvd0NvbmZpcm0oYnRuOiBPcGVyYXRlQnRuLCBkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIGJ0bi5zaG93Q29uZmlybSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gYnRuLnNob3dDb25maXJtKGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gISFidG4uc2hvd0NvbmZpcm07XG4gIH1cblxuICBnZXRCdG5OYW1lKGJ0bjogT3BlcmF0ZUJ0biwgZGF0YTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodHlwZW9mIGJ0bi5uYW1lID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBidG4ubmFtZShkYXRhKSB8fCBcIlwiO1xuICAgIH1cbiAgICByZXR1cm4gYnRuLm5hbWUgIT0gbnVsbCA/IFN0cmluZyhidG4ubmFtZSkgOiBcIlwiO1xuICB9XG5cbiAgaXNEYW5nZXJCdG4oYnRuOiBPcGVyYXRlQnRuLCBkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCdG5OYW1lKGJ0biwgZGF0YSkgPT09IFwi5Yig6ZmkXCI7XG4gIH1cblxuICAvKiog6Jma5ouf5rua5Yqo5byA5ZCv5pe25L2/55So6KeG5Y+j5pyA5aSn6auY5bqmICovXG4gIHByaXZhdGUgZ2V0VmlydHVhbFNjcm9sbFkobWF4T2Zmc2V0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgY2FsYygxMDB2aCAtICR7bWF4T2Zmc2V0fXB4KWA7XG4gIH1cblxuICBwcml2YXRlIGhhc1RhYmxlRGF0YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLnRhYmxlRGF0YSAmJlxuICAgICAgdGhpcy50YWJsZURhdGEuY29udGVudCAmJlxuICAgICAgdGhpcy50YWJsZURhdGEuY29udGVudC5sZW5ndGhcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOaMieWjsOaYjuWIl+aAu+WuvSArIOWuueWZqOWuve+8jOiuoeeulyBzY3JvbGwueCDkuI4gZmx1aWQg6KGl5a6944CCXG4gICAqIOWIl+Wwke+8mnNjcm9sbC54ID0g5YaF5a655Yy65a6977yIY2xpZW50V2lkdGjvvInvvIzlt67pop3liqDliLDmnIDlkI7kuJrliqHliJfvvIjli77pgInkv53mjIEgNDDvvInvvJtcbiAgICog5YiX5aSa77yac2Nyb2xsLnggPSDlo7DmmI7mgLvlrr3jgIJcbiAgICog5q+U6L6D5piv5ZCm6LaF5a6955SoIG9mZnNldFdpZHRo77yI5ZCrIFkg5qe977yJ77yM6YG/5YWN44CM5LuF5Zug57q15rua5p2h44CN6K+v5byA5qiq5rua77ybXG4gICAqIOihpeWuveebruagh+eUqCBjbGllbnRXaWR0aO+8jOS4lCBzY3JvbGwueCDnlKggZmxvb3LvvIzpgb/lhY3ooajlrr3lpJogMXB4IOmAvOWHuiBYIOi9tOa7muWKqOadoeOAglxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlSG9yaXpvbnRhbExheW91dChkZWNsYXJlZENvbFdpZHRoOiBudW1iZXIpOiB7XG4gICAgc2Nyb2xsWDogc3RyaW5nIHwgbnVsbDtcbiAgICBmbHVpZEV4dHJhOiBudW1iZXI7XG4gICAgZGlzcGxheVRvdGFsOiBudW1iZXI7XG4gICAgaXNGbHVpZDogYm9vbGVhbjtcbiAgfSB7XG4gICAgaWYgKCF0aGlzLmhhc1RhYmxlRGF0YSgpIHx8IGRlY2xhcmVkQ29sV2lkdGggPD0gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2Nyb2xsWDogbnVsbCxcbiAgICAgICAgZmx1aWRFeHRyYTogMCxcbiAgICAgICAgZGlzcGxheVRvdGFsOiBkZWNsYXJlZENvbFdpZHRoLFxuICAgICAgICBpc0ZsdWlkOiBmYWxzZSxcbiAgICAgIH07XG4gICAgfVxuICAgIGxldCB2aWV3cG9ydENvbXBhcmUgPSB0aGlzLm56VGFibGVDb21wb25lbnRcbiAgICAgID8gZ2V0VGFibGVTY3JvbGxYVmlld3BvcnRXaWR0aCh0aGlzLm56VGFibGVDb21wb25lbnQpXG4gICAgICA6IDA7XG4gICAgLy8g6KGo5L2T5bCa5pyq6YeP5Yiw5a695pe277yI5byC5q2l54GM5pWwIC8gc3BpbiAvIOWImiByZW1vdW5077yJ77yM55So5a6/5Li75a695YWc5bqVXG4gICAgaWYgKHZpZXdwb3J0Q29tcGFyZSA8PSAwICYmIHRoaXMuaG9zdEVsICYmIHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGhvc3RXID0gKHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLm9mZnNldFdpZHRoO1xuICAgICAgaWYgKGhvc3RXID4gMCkge1xuICAgICAgICB2aWV3cG9ydENvbXBhcmUgPSBob3N0VztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHZpZXdwb3J0Q29tcGFyZSA+IDApIHtcbiAgICAgIGlmIChkZWNsYXJlZENvbFdpZHRoID4gdmlld3BvcnRDb21wYXJlICsgMSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNjcm9sbFg6IGAke01hdGguY2VpbChkZWNsYXJlZENvbFdpZHRoKX1weGAsXG4gICAgICAgICAgZmx1aWRFeHRyYTogMCxcbiAgICAgICAgICBkaXNwbGF5VG90YWw6IGRlY2xhcmVkQ29sV2lkdGgsXG4gICAgICAgICAgaXNGbHVpZDogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBmaWxsV2lkdGggPSB0aGlzLm56VGFibGVDb21wb25lbnRcbiAgICAgICAgPyBnZXRUYWJsZVZpZXdwb3J0V2lkdGgodGhpcy5uelRhYmxlQ29tcG9uZW50KVxuICAgICAgICA6IDA7XG4gICAgICBjb25zdCB0YXJnZXQgPSBNYXRoLmZsb29yKGZpbGxXaWR0aCA+IDAgPyBmaWxsV2lkdGggOiB2aWV3cG9ydENvbXBhcmUpO1xuICAgICAgY29uc3QgZmx1aWRFeHRyYSA9IE1hdGgubWF4KDAsIHRhcmdldCAtIGRlY2xhcmVkQ29sV2lkdGgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2Nyb2xsWDogYCR7dGFyZ2V0fXB4YCxcbiAgICAgICAgZmx1aWRFeHRyYSxcbiAgICAgICAgZGlzcGxheVRvdGFsOiBkZWNsYXJlZENvbFdpZHRoICsgZmx1aWRFeHRyYSxcbiAgICAgICAgaXNGbHVpZDogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIOinhuWPo+S7jea1i+S4jeWIsO+8muiHs+WwkeeUqOWjsOaYjuWuveiuviBzY3JvbGwueO+8jOW8uuWItiBmaXhlZCDluIPlsYDplIHli77pgInliJfvvIxcbiAgICAvLyDpgb/lhY3okL3lm54gdGFibGUtbGF5b3V0OmF1dG8g6KKr5Z2H5pGK5pKR5byA77yb5ZCO57utIHN5bmMvcmVtb3VudCDlho3ovawgZmx1aWTjgIJcbiAgICByZXR1cm4ge1xuICAgICAgc2Nyb2xsWDogYCR7TWF0aC5jZWlsKGRlY2xhcmVkQ29sV2lkdGgpfXB4YCxcbiAgICAgIGZsdWlkRXh0cmE6IDAsXG4gICAgICBkaXNwbGF5VG90YWw6IGRlY2xhcmVkQ29sV2lkdGgsXG4gICAgICBpc0ZsdWlkOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIOihqOagvOa4suafk+WQjuaMieWunumZheWuueWZqOWuveW6puagoeato+aoquWQkSBzY3JvbGwgLyBmbHVpZCDooaXlrr0gKi9cbiAgcHJpdmF0ZSBzeW5jSG9yaXpvbnRhbFNjcm9sbCgpOiB2b2lkIHtcbiAgICBsZXQgZGVjbGFyZWQgPSAwO1xuICAgIGlmICh0aGlzLnNob3dTZWxlY3RlZCkge1xuICAgICAgZGVjbGFyZWQgKz0gNDA7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dUYWJsZVRvdGFsKSB7XG4gICAgICBkZWNsYXJlZCArPSB0aGlzLmxpbmVOdW1iZXJDb2xXaWR0aDtcbiAgICB9XG4gICAgaWYgKHRoaXMudGFibGVDb2xzKSB7XG4gICAgICB0aGlzLnRhYmxlQ29scy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChpdGVtICYmIGl0ZW0uaXNTaG93ICE9PSBmYWxzZSkge1xuICAgICAgICAgIGRlY2xhcmVkICs9IGl0ZW0ud2lkdGggPiAwID8gaXRlbS53aWR0aCA6IENvbFdpZHRoLmZpeENvbFdpZHRoO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgcHJldkhhc1ggPSAhISh0aGlzLnNjcm9sbCAmJiB0aGlzLnNjcm9sbC54KTtcbiAgICBjb25zdCBsYXlvdXQgPSB0aGlzLnJlc29sdmVIb3Jpem9udGFsTGF5b3V0KGRlY2xhcmVkKTtcbiAgICBjb25zdCBjdXJyZW50WSA9IHRoaXMuc2Nyb2xsID8gdGhpcy5zY3JvbGwueSA6IG51bGw7XG4gICAgY29uc3QgbmV4dEhhc1ggPSAhIWxheW91dC5zY3JvbGxYO1xuICAgIGNvbnN0IHNhbWVYID0gdGhpcy5zY3JvbGwgJiYgdGhpcy5zY3JvbGwueCA9PT0gbGF5b3V0LnNjcm9sbFg7XG4gICAgY29uc3Qgc2FtZUV4dHJhID0gdGhpcy5mbHVpZEV4dHJhV2lkdGggPT09IGxheW91dC5mbHVpZEV4dHJhO1xuICAgIGNvbnN0IHNhbWVGbHVpZCA9IHRoaXMuZmx1aWRIb3Jpem9udGFsID09PSBsYXlvdXQuaXNGbHVpZDtcbiAgICBpZiAoXG4gICAgICBzYW1lWCAmJlxuICAgICAgc2FtZUV4dHJhICYmXG4gICAgICBzYW1lRmx1aWQgJiZcbiAgICAgIHRoaXMuc2Nyb2xsICYmXG4gICAgICB0aGlzLnNjcm9sbC55ID09PSBjdXJyZW50WVxuICAgICkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnN5bmNUb3RhbEZvb3RlcldpdGhCb2R5KCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZsdWlkRXh0cmFXaWR0aCA9IGxheW91dC5mbHVpZEV4dHJhO1xuICAgIHRoaXMuZmx1aWRIb3Jpem9udGFsID0gbGF5b3V0LmlzRmx1aWQ7XG4gICAgdGhpcy5yZWZyZXNoRmx1aWRFeHRyYVRhcmdldENvbCgpO1xuICAgIHRoaXMudGFibGVDb2xXaWR0aFRvdGFsID0gbGF5b3V0LmRpc3BsYXlUb3RhbDtcbiAgICB0aGlzLnNjcm9sbCA9IHsgeDogbGF5b3V0LnNjcm9sbFgsIHk6IGN1cnJlbnRZIH07XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgLy8gc3luYyDpmLbmrrXoi6XooaXkuIrkuoYgc2Nyb2xsLnjvvIzpnIDph43lu7rmiY3og73liIfliLAgZml4ZWQg5biD5bGAXG4gICAgaWYgKHByZXZIYXNYICE9PSBuZXh0SGFzWCkge1xuICAgICAgdGhpcy5hcHBseVRhYmxlU2Nyb2xsTW9kZSh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnN5bmNIZWFkZXJCb2R5U2Nyb2xsTGVmdCgpKTtcbiAgfVxuXG4gIC8qKiDmiYvliqjmiorooajkvZPmqKrlkJHmu5rliqjlkIzmraXliLDooajlpLQgLyDlkIjorqEgZm9vdGVy77yI5YWc5bqVIG5nLXpvcnJvIOebkeWQrOS4ouWkseeahOaDheWGte+8iSAqL1xuICBwcml2YXRlIHN5bmNIZWFkZXJCb2R5U2Nyb2xsTGVmdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubnpUYWJsZUNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBoZWFkZXIgPSAodGhpcy5uelRhYmxlQ29tcG9uZW50IGFzIGFueSlcbiAgICAgIC50YWJsZUhlYWRlck5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGNvbnN0IGJvZHkgPSB0aGlzLmdldFRhYmxlQm9keVNjcm9sbEVsKCk7XG4gICAgaWYgKHRoaXMuc2Nyb2xsICYmIHRoaXMuc2Nyb2xsLnggJiYgaGVhZGVyICYmIGJvZHkpIHtcbiAgICAgIGlmIChoZWFkZXIuc2Nyb2xsTGVmdCAhPT0gYm9keS5zY3JvbGxMZWZ0KSB7XG4gICAgICAgIGhlYWRlci5zY3JvbGxMZWZ0ID0gYm9keS5zY3JvbGxMZWZ0O1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN5bmNUb3RhbEZvb3RlcldpdGhCb2R5KCk7XG4gIH1cblxuICAvKiog5Y+W6KGo5L2T5qiq5ZCR5rua5Yqo5a655Zmo77yI6Jma5ouf5rua5Yqo5LyY5YWIIHZpZXdwb3J077yJICovXG4gIHByaXZhdGUgZ2V0VGFibGVCb2R5U2Nyb2xsRWwoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMubnpUYWJsZUNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1peCA9ICh0aGlzLm56VGFibGVDb21wb25lbnQgYXMgYW55KVxuICAgICAgLm1peFRhYmxlQm9keU5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmIChtaXgpIHtcbiAgICAgIHJldHVybiBtaXg7XG4gICAgfVxuICAgIGNvbnN0IGhvc3QgPSB0aGlzLmhvc3RFbCAmJiAodGhpcy5ob3N0RWwubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgaWYgKCFob3N0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIChob3N0LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIFwiY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0LmFudC10YWJsZS1ib2R5XCIsXG4gICAgICApIGFzIEhUTUxFbGVtZW50KSB8fFxuICAgICAgKGhvc3QucXVlcnlTZWxlY3RvcihcIi5hbnQtdGFibGUtYm9keVwiKSBhcyBIVE1MRWxlbWVudCkgfHxcbiAgICAgIG51bGxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUb3RhbEZvb3RlclNjcm9sbEVsKCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuaG9zdEVsICYmICh0aGlzLmhvc3RFbC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KTtcbiAgICByZXR1cm4gaG9zdFxuICAgICAgPyAoaG9zdC5xdWVyeVNlbGVjdG9yKFwiLmhkLXRhYmxlLXRvdGFsLWZvb3RlclwiKSBhcyBIVE1MRWxlbWVudClcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8qKiDooajkvZPmmK/lkKblh7rnjrDnurXlkJHmu5rliqjmnaHvvIjlkKvmu5rliqjmnaHmp73lrr3vvIkgKi9cbiAgcHJpdmF0ZSBib2R5SGFzVmVydGljYWxTY3JvbGxiYXIoYm9keTogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICBpZiAoIWJvZHkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIGJvZHkuc2Nyb2xsSGVpZ2h0ID4gYm9keS5jbGllbnRIZWlnaHQgKyAxIHx8XG4gICAgICBib2R5Lm9mZnNldFdpZHRoIC0gYm9keS5jbGllbnRXaWR0aCA+IDFcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOWQiOiuoSBmb290ZXIg5LiO6KGo5L2T6IGU5Yqo77yaXG4gICAqIC0gZmx1aWTvvIjliJfmnKrmkpHmu6HvvInvvJrkuI3mqKrmu5rjgIHkuI3mtYvlrr3vvIzooajlrr0gMTAwJSDkuI7ooajkvZPlkIzmr5Tkvovmi4nkvLjvvJtcbiAgICogLSBmaXhlZO+8iOaciSBzY3JvbGwueO+8ie+8muWQjOatpSBzY3JvbGxMZWZ077ybXG4gICAqIC0g5LuF5b2T6KGo5L2T5pyJ56uW5rua5p2h5pe26aKE55WZ5Y+z5L6n5qe977yM6KGM5bCR5peg56uW5rua5pe25LiN5Y2g5L2N44CCXG4gICAqL1xuICBwcml2YXRlIHN5bmNUb3RhbEZvb3RlcldpdGhCb2R5KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG93VGFibGVUb3RhbCkge1xuICAgICAgdGhpcy51bmJpbmRUb3RhbEZvb3RlclNjcm9sbFN5bmMoKTtcbiAgICAgIGlmICh0aGlzLnRvdGFsRm9vdGVyTmVlZFlHdXR0ZXIpIHtcbiAgICAgICAgdGhpcy50b3RhbEZvb3Rlck5lZWRZR3V0dGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmb290ZXIgPSB0aGlzLmdldFRvdGFsRm9vdGVyU2Nyb2xsRWwoKTtcbiAgICBjb25zdCBib2R5ID0gdGhpcy5nZXRUYWJsZUJvZHlTY3JvbGxFbCgpO1xuICAgIGlmICghZm9vdGVyKSB7XG4gICAgICBpZiAodGhpcy50b3RhbEZvb3RlclN5bmNSZXRyeSA8IDEwKSB7XG4gICAgICAgIHRoaXMudG90YWxGb290ZXJTeW5jUmV0cnkrKztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnN5bmNUb3RhbEZvb3RlcldpdGhCb2R5KCksIDUwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy50b3RhbEZvb3RlclN5bmNSZXRyeSA9IDA7XG4gICAgY29uc3QgbmVlZFlHdXR0ZXIgPSAhIShib2R5ICYmIHRoaXMuYm9keUhhc1ZlcnRpY2FsU2Nyb2xsYmFyKGJvZHkpKTtcbiAgICBpZiAodGhpcy50b3RhbEZvb3Rlck5lZWRZR3V0dGVyICE9PSBuZWVkWUd1dHRlcikge1xuICAgICAgdGhpcy50b3RhbEZvb3Rlck5lZWRZR3V0dGVyID0gbmVlZFlHdXR0ZXI7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNUb3RhbEZvb3RlckZsdWlkKSB7XG4gICAgICB0aGlzLnVuYmluZFRvdGFsRm9vdGVyU2Nyb2xsU3luYygpO1xuICAgICAgZm9vdGVyLnNjcm9sbExlZnQgPSAwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoYm9keSkge1xuICAgICAgdGhpcy5zeW5jVG90YWxGb290ZXJTY3JvbGxMZWZ0KGJvZHkuc2Nyb2xsTGVmdCk7XG4gICAgICB0aGlzLmJpbmRUb3RhbEZvb3RlclNjcm9sbFN5bmMoYm9keSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jVG90YWxGb290ZXJTY3JvbGxMZWZ0KHNjcm9sbExlZnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGZvb3RlciA9IHRoaXMuZ2V0VG90YWxGb290ZXJTY3JvbGxFbCgpO1xuICAgIGlmIChmb290ZXIgJiYgZm9vdGVyLnNjcm9sbExlZnQgIT09IHNjcm9sbExlZnQpIHtcbiAgICAgIGZvb3Rlci5zY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJpbmRUb3RhbEZvb3RlclNjcm9sbFN5bmMoYm9keTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvd1RhYmxlVG90YWwgfHwgIWJvZHkgfHwgdGhpcy5pc1RvdGFsRm9vdGVyRmx1aWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy50b3RhbEZvb3RlclNjcm9sbEJvdW5kQm9keSA9PT0gYm9keSAmJlxuICAgICAgdGhpcy50b3RhbEZvb3RlclNjcm9sbEhhbmRsZXJcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51bmJpbmRUb3RhbEZvb3RlclNjcm9sbFN5bmMoKTtcbiAgICB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsQm91bmRCb2R5ID0gYm9keTtcbiAgICB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHRoaXMuc3luY1RvdGFsRm9vdGVyU2Nyb2xsTGVmdChib2R5LnNjcm9sbExlZnQpO1xuICAgIH07XG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMudG90YWxGb290ZXJTY3JvbGxIYW5kbGVyLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgIH0gYXMgYW55KTtcbiAgfVxuXG4gIHByaXZhdGUgdW5iaW5kVG90YWxGb290ZXJTY3JvbGxTeW5jKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsQm91bmRCb2R5ICYmIHRoaXMudG90YWxGb290ZXJTY3JvbGxIYW5kbGVyKSB7XG4gICAgICB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsQm91bmRCb2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgIFwic2Nyb2xsXCIsXG4gICAgICAgIHRoaXMudG90YWxGb290ZXJTY3JvbGxIYW5kbGVyLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy50b3RhbEZvb3RlclNjcm9sbEJvdW5kQm9keSA9IG51bGw7XG4gICAgdGhpcy50b3RhbEZvb3RlclNjcm9sbEhhbmRsZXIgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOebkeWQrOeql+WPoyAvIOWuueWZqOWuveW6puWPmOWMlu+8mumHjeaWsOWIpOWumiBzY3JvbGwueO+8iGZsdWlk4oaUZml4ZWTvvInkuI7lkIjorqHlj7Pkvqfnq5bmu5rmp73vvIxcbiAgICog6YG/5YWN5ouJ5a69L+e8qeeqhOWxj+W5leWQjuWQiOiuoeihjOWuveS4juihqOS9k+mUmeS9jeOAglxuICAgKi9cbiAgcHJpdmF0ZSBiaW5kVmlld3BvcnRSZXNpemVTeW5jKCk6IHZvaWQge1xuICAgIHRoaXMuYm91bmRPblZpZXdwb3J0UmVzaXplID0gKCkgPT4gdGhpcy5zY2hlZHVsZVZpZXdwb3J0U2Nyb2xsU3luYygpO1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLmJvdW5kT25WaWV3cG9ydFJlc2l6ZSk7XG4gICAgfVxuICAgIGNvbnN0IFJPID1cbiAgICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyAod2luZG93IGFzIGFueSkuUmVzaXplT2JzZXJ2ZXIgOiBudWxsO1xuICAgIGlmIChSTyAmJiB0aGlzLmhvc3RFbCAmJiB0aGlzLmhvc3RFbC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICB0aGlzLmhvc3RSZXNpemVPYnNlcnZlciA9IG5ldyBSTygoKSA9PiB0aGlzLnNjaGVkdWxlVmlld3BvcnRTY3JvbGxTeW5jKCkpO1xuICAgICAgdGhpcy5ob3N0UmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmhvc3RFbC5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVuYmluZFZpZXdwb3J0UmVzaXplU3luYygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ib3VuZE9uVmlld3BvcnRSZXNpemUgJiYgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5ib3VuZE9uVmlld3BvcnRSZXNpemUpO1xuICAgIH1cbiAgICB0aGlzLmJvdW5kT25WaWV3cG9ydFJlc2l6ZSA9IG51bGw7XG4gICAgaWYgKHRoaXMuaG9zdFJlc2l6ZU9ic2VydmVyKSB7XG4gICAgICB0aGlzLmhvc3RSZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICB0aGlzLmhvc3RSZXNpemVPYnNlcnZlciA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnZpZXdwb3J0UmVzaXplVGltZXIgIT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudmlld3BvcnRSZXNpemVUaW1lcik7XG4gICAgICB0aGlzLnZpZXdwb3J0UmVzaXplVGltZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVWaWV3cG9ydFNjcm9sbFN5bmMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlld3BvcnRSZXNpemVUaW1lciAhPSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy52aWV3cG9ydFJlc2l6ZVRpbWVyKTtcbiAgICB9XG4gICAgdGhpcy52aWV3cG9ydFJlc2l6ZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnZpZXdwb3J0UmVzaXplVGltZXIgPSBudWxsO1xuICAgICAgaWYgKCF0aGlzLnRhYmxlQ29scyB8fCAhdGhpcy50YWJsZUNvbHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3luY0hvcml6b250YWxTY3JvbGwoKTtcbiAgICAgIC8vIOetieihqOS9k+W4g+WxgOeos+WumuWQjuWGjeagoeWQiOiuoeerlua7muanvSAvIOaoqua7muWQjOatpVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnN5bmNUb3RhbEZvb3RlcldpdGhCb2R5KCksIDUwKTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgZGVhbFNjcm9sbCgpIHtcbiAgICBsZXQgY29sV2lkdGggPSAwO1xuICAgIGlmICh0aGlzLnNob3dTZWxlY3RlZCkge1xuICAgICAgY29sV2lkdGggKz0gNDA7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dUYWJsZVRvdGFsKSB7XG4gICAgICBjb2xXaWR0aCArPSB0aGlzLmxpbmVOdW1iZXJDb2xXaWR0aDsgLy8g5bqP5Y+35YiX77yI5Zu65a6a5a6977yM5LiN6ZqP5L2N5pWw5Y+Y5YyW77yJXG4gICAgfVxuICAgIHRoaXMudGFibGVDb2xzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmICghaXRlbS53aWR0aCkge1xuICAgICAgICBpdGVtLndpZHRoID0gQ29sV2lkdGguZml4Q29sV2lkdGg7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbS5pc1Nob3cgIT09IGZhbHNlKSB7XG4gICAgICAgIGl0ZW0uZml4ZWRXaWR0aCA9IGNvbFdpZHRoO1xuICAgICAgICBjb2xXaWR0aCArPSBpdGVtLndpZHRoO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8g5Y+z5L6n5Zu65a6a5YiX77ya5LuO5Y+z5b6A5bem57Sv6K6h5YGP56e777yM6YG/5YWN5aSa5YiX6YO9IHJpZ2h0OjAg5LqS55u46YGu5oyhXG4gICAgbGV0IHJpZ2h0T2Zmc2V0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gdGhpcy50YWJsZUNvbHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnRhYmxlQ29sc1tpXTtcbiAgICAgIGlmIChpdGVtLmlzU2hvdyA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbS5maXhlZCA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgIGl0ZW0uZml4ZWRSaWdodFdpZHRoID0gcmlnaHRPZmZzZXQ7XG4gICAgICAgIHJpZ2h0T2Zmc2V0ICs9IGl0ZW0ud2lkdGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtLmZpeGVkUmlnaHRXaWR0aCA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbGF5b3V0ID0gdGhpcy5yZXNvbHZlSG9yaXpvbnRhbExheW91dChjb2xXaWR0aCk7XG4gICAgdGhpcy5mbHVpZEV4dHJhV2lkdGggPSBsYXlvdXQuZmx1aWRFeHRyYTtcbiAgICB0aGlzLmZsdWlkSG9yaXpvbnRhbCA9IGxheW91dC5pc0ZsdWlkO1xuICAgIHRoaXMucmVmcmVzaEZsdWlkRXh0cmFUYXJnZXRDb2woKTtcbiAgICB0aGlzLnRhYmxlQ29sV2lkdGhUb3RhbCA9IGxheW91dC5kaXNwbGF5VG90YWw7XG4gICAgY29uc3QgbWF4T2Zmc2V0ID0gdGhpcy5nZXRTY3JvbGxZTWF4T2Zmc2V0KCk7XG4gICAgY29uc3QgdXNlVmlydHVhbCA9IHRoaXMudXNlVmlydHVhbFNjcm9sbDtcbiAgICBjb25zdCBzY3JvbGxYID0gbGF5b3V0LnNjcm9sbFg7XG5cbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsICYmICF1c2VWaXJ0dWFsKSB7XG4gICAgICB0aGlzLnNjcm9sbCA9IHtcbiAgICAgICAgeDogc2Nyb2xsWCxcbiAgICAgICAgeTogbnVsbCxcbiAgICAgIH07XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZpcnR1YWxTY3JvbGwpIHtcbiAgICAgIHRoaXMuc2Nyb2xsID0ge1xuICAgICAgICB4OiBzY3JvbGxYLFxuICAgICAgICB5OiBgY2FsYygxMDB2aCAtICR7bWF4T2Zmc2V0fXB4KWAsXG4gICAgICB9O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2Nyb2xsID0ge1xuICAgICAgeDogc2Nyb2xsWCxcbiAgICAgIHk6IHRoaXMuZ2V0VmlydHVhbFNjcm9sbFkobWF4T2Zmc2V0KSxcbiAgICB9O1xuICB9XG5cbiAgLy8g6KGo5qC85Yu+6YCJ6YC76L6RXG4gIGN1cnJlbnRQYWdlRGF0YUNoYW5nZSgkZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubGlzdE9mRGlzcGxheURhdGEgPSAkZXZlbnQ7XG4gICAgdGhpcy5yZWZyZXNoU3RhdHVzKCk7XG4gICAgaWYgKCF0aGlzLmlzQ3Jvc3NQYWdlU2VsZWN0TG9jYWwpIHtcbiAgICAgIHRoaXMucmVzZXRTdGF0dXMoKTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBzZWFyY2gocmVzZXQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMucGFnaW5hdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyDliY3nq6/liIbpobXvvJrlj6rlkIzmraXpobXnoIEv5p2h5pWw77yM5LiN6Kem5Y+R54i257uE5Lu25p+l6K+iXG4gICAgaWYgKHRoaXMuZnJvbnRQYWdpbmF0aW9uKSB7XG4gICAgICBpZiAocmVzZXQpIHtcbiAgICAgICAgdGhpcy50YWJsZVBhZ2VJbmRleCA9IDE7XG4gICAgICAgIHRoaXMudGFibGVQYWdlU2l6ZUNoYW5nZS5lbWl0KHRoaXMudGFibGVQYWdlU2l6ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRhYmxlUGFnZUluZGV4Q2hhbmdlLmVtaXQodGhpcy50YWJsZVBhZ2VJbmRleCk7XG4gICAgICB9XG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgPSB0aGlzLnRhYmxlUGFnZVNpemU7XG4gICAgICB0aGlzLnNhdmVUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgICAvLyDmjInlvZPliY3pobXooYzmlbDph43nrpfmmK/lkKbpnIDopoEgc2Nyb2xsLnnvvIjmnKvpobXmlbDmja7lsJHml7bljrvmjonlm7rlrprpq5jluqbvvIzpgb/lhY3nlZnnmb3vvIlcbiAgICAgIHRoaXMucGVuZGluZ1Jlc2V0U2Nyb2xsVG9wID0gdHJ1ZTtcbiAgICAgIHRoaXMuYXBwbHlUYWJsZVNjcm9sbE1vZGUoZmFsc2UpO1xuICAgICAgdGhpcy5zY2hlZHVsZVJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLnBhZ2VTaXplID0gdGhpcy50YWJsZVBhZ2VTaXplO1xuICAgIHRoaXMuc2F2ZVRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICBpZiAocmVzZXQpIHtcbiAgICAgIHRoaXMudGFibGVQYWdlU2l6ZUNoYW5nZS5lbWl0KHRoaXMudGFibGVQYWdlU2l6ZSk7XG4gICAgICB0aGlzLnRhYmxlUGFnZVNpemVDaGFuZ2VFdmVudC5lbWl0KHRoaXMudGFibGVQYWdlU2l6ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGFibGVQYWdlSW5kZXhDaGFuZ2UuZW1pdCh0aGlzLnRhYmxlUGFnZUluZGV4KTtcbiAgICAgIC8vIOinpuWPkeeItue7hOS7tuafpeivouS6i+S7tlxuICAgICAgdGhpcy50YWJsZVNlYXJjaEV2ZW50LmVtaXQocmVzZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlupXpg6jlkIjorqHvvJrkuI4gaGQtZGV0YWlsLWxpbmVzIOebuOWQjO+8jOS9v+eUqCBUb3RhbE9wdGlvbu+8iGluc2VydEluZGV4IC8gaW5zZXJ0VmFsdWXvvInjgIJcbiAgICog5byA5ZCv5ZCO5by65Yi25bGV56S65bqP5Y+35YiX77yM44CM5ZCI6K6h44CN6JC95Zyo5bqP5Y+35YiX5LiL77ybXG4gICAqIGluc2VydEluZGV4IOS7jiAxIOi1t+WvueW6lOWPr+ingeaVsOaNruWIl++8m+acquS8oCBpbnNlcnRWYWx1ZSDml7bmjInor6XliJcgbmFtZSDlr7kgY29udGVudCDmsYLlkozjgIJcbiAgICovXG4gIGNhbGN1bGF0ZVRhYmxlVG90YWwoKSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuc2hvd1RhYmxlVG90YWwgfHxcbiAgICAgICF0aGlzLnRhYmxlVG90YWxPcHRpb24gfHxcbiAgICAgICF0aGlzLnRhYmxlVG90YWxPcHRpb24ubGVuZ3RoXG4gICAgKSB7XG4gICAgICB0aGlzLnRhYmxlVG90YWxPcHRpb25MaXN0ID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZpc2libGVDb2xzID0gKHRoaXMudGFibGVDb2xzIHx8IFtdKS5maWx0ZXIoXG4gICAgICAoYykgPT4gYyAmJiBjLmlzU2hvdyAhPT0gZmFsc2UsXG4gICAgKTtcbiAgICAvLyBjb2x1bW5zTnVtYmVyIOWQq+W6j+WPt+WIl++8iOS4jiBkZXRhaWwtbGluZXMg5LiA6Ie077yJ77yM5pWw5o2u5qe95L2N5pWwID0gY29sdW1uc051bWJlciAtIDFcbiAgICBjb25zdCBjb25maWd1cmVkID0gTnVtYmVyKHRoaXMuY29sdW1uc051bWJlcik7XG4gICAgY29uc3QgY29sdW1uTnVtYmVyID1cbiAgICAgIGNvbmZpZ3VyZWQgPiAxXG4gICAgICAgID8gY29uZmlndXJlZCAtIDFcbiAgICAgICAgOiBjb25maWd1cmVkID09PSAxXG4gICAgICAgICAgPyAxXG4gICAgICAgICAgOiB2aXNpYmxlQ29scy5sZW5ndGg7XG4gICAgaWYgKCFjb2x1bW5OdW1iZXIgfHwgY29sdW1uTnVtYmVyIDwgMSkge1xuICAgICAgdGhpcy50YWJsZVRvdGFsT3B0aW9uTGlzdCA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRhYmxlVG90YWxPcHRpb25MaXN0ID0gbmV3IEFycmF5KGNvbHVtbk51bWJlcikuZmlsbChcIlwiKTtcbiAgICBjb25zdCBjb250ZW50ID1cbiAgICAgIHRoaXMudGFibGVEYXRhICYmIHRoaXMudGFibGVEYXRhLmNvbnRlbnQgPyB0aGlzLnRhYmxlRGF0YS5jb250ZW50IDogW107XG4gICAgdGhpcy50YWJsZVRvdGFsT3B0aW9uLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtID09IG51bGwgfHwgIWl0ZW0uaW5zZXJ0SW5kZXggfHwgaXRlbS5pbnNlcnRJbmRleCA8IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IHZhbHVlOiBhbnkgPSBpdGVtLmluc2VydFZhbHVlO1xuICAgICAgLy8g5pyq5LygIGluc2VydFZhbHVlIOaXtu+8muaMiSBpbnNlcnRJbmRleCDlr7nlupTlj6/op4HliJcgbmFtZSDoh6rliqjmsYLlkoxcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgIGNvbnN0IGNvbCA9IHZpc2libGVDb2xzW2l0ZW0uaW5zZXJ0SW5kZXggLSAxXTtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjb2wgJiYgdHlwZW9mIGNvbC5uYW1lID09PSBcInN0cmluZ1wiID8gY29sLm5hbWUgOiBudWxsO1xuICAgICAgICBpZiAoIWZpZWxkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBsZXQgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgY29udGVudC5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgICBjb25zdCByYXcgPSByb3cgPyByb3dbZmllbGRdIDogbnVsbDtcbiAgICAgICAgICBpZiAocmF3ID09IG51bGwgfHwgcmF3ID09PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG51bSA9IE51bWJlcihyYXcpO1xuICAgICAgICAgIGlmICghaXNOYU4obnVtKSkge1xuICAgICAgICAgICAgc3VtICs9IG51bTtcbiAgICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWhhc1ZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gc3VtO1xuICAgICAgfVxuICAgICAgY29uc3QgY29sQXRJbmRleCA9IHZpc2libGVDb2xzW2l0ZW0uaW5zZXJ0SW5kZXggLSAxXTtcbiAgICAgIHRoaXMudGFibGVUb3RhbE9wdGlvbkxpc3RbaXRlbS5pbnNlcnRJbmRleCAtIDFdID0ge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgYWxpZ246IGl0ZW0uYWxpZ24gfHwgKGNvbEF0SW5kZXggJiYgY29sQXRJbmRleC5hbGlnbikgfHwgXCJsZWZ0XCIsXG4gICAgICAgIHNob3dEZWNpbWFsOiBpdGVtLnNob3dEZWNpbWFsIHx8IGZhbHNlLFxuICAgICAgICBwcmVzZXJ2ZU51bWJlcjogaXRlbS5wcmVzZXJ2ZU51bWJlciAhPSBudWxsID8gaXRlbS5wcmVzZXJ2ZU51bWJlciA6IDIsXG4gICAgICAgIGlzSGlkZTogaXRlbS5pc0hpZGUgfHwgZmFsc2UsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUYWJsZVRvdGFsQ2VsbE1ldGEoY29sOiBIZFRhYmxlQ29sdW1uLCBjb2xJbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBpZiAoXG4gICAgICAhY29sIHx8XG4gICAgICAhdGhpcy50YWJsZVRvdGFsT3B0aW9uTGlzdCB8fFxuICAgICAgIXRoaXMudGFibGVUb3RhbE9wdGlvbkxpc3QubGVuZ3RoXG4gICAgKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgbGV0IHZpc2libGVJbmRleCA9IC0xO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGNvbEluZGV4OyBpKyspIHtcbiAgICAgIGNvbnN0IGMgPSB0aGlzLnRhYmxlQ29sc1tpXTtcbiAgICAgIGlmIChjICYmIGMuaXNTaG93ICE9PSBmYWxzZSkge1xuICAgICAgICB2aXNpYmxlSW5kZXgrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHZpc2libGVJbmRleCA8IDAgfHwgdmlzaWJsZUluZGV4ID49IHRoaXMudGFibGVUb3RhbE9wdGlvbkxpc3QubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWV0YSA9IHRoaXMudGFibGVUb3RhbE9wdGlvbkxpc3RbdmlzaWJsZUluZGV4XTtcbiAgICByZXR1cm4gbWV0YSAmJiB0eXBlb2YgbWV0YSA9PT0gXCJvYmplY3RcIiA/IG1ldGEgOiBudWxsO1xuICB9XG5cbiAgLyoqIOWQiOiuoeWNleWFg+agvOWxleekuuaWh+ahiO+8iOWvuem9kCBkZXRhaWwtbGluZXMg5bCP5pWw6KeE5YiZ77yJICovXG4gIGdldFRhYmxlVG90YWxDZWxsVmFsdWUoY29sOiBIZFRhYmxlQ29sdW1uLCBjb2xJbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXRUYWJsZVRvdGFsQ2VsbE1ldGEoY29sLCBjb2xJbmRleCk7XG4gICAgaWYgKCFtZXRhIHx8IG1ldGEuaXNIaWRlKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBtZXRhLnZhbHVlO1xuICAgIGlmICghKHZhbHVlIHx8IHZhbHVlID09PSAwKSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGNvbnN0IHByZXNlcnZlID1cbiAgICAgIG1ldGEucHJlc2VydmVOdW1iZXIgIT0gbnVsbCA/IE51bWJlcihtZXRhLnByZXNlcnZlTnVtYmVyKSA6IDI7XG4gICAgaWYgKHZhbHVlICUgMSA9PT0gMCAmJiAhbWV0YS5zaG93RGVjaW1hbCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBmYWN0b3IgPSBNYXRoLnBvdygxMCwgcHJlc2VydmUpO1xuICAgIHJldHVybiAoTWF0aC5yb3VuZChOdW1iZXIodmFsdWUpICogZmFjdG9yKSAvIGZhY3RvcikudG9GaXhlZChwcmVzZXJ2ZSk7XG4gIH1cblxuICBnZXRUYWJsZVRvdGFsQ2VsbEFsaWduKGNvbDogSGRUYWJsZUNvbHVtbiwgY29sSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0VGFibGVUb3RhbENlbGxNZXRhKGNvbCwgY29sSW5kZXgpO1xuICAgIGNvbnN0IGFsaWduID0gKG1ldGEgJiYgbWV0YS5hbGlnbikgfHwgKGNvbCAmJiBjb2wuYWxpZ24pIHx8IFwibGVmdFwiO1xuICAgIGlmIChhbGlnbiA9PT0gXCJyaWdodFwiIHx8IGFsaWduID09PSBcImNlbnRlclwiIHx8IGFsaWduID09PSBcImxlZnRcIikge1xuICAgICAgcmV0dXJuIGFsaWduO1xuICAgIH1cbiAgICByZXR1cm4gXCJsZWZ0XCI7XG4gIH1cblxuICAvKiog5bqV6YOo44CM5YWxIG4g5p2h44CN77ya6Z2e5YiG6aG1L+WJjeerr+WIhumhteeUqCBjb250ZW50Lmxlbmd0aO+8jOacjeWKoeerr+WIhumhteeUqCB0b3RhbEVsZW1lbnRzICovXG4gIGdldFRhYmxlVG90YWxDb3VudCgpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy50YWJsZURhdGEpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBpZiAoIXRoaXMucGFnaW5hdGlvbiB8fCB0aGlzLmZyb250UGFnaW5hdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMudGFibGVEYXRhLmNvbnRlbnQgPyB0aGlzLnRhYmxlRGF0YS5jb250ZW50Lmxlbmd0aCA6IDA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRhYmxlRGF0YS50b3RhbEVsZW1lbnRzICE9IG51bGxcbiAgICAgID8gdGhpcy50YWJsZURhdGEudG90YWxFbGVtZW50c1xuICAgICAgOiAwO1xuICB9XG5cbiAgcmVzZXRTdGF0dXMoKSB7XG4gICAgdGhpcy5pc0FsbERpc3BsYXlEYXRhQ2hlY2tlZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNJbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgLy8g5YWI5pi+5byP572uIGZhbHNl77yM6YG/5YWNIG56LWNoZWNrYm94IOWGhemDqOeKtuaAgeS4jiBtYXBPZkNoZWNrZWRJZCDkuI3lkIzmraXvvIjomZrmi5/mu5rliqjlpI3nlKjooYzml7bluLjop4HvvIlcbiAgICBPYmplY3Qua2V5cyh0aGlzLm1hcE9mQ2hlY2tMaXN0KS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIHRoaXMubWFwT2ZDaGVja2VkSWRba2V5XSA9IGZhbHNlO1xuICAgIH0pO1xuICAgIHRoaXMubGlzdE9mRGlzcGxheURhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gaXRlbVt0aGlzLnNlbGVjdEZpZWxkXTtcbiAgICAgIGlmIChrZXkgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLm1hcE9mQ2hlY2tlZElkW2tleV0gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm1hcE9mQ2hlY2tlZElkID0ge307XG4gICAgdGhpcy5tYXBPZkNoZWNrTGlzdCA9IHt9O1xuICAgIHRoaXMuc2VsZWN0RXZlbnQuZW1pdChbXSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiog5Y2V6YCJ77ya6YCJ5Lit5b2T5YmN6KGM5bm25riF5o6J5YW25a6D6KGM77yb5b+955WlIHJhZGlvIOWboOWIh+aNouiAjOWPkeWHuueahCBmYWxzZSAqL1xuICBvblJhZGlvU2VsZWN0KGNoZWNrZWQ6IGJvb2xlYW4sIGRhdGE6IGFueSk6IHZvaWQge1xuICAgIGlmICghY2hlY2tlZCB8fCAhZGF0YSkge1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmlzU2VsZWN0RGlzYWJsZWQoZGF0YSkpIHtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBkYXRhW3RoaXMuc2VsZWN0RmllbGRdO1xuICAgIHRoaXMubWFwT2ZDaGVja2VkSWQgPSB7fTtcbiAgICB0aGlzLm1hcE9mQ2hlY2tMaXN0ID0ge307XG4gICAgaWYgKGtleSAhPSBudWxsKSB7XG4gICAgICB0aGlzLm1hcE9mQ2hlY2tlZElkW2tleV0gPSB0cnVlO1xuICAgICAgdGhpcy5tYXBPZkNoZWNrTGlzdFtrZXldID0gZGF0YTtcbiAgICB9XG4gICAgdGhpcy5pc0FsbERpc3BsYXlEYXRhQ2hlY2tlZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNJbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuc2VsZWN0RXZlbnQpIHtcbiAgICAgIHRoaXMuc2VsZWN0RXZlbnQuZW1pdChrZXkgIT0gbnVsbCA/IFtkYXRhXSA6IFtdKTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICByZWZyZXNoU3RhdHVzKGV2ZW50OiBib29sZWFuID0gZmFsc2UsIGRhdGE6IGFueSA9IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RUeXBlID09PSBcInJhZGlvXCIpIHtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIHRoaXMub25SYWRpb1NlbGVjdChldmVudCwgZGF0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChkYXRhKSB7XG4gICAgICAvLyDnpoHnlKjooYzkuI3lhYHorrjli77pgInvvJvlj5bmtojli77pgInku43lhYHorrjvvIjkvovlpoLmlbDmja7lj5jmm7TliY3lt7Lli77pgInvvIlcbiAgICAgIGlmIChldmVudCAmJiB0aGlzLmlzU2VsZWN0RGlzYWJsZWQoZGF0YSkpIHtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubWFwT2ZDaGVja2VkSWRbZGF0YVt0aGlzLnNlbGVjdEZpZWxkXV0gPSBldmVudDtcbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICAhdGhpcy5tYXBPZkNoZWNrTGlzdFtkYXRhW3RoaXMuc2VsZWN0RmllbGRdXSAmJlxuICAgICAgICAgICh0aGlzLm1hcE9mQ2hlY2tMaXN0W2RhdGFbdGhpcy5zZWxlY3RGaWVsZF1dID0gZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1hcE9mQ2hlY2tMaXN0W2RhdGFbdGhpcy5zZWxlY3RGaWVsZF1dICYmXG4gICAgICAgICAgZGVsZXRlIHRoaXMubWFwT2ZDaGVja0xpc3RbZGF0YVt0aGlzLnNlbGVjdEZpZWxkXV07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGFibGVMaXN0ID0gdGhpcy5saXN0T2ZEaXNwbGF5RGF0YS5maWx0ZXIoXG4gICAgICAoaXRlbSkgPT4gIXRoaXMuaXNTZWxlY3REaXNhYmxlZChpdGVtKSxcbiAgICApO1xuICAgIHRoaXMuaXNBbGxEaXNwbGF5RGF0YUNoZWNrZWQgPVxuICAgICAgc2VsZWN0YWJsZUxpc3QubGVuZ3RoID4gMCAmJlxuICAgICAgc2VsZWN0YWJsZUxpc3QuZXZlcnkoXG4gICAgICAgIChpdGVtKSA9PiB0aGlzLm1hcE9mQ2hlY2tlZElkW2l0ZW1bdGhpcy5zZWxlY3RGaWVsZF1dLFxuICAgICAgKTtcbiAgICB0aGlzLmlzSW5kZXRlcm1pbmF0ZSA9XG4gICAgICBzZWxlY3RhYmxlTGlzdC5zb21lKFxuICAgICAgICAoaXRlbSkgPT4gdGhpcy5tYXBPZkNoZWNrZWRJZFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXSxcbiAgICAgICkgJiYgIXRoaXMuaXNBbGxEaXNwbGF5RGF0YUNoZWNrZWQ7XG4gICAgLy8g6Kem5Y+Rc2VsZWN05LqL5Lu2XG4gICAgaWYgKHRoaXMuc2VsZWN0RXZlbnQpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkTGlzdDogQXJyYXk8YW55PiA9IE9iamVjdC52YWx1ZXModGhpcy5tYXBPZkNoZWNrTGlzdCk7XG4gICAgICB0aGlzLnNlbGVjdEV2ZW50LmVtaXQoc2VsZWN0ZWRMaXN0KTtcbiAgICB9XG4gICAgLy8g5aaC5p6c5pWw5o2u5Li656m677yM5YiZ5riF56m65Yu+6YCJ5qCH6K+GXG4gICAgaWYgKHRoaXMudGFibGVEYXRhLmNvbnRlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmlzQWxsRGlzcGxheURhdGFDaGVja2VkID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgY2hlY2tBbGwodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RPZkRpc3BsYXlEYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIC8vIOWFqOmAiS/lj5bmtojlhajpgInlnYfot7Pov4fnpoHnlKjooYzvvIjnpoHnlKjooYzkv53mjIHljp/li77pgInnirbmgIHvvIlcbiAgICAgIGlmICh0aGlzLmlzU2VsZWN0RGlzYWJsZWQoaXRlbSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICF0aGlzLm1hcE9mQ2hlY2tMaXN0W2l0ZW1bdGhpcy5zZWxlY3RGaWVsZF1dICYmXG4gICAgICAgICAgKHRoaXMubWFwT2ZDaGVja0xpc3RbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0gPSBpdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWFwT2ZDaGVja0xpc3RbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0gJiZcbiAgICAgICAgICBkZWxldGUgdGhpcy5tYXBPZkNoZWNrTGlzdFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5tYXBPZkNoZWNrZWRJZFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXSA9IHZhbHVlO1xuICAgIH0pO1xuICAgIHRoaXMucmVmcmVzaFN0YXR1cygpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIOW9k+WJjeihjOaYr+WQpuemgeeUqOWLvumAiSAqL1xuICBpc1NlbGVjdERpc2FibGVkKGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIHRoaXMuc2VsZWN0RGlzYWJsZWRGaWVsZCAmJlxuICAgICAgZGF0YSAmJlxuICAgICAgZGF0YVt0aGlzLnNlbGVjdERpc2FibGVkRmllbGRdID09PSB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIC8qKiDlvZPliY3ooYzmmK/lkKblpLHmlYggKi9cbiAgaXNJbnZhbGlkUm93KGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIHRoaXMucm93SW52YWxpZEZpZWxkICYmXG4gICAgICBkYXRhICYmXG4gICAgICBkYXRhW3RoaXMucm93SW52YWxpZEZpZWxkXSA9PT0gdHJ1ZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog5YiX5paH5a2X6aKc6Imy77yaY29sb3Ig5Li65Ye95pWw5pe25oyJ6KGM6K6h566X77yI55So5LqO5p+Q5LiA6KGM5p+Q5LiA5YiX5qCH57qi77yJ77yM5ZCm5YiZ5pW05YiX5ZCM6Imy44CCXG4gICAqL1xuICByZXNvbHZlQ2VsbENvbG9yKGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoIWNvbCB8fCBjb2wuY29sb3IgPT0gbnVsbCB8fCBjb2wuY29sb3IgPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbC5jb2xvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbC5jb2xvcihkYXRhKTtcbiAgICAgIHJldHVybiB2YWx1ZSB8fCBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY29sLmNvbG9yO1xuICB9XG5cbiAgLyoqIOWPr+eCueWHu+WNleWFg+agvOminOiJsu+8muepuuWAvOWbuuWumueBsO+8jOWQpuWImeaMieWIlyBjb2xvciAqL1xuICBnZXRMaW5rQ2VsbENvbG9yKGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55LCBpc0VtcHR5OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBpZiAoaXNFbXB0eSkge1xuICAgICAgcmV0dXJuIFwiIzJBMzYzNFwiO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlQ2VsbENvbG9yKGNvbCwgZGF0YSk7XG4gIH1cblxuICAvKiog5pmu6YCa5paH5pys5Y2V5YWD5qC86aKc6Imy77ya5aSx5pWI6KGM57uf5LiA54Gw77yM5ZCm5YiZ55So5YiX6YWN572uIGNvbG9yICovXG4gIGdldFBsYWluQ2VsbENvbG9yKGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5pc0ludmFsaWRSb3coZGF0YSkpIHtcbiAgICAgIHJldHVybiBcIiM4NjhBOUNcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZUNlbGxDb2xvcihjb2wsIGRhdGEpO1xuICB9XG5cbiAganVkZ2VDb2xFbXB0eShzdHI6IGFueSkge1xuICAgIGlmIChzdHIgfHwgc3RyID09PSAwKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCI856m6PlwiO1xuICAgIH1cbiAgfVxuXG4gIGdldFN0YXRlRmllbGQoY29sOiBIZFRhYmxlQ29sdW1uKTogc3RyaW5nIHtcbiAgICBpZiAoY29sLmlzU3RhdGUpIHtcbiAgICAgIHJldHVybiBjb2wubmFtZSBhcyBzdHJpbmc7XG4gICAgfVxuICAgIHJldHVybiBjb2wuc3RhdGVGaWVsZCB8fCBcInN0YXRlXCI7XG4gIH1cblxuICAvKiog5a2X5q615YC85ZCO5piv5ZCm5bGV56S656uW57q/6KGM5Y+3ICovXG4gIGhhc1Jvd05vKGNvbDogSGRUYWJsZUNvbHVtbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIGNvbCAmJlxuICAgICAgKGNvbC5yb3dObyA9PT0gdHJ1ZSB8fCAodHlwZW9mIGNvbC5yb3dObyA9PT0gXCJzdHJpbmdcIiAmJiBjb2wucm93Tm8pKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog6KGM5Y+35paH5qGI44CCcm93Tm8g5Li65a2X5q615ZCN5pe25Y+W6KGM5pWw5o2u77yb5Li6IHRydWUg5pe25oyJ5b2T5YmN6aG15bqP5Y+377yI6Leo6aG16L+e57ut77yM5LuOIDEg5byA5aeL77yJ44CCXG4gICAqL1xuICBnZXRSb3dOb1RleHQoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnksIGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5oYXNSb3dObyhjb2wpKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb2wucm93Tm8gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZGF0YSA/IGRhdGFbY29sLnJvd05vXSA6IG51bGw7XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCBwYWdlID1cbiAgICAgIE51bWJlcih0aGlzLnRhYmxlUGFnZUluZGV4KSA+IDAgPyBOdW1iZXIodGhpcy50YWJsZVBhZ2VJbmRleCkgOiAxO1xuICAgIGNvbnN0IHNpemUgPVxuICAgICAgTnVtYmVyKHRoaXMudGFibGVQYWdlU2l6ZSkgPiAwID8gTnVtYmVyKHRoaXMudGFibGVQYWdlU2l6ZSkgOiAwO1xuICAgIGNvbnN0IHJvd0luZGV4ID0gTnVtYmVyKGluZGV4KSA+PSAwID8gTnVtYmVyKGluZGV4KSA6IDA7XG4gICAgcmV0dXJuIFN0cmluZygocGFnZSAtIDEpICogc2l6ZSArIHJvd0luZGV4ICsgMSk7XG4gIH1cblxuICAvKiog6KGo5aS044CM6YWN6YCB5Y2V5Y+3IHwg6KGM44CN5ouG5oiQ55+t56uW57q/77yM6YG/5YWN5a2X56ymIHwg5ouJ5ruh6KGM6auYICovXG4gIGdldFRpdGxlUGFydHMoY29sOiBIZFRhYmxlQ29sdW1uKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaGFzUm93Tm8oY29sKSB8fFxuICAgICAgIWNvbCB8fFxuICAgICAgIWNvbC50aXRsZSB8fFxuICAgICAgU3RyaW5nKGNvbC50aXRsZSkuaW5kZXhPZihcInxcIikgPCAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmF3ID0gU3RyaW5nKGNvbC50aXRsZSkuc3BsaXQoXCJ8XCIpO1xuICAgIGlmIChyYXcubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBbcmF3WzBdLnRyaW0oKSwgcmF3LnNsaWNlKDEpLmpvaW4oXCJ8XCIpLnRyaW0oKV07XG4gIH1cblxuICAvKiog5piv5ZCm5pi+56S657yW6L6R56yU5Zu+5qCH77yI5pyJIGVkaXRUeXBlIOaXtui1sOihjOWGheaOp+S7tu+8jOS4jeWGjeaYvuekuueslO+8iSAqL1xuICBpc0VkaXRhYmxlKGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFjb2wgfHwgdGhpcy5oYXNJbmxpbmVFZGl0KGNvbCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbC5lZGl0YWJsZSA9PSBudWxsIHx8IGNvbC5lZGl0YWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb2wuZWRpdGFibGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuICEhY29sLmVkaXRhYmxlKGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gISFjb2wuZWRpdGFibGU7XG4gIH1cblxuICAvKiog54K55Ye757yW6L6R56yU77yM5Zue6LCD54i257uE5Lu25Lyg5YWl55qEIGVkaXQgKi9cbiAgb25FZGl0Q2xpY2soZXZlbnQ6IEV2ZW50LCBjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IHZvaWQge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLnRyaWdnZXJFdmVudChjb2wuZWRpdCB8fCBudWxsLCBkYXRhKTtcbiAgfVxuXG4gIC8qKiDliJfmmK/lkKbphY3nva7kuoblj6/nlKjnmoTooYzlhoXnvJbovpHvvIhuYW1lIOW/hemhu+aYryBzdHJpbmfvvIkgKi9cbiAgaGFzSW5saW5lRWRpdChjb2w6IEhkVGFibGVDb2x1bW4pOiBib29sZWFuIHtcbiAgICBpZiAoIWNvbCB8fCAhY29sLmVkaXRUeXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29sLm5hbWUgIT09IFwic3RyaW5nXCIgfHwgIWNvbC5uYW1lKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiW2hkLXRhYmxlXSBlZGl0VHlwZSDopoHmsYIgbmFtZSDkuLogc3RyaW5n77yM5YiX44CMXCIgK1xuICAgICAgICAgIChjb2wudGl0bGUgfHwgXCJcIikgK1xuICAgICAgICAgIFwi44CN5bey5Zue6YCA5Y+q6K+7XCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlzRWRpdERpc2FibGVkKGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFjb2wgfHwgY29sLmVkaXREaXNhYmxlZCA9PSBudWxsIHx8IGNvbC5lZGl0RGlzYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29sLmVkaXREaXNhYmxlZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gISFjb2wuZWRpdERpc2FibGVkKGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gISFjb2wuZWRpdERpc2FibGVkO1xuICB9XG5cbiAgZ2V0U2VsZWN0TGlzdChjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IEFycmF5PGFueT4ge1xuICAgIGlmICghY29sIHx8ICFjb2wuc2VsZWN0T3B0aW9uKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IG9wdCA9IGNvbC5zZWxlY3RPcHRpb247XG4gICAgaWYgKG9wdC5zZWxlY3RMaXN0TmFtZSAmJiBkYXRhKSB7XG4gICAgICBjb25zdCBsaXN0ID0gZGF0YVtvcHQuc2VsZWN0TGlzdE5hbWVdO1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkobGlzdCkgPyBsaXN0IDogW107XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9wdC5zZWxlY3RMaXN0KSA/IG9wdC5zZWxlY3RMaXN0IDogW107XG4gIH1cblxuICBnZXRTZWxlY3RPcHRpb25MYWJlbChjb2w6IEhkVGFibGVDb2x1bW4sIGl0ZW06IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5zZWxlY3RPcHRpb24gfHwgIWl0ZW0pIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBjb25zdCBvcHQgPSBjb2wuc2VsZWN0T3B0aW9uO1xuICAgIGNvbnN0IHZhbHVlID0gaXRlbVtvcHQudmFsdWVdO1xuICAgIGNvbnN0IGxhYmVsID0gaXRlbVtvcHQubGFiZWxdO1xuICAgIGlmIChvcHQuc2hvd0xhYmVsQW5kVmFsdWUgfHwgb3B0LmhkU2hvd0l0ZW1Db2RlKSB7XG4gICAgICByZXR1cm4gYFske3ZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWV9XSR7bGFiZWwgPT0gbnVsbCA/IFwiXCIgOiBsYWJlbH1gO1xuICAgIH1cbiAgICByZXR1cm4gbGFiZWwgPT0gbnVsbCA/IFwiXCIgOiBTdHJpbmcobGFiZWwpO1xuICB9XG5cbiAgZ2V0SW5wdXROdW1iZXJQcm9wKFxuICAgIGNvbDogSGRUYWJsZUNvbHVtbixcbiAgICBrZXk6IFwibWluXCIgfCBcIm1heFwiIHwgXCJzdGVwXCIgfCBcInByZWNpc2lvblwiLFxuICAgIGZhbGxiYWNrOiBudW1iZXIsXG4gICk6IG51bWJlciB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5pbnB1dE51bWJlcikge1xuICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgIH1cbiAgICBjb25zdCB2YWwgPSBjb2wuaW5wdXROdW1iZXJba2V5XTtcbiAgICByZXR1cm4gdmFsICE9IG51bGwgPyBOdW1iZXIodmFsKSA6IGZhbGxiYWNrO1xuICB9XG5cbiAgaXNEYXRlU2hvd1RpbWUoY29sOiBIZFRhYmxlQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKGNvbCAmJiBjb2wuZGF0ZU9wdGlvbiAmJiBjb2wuZGF0ZU9wdGlvbi5zaG93VGltZSk7XG4gIH1cblxuICBpc0RhdGVTaG93VG9kYXkoY29sOiBIZFRhYmxlQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5kYXRlT3B0aW9uIHx8IGNvbC5kYXRlT3B0aW9uLnNob3dUb2RheSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbC5kYXRlT3B0aW9uLnNob3dUb2RheSAhPT0gZmFsc2U7XG4gIH1cblxuICBnZXREYXRlRm9ybWF0KGNvbDogSGRUYWJsZUNvbHVtbiwgaXNSYW5nZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgaWYgKGNvbCAmJiBjb2wuZGF0ZU9wdGlvbiAmJiBjb2wuZGF0ZU9wdGlvbi5mb3JtYXQpIHtcbiAgICAgIHJldHVybiBjb2wuZGF0ZU9wdGlvbi5mb3JtYXQ7XG4gICAgfVxuICAgIGlmICghaXNSYW5nZSAmJiB0aGlzLmlzRGF0ZVNob3dUaW1lKGNvbCkpIHtcbiAgICAgIHJldHVybiBcInl5eXktTU0tZGQgSEg6bW06c3NcIjtcbiAgICB9XG4gICAgcmV0dXJuIFwieXl5eS1NTS1kZFwiO1xuICB9XG5cbiAgZ2V0RGlzYWJsZWREYXRlKGNvbDogSGRUYWJsZUNvbHVtbik6IChjdXJyZW50OiBEYXRlKSA9PiBib29sZWFuIHtcbiAgICBpZiAoY29sICYmIGNvbC5kYXRlT3B0aW9uICYmIGNvbC5kYXRlT3B0aW9uLmRpc2FibGVkRGF0ZSkge1xuICAgICAgcmV0dXJuIGNvbC5kYXRlT3B0aW9uLmRpc2FibGVkRGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICB9XG5cbiAgZ2V0UmFuZ2VQbGFjZWhvbGRlcihjb2w6IEhkVGFibGVDb2x1bW4pOiBBcnJheTxzdHJpbmc+IHtcbiAgICBjb25zdCBwbGFjZWhvbGRlciA9XG4gICAgICBjb2wgJiYgY29sLmRhdGVPcHRpb24gPyBjb2wuZGF0ZU9wdGlvbi5yYW5nZVBsYWNlaG9sZGVyIDogbnVsbDtcbiAgICBpZiAocGxhY2Vob2xkZXIgJiYgcGxhY2Vob2xkZXIubGVuZ3RoID49IDIpIHtcbiAgICAgIHJldHVybiBbcGxhY2Vob2xkZXJbMF0sIHBsYWNlaG9sZGVyWzFdXTtcbiAgICB9XG4gICAgcmV0dXJuIFtcIuW8gOWni+aXpeacn1wiLCBcIue7k+adn+aXpeacn1wiXTtcbiAgfVxuXG4gIC8qKiBJbnB1dCAvIElucHV0TnVtYmVyIC8g5pel5pyf5Y+Y5pu077ya5YWI6K6w5pen5YC85YaN5YaZ5Zue5bm26YCa55+l54i257uE5Lu2ICovXG4gIG9uQ2VsbENoYW5nZShjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNJbmxpbmVFZGl0KGNvbCkgfHwgIWRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IGNvbC5uYW1lIGFzIHN0cmluZztcbiAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gZGF0YVtuYW1lXTtcbiAgICBkYXRhW25hbWVdID0gdmFsdWU7XG4gICAgdGhpcy5jZWxsQ2hhbmdlLmVtaXQoe1xuICAgICAgbGluZTogZGF0YSxcbiAgICAgIGNvbCxcbiAgICAgIG5hbWUsXG4gICAgICB2YWx1ZSxcbiAgICAgIHByZXZpb3VzVmFsdWUsXG4gICAgfSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IOWxleW8gO+8muaciSBvbk9wZW5DaGFuZ2VFdmVudCDml7blsZXlvIDlhYjmuIXnqbrpgInpobnlho3lm57osIMgKG9wZW4sIGxpbmUp77yb5YWz6Zet5LiN5Zue6LCD5Lia5Yqh44CCXG4gICAqIOWbnuiwg+iLpSByZXR1cm4g5pWw57uEIC8gUHJvbWlzZSAvIE9ic2VydmFibGXvvIznlLHnu4Tku7blhpnlm54gb3B0aW9ucyDlubYgbWFya0ZvckNoZWNr44CCXG4gICAqL1xuICBvblNlbGVjdE9wZW5DaGFuZ2UoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnksIG9wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIWNvbCB8fCAhY29sLm9uT3BlbkNoYW5nZUV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChvcGVuKSB7XG4gICAgICB0aGlzLmNsZWFyU2VsZWN0T3B0aW9uc09uT3Blbihjb2wsIGRhdGEpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICAgIGNvbnN0IGZuID0gY29sLm9uT3BlbkNoYW5nZUV2ZW50O1xuICAgIGNvbnN0IGRlYm91bmNlTXMgPVxuICAgICAgY29sLm9uT3BlbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lICE9IG51bGxcbiAgICAgICAgPyBjb2wub25PcGVuQ2hhbmdlRXZlbnREZWJvdW5jZVRpbWVcbiAgICAgICAgOiAwO1xuICAgIGlmICghZGVib3VuY2VNcykge1xuICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgdGhpcy5oYW5kbGVTZWxlY3RMb2FkZXJSZXN1bHQoY29sLCBkYXRhLCBmbihvcGVuLCBkYXRhKSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdE9wZW5DaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc2VsZWN0T3BlbkNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdE9wZW5DaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLnNlbGVjdE9wZW5DaGFuZ2VTdWJqZWN0XG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoZGVib3VuY2VNcykpXG4gICAgICAuc3Vic2NyaWJlKCh7IGZuOiBjYiwgb3BlbjogbywgbGluZSwgY29sOiBjIH0pID0+IHtcbiAgICAgICAgaWYgKG8pIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdExvYWRlclJlc3VsdChjLCBsaW5lLCBjYihvLCBsaW5lKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHRoaXMuc2VsZWN0T3BlbkNoYW5nZVN1YmplY3QubmV4dCh7IGZuLCBvcGVuLCBsaW5lOiBkYXRhLCBjb2wgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IOaQnOe0ou+8muaciSBvblNlYXJjaEV2ZW50IOaXtuWbnuiwgyAoa2V5d29yZCwgbGluZSnvvIzkuI3muIXnqbogb3B0aW9uc+OAglxuICAgKiDlm57osIPoi6UgcmV0dXJuIOaVsOe7hCAvIFByb21pc2UgLyBPYnNlcnZhYmxl77yM55Sx57uE5Lu25YaZ5ZueIG9wdGlvbnMg5bm2IG1hcmtGb3JDaGVja+OAglxuICAgKi9cbiAgb25TZWxlY3RTZWFyY2goY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnksIGtleXdvcmQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghY29sIHx8ICFjb2wub25TZWFyY2hFdmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmbiA9IGNvbC5vblNlYXJjaEV2ZW50O1xuICAgIGNvbnN0IGRlYm91bmNlTXMgPVxuICAgICAgY29sLm9uU2VhcmNoRXZlbnRFdmVudERlYm91bmNlVGltZSAhPSBudWxsXG4gICAgICAgID8gY29sLm9uU2VhcmNoRXZlbnRFdmVudERlYm91bmNlVGltZVxuICAgICAgICA6IDA7XG4gICAgaWYgKCFkZWJvdW5jZU1zKSB7XG4gICAgICB0aGlzLmhhbmRsZVNlbGVjdExvYWRlclJlc3VsdChjb2wsIGRhdGEsIGZuKGtleXdvcmQsIGRhdGEpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0U2VhcmNoU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdFNlYXJjaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdFNlYXJjaFN1YnNjcmlwdGlvbiA9IHRoaXMuc2VsZWN0U2VhcmNoU3ViamVjdFxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKGRlYm91bmNlTXMpKVxuICAgICAgLnN1YnNjcmliZSgoeyBmbjogY2IsIGtleXdvcmQ6IGt3LCBsaW5lLCBjb2w6IGMgfSkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdExvYWRlclJlc3VsdChjLCBsaW5lLCBjYihrdywgbGluZSkpO1xuICAgICAgfSk7XG4gICAgdGhpcy5zZWxlY3RTZWFyY2hTdWJqZWN0Lm5leHQoeyBmbiwga2V5d29yZCwgbGluZTogZGF0YSwgY29sIH0pO1xuICB9XG5cbiAgLyoqIOWxleW8gOaXtua4heepuuWIlyBzZWxlY3RMaXN0IOaIluihjOS4iiBzZWxlY3RMaXN0TmFtZe+8jOeUseS4muWKoeWbnuiwg+WGjeWGmeWFpSAqL1xuICBwcml2YXRlIGNsZWFyU2VsZWN0T3B0aW9uc09uT3Blbihjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IHZvaWQge1xuICAgIGlmICghY29sIHx8ICFjb2wuc2VsZWN0T3B0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG9wdCA9IGNvbC5zZWxlY3RPcHRpb247XG4gICAgaWYgKG9wdC5zZWxlY3RMaXN0ICE9IG51bGwpIHtcbiAgICAgIG9wdC5zZWxlY3RMaXN0ID0gW107XG4gICAgfVxuICAgIGlmIChvcHQuc2VsZWN0TGlzdE5hbWUgJiYgZGF0YSkge1xuICAgICAgZGF0YVtvcHQuc2VsZWN0TGlzdE5hbWVdID0gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWkhOeQhuWKoOi9veWbnuiwg+i/lOWbnuWAvO+8muaVsOe7hOebtOaOpeWGmeWbnu+8m1Byb21pc2UvT2JzZXJ2YWJsZSDlrozmiJDlkI7lhpnlm57vvJt2b2lkIOS7hSBtYXJrRm9yQ2hlY2vjgIJcbiAgICog5LyY5YWI5YaZIHNlbGVjdExpc3ROYW1l77yM5ZCm5YiZ5YaZ5YiX5LiKIHNlbGVjdExpc3TjgIJcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlU2VsZWN0TG9hZGVyUmVzdWx0KFxuICAgIGNvbDogSGRUYWJsZUNvbHVtbixcbiAgICBkYXRhOiBhbnksXG4gICAgcmVzdWx0OiBhbnksXG4gICk6IHZvaWQge1xuICAgIGlmIChyZXN1bHQgPT0gbnVsbCkge1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgIHRoaXMuYXBwbHlTZWxlY3RPcHRpb25zKGNvbCwgZGF0YSwgcmVzdWx0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZXN1bHQudGhlbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXN1bHQudGhlbihcbiAgICAgICAgKGxpc3Q6IGFueSkgPT4gdGhpcy5hcHBseVNlbGVjdE9wdGlvbnMoY29sLCBkYXRhLCBsaXN0KSxcbiAgICAgICAgKCkgPT4gdGhpcy5jZHIubWFya0ZvckNoZWNrKCksXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlc3VsdC5zdWJzY3JpYmUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0TG9hZGVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0TG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlbGVjdExvYWRlclN1YnNjcmlwdGlvbiA9IHJlc3VsdC5zdWJzY3JpYmUoXG4gICAgICAgIChsaXN0OiBhbnkpID0+IHRoaXMuYXBwbHlTZWxlY3RPcHRpb25zKGNvbCwgZGF0YSwgbGlzdCksXG4gICAgICAgICgpID0+IHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5U2VsZWN0T3B0aW9ucyhjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSwgbGlzdDogYW55KTogdm9pZCB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5zZWxlY3RPcHRpb24gfHwgIUFycmF5LmlzQXJyYXkobGlzdCkpIHtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcHQgPSBjb2wuc2VsZWN0T3B0aW9uO1xuICAgIGlmIChvcHQuc2VsZWN0TGlzdE5hbWUgJiYgZGF0YSkge1xuICAgICAgZGF0YVtvcHQuc2VsZWN0TGlzdE5hbWVdID0gbGlzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0LnNlbGVjdExpc3QgPSBsaXN0O1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBTZWxlY3Qg5Y+Y5pu077ya5Y+M5YaZIHZhbHVlICsgbGFiZWzvvIzlubbluKYgcHJldmlvdXMqIC8gb3B0aW9uICovXG4gIG9uU2VsZWN0Q2hhbmdlKGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55LCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc0lubGluZUVkaXQoY29sKSB8fCAhZGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gY29sLm5hbWUgYXMgc3RyaW5nO1xuICAgIGNvbnN0IG9wdCA9IGNvbC5zZWxlY3RPcHRpb247XG4gICAgY29uc3QgbGFiZWxGaWVsZCA9IG9wdCAmJiBvcHQubGFiZWwgPyBvcHQubGFiZWwgOiBudWxsO1xuICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBkYXRhW25hbWVdO1xuICAgIGNvbnN0IHByZXZpb3VzTGFiZWwgPSBsYWJlbEZpZWxkID8gZGF0YVtsYWJlbEZpZWxkXSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5nZXRTZWxlY3RMaXN0KGNvbCwgZGF0YSk7XG4gICAgY29uc3QgcHJldmlvdXNPcHRpb24gPVxuICAgICAgcHJldmlvdXNWYWx1ZSA9PSBudWxsIHx8ICFvcHRcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDogbGlzdC5maW5kKChpdGVtKSA9PiBpdGVtICYmIGl0ZW1bb3B0LnZhbHVlXSA9PT0gcHJldmlvdXNWYWx1ZSkgfHxcbiAgICAgICAgICBudWxsO1xuICAgIGNvbnN0IG9wdGlvbiA9XG4gICAgICB2YWx1ZSA9PSBudWxsIHx8ICFvcHRcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDogbGlzdC5maW5kKChpdGVtKSA9PiBpdGVtICYmIGl0ZW1bb3B0LnZhbHVlXSA9PT0gdmFsdWUpIHx8IG51bGw7XG5cbiAgICBkYXRhW25hbWVdID0gdmFsdWU7XG4gICAgbGV0IGxhYmVsOiBhbnkgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGxhYmVsRmllbGQpIHtcbiAgICAgIGxhYmVsID0gb3B0aW9uID8gb3B0aW9uW29wdC5sYWJlbF0gOiBudWxsO1xuICAgICAgZGF0YVtsYWJlbEZpZWxkXSA9IGxhYmVsO1xuICAgIH1cblxuICAgIHRoaXMuY2VsbENoYW5nZS5lbWl0KHtcbiAgICAgIGxpbmU6IGRhdGEsXG4gICAgICBjb2wsXG4gICAgICBuYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBwcmV2aW91c1ZhbHVlLFxuICAgICAgbGFiZWwsXG4gICAgICBwcmV2aW91c0xhYmVsLFxuICAgICAgb3B0aW9uLFxuICAgICAgcHJldmlvdXNPcHRpb24sXG4gICAgfSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiJdfQ==
3337
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZmFudGFzeS1uZ3pvcnJvLyIsInNvdXJjZXMiOlsiaGQtdGFibGUvaGQtdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEtBQUssV0FBVyxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsWUFBWSxHQUdiLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RSxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLHFCQUFxQixHQUN0QixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFJTCxnQkFBZ0IsRUFDaEIsUUFBUSxHQUNULE1BQU0sb0JBQW9CLENBQUM7Ozs7O01BR3RCLGdCQUFnQixHQUFHLEVBQUU7Ozs7O0FBRzNCLHNDQVNDOzs7Ozs7SUFQQywwQ0FBdUI7Ozs7O0lBRXZCLDZDQUFtQjs7Ozs7SUFFbkIsK0NBQXFCOzs7OztJQUVyQiwwQ0FBaUI7Ozs7Ozs7QUFJbkIsU0FBUyxXQUFXLENB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O0lBQ0wsb0RBQTJEOzs7Ozs7SUFFM0Qsb0RBQTJEOzs7Ozs7SUEwUTNELDhDQUFpQzs7SUF5SWpDLHNDQUdFOzs7OztJQUdGLDZDQUFxRDs7SUFFckQsc0NBRUU7O0lBcVlGLHNDQWdDRTs7Ozs7SUEvekJBLGtDQUEwQjs7Ozs7SUFDMUIsK0JBQThCOzs7OztJQUM5QixnREFBa0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2UsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgKiBhcyBsb2NhbGZvcmFnZSBmcm9tIFwibG9jYWxmb3JhZ2VcIjtcbmltcG9ydCB7XG4gIElucHV0Qm9vbGVhbixcbiAgTnpGb3JtYXRCZWZvcmVEcm9wRXZlbnQsXG4gIE56Rm9ybWF0RW1pdEV2ZW50LFxufSBmcm9tIFwibmctem9ycm8tYW50ZC9jb3JlXCI7XG5pbXBvcnQgeyBOelJlc2l6ZUV2ZW50IH0gZnJvbSBcIm5nLXpvcnJvLWFudGQvcmVzaXphYmxlXCI7XG5pbXBvcnQgeyBOelRhYmxlQ29tcG9uZW50IH0gZnJvbSBcIm5nLXpvcnJvLWFudGQvdGFibGVcIjtcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkZWxheSB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgVG90YWxPcHRpb24gfSBmcm9tIFwiLi4vaGQtZGV0YWlsLWxpbmVzL2hkLWRldGFpbC1saW5lcy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBDb2xXaWR0aCB9IGZyb20gXCIuLi9tb2RlbC9jb2xXaWR0aFwiO1xuaW1wb3J0IHsgUGFnZSB9IGZyb20gXCIuLi9tb2RlbC9jb21tb24tdHlwZVwiO1xuaW1wb3J0IHsgQ29tbW9uU2Vzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZS9jb21tb24tc2Vzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQge1xuICBnZXRUYWJsZVNjcm9sbFhWaWV3cG9ydFdpZHRoLFxuICBnZXRUYWJsZVZpZXdwb3J0V2lkdGgsXG59IGZyb20gXCIuLi91dGlscy9oZC10YWJsZS1zY3JvbGwudXRpbFwiO1xuaW1wb3J0IHtcbiAgSGRUYWJsZUNlbGxDaGFuZ2UsXG4gIEhkVGFibGVDb2x1bW4sXG4gIE9wZXJhdGVCdG4sXG4gIFRhYmxlQ2FjaGVPcHRpb24sXG4gIFRyZWVHcmlkLFxufSBmcm9tIFwiLi9oZC10YWJsZS5zZXJ2aWNlXCI7XG5cbi8qKiDli77pgInliJflrr3vvIhweO+8ie+8jOS4juaooeadvyBueldpZHRo44CBbGVzcyDlhZzlupXkv53mjIHkuIDoh7QgKi9cbmNvbnN0IFNFTEVDVF9DT0xfV0lEVEggPSA0MDtcblxuLyoqIOaoquWQkeW4g+WxgOiuoeeul+e7k+aenCAqL1xuaW50ZXJmYWNlIEhkVGFibGVIb3Jpem9udGFsTGF5b3V0IHtcbiAgLyoqIOS8oOe7mSBuelNjcm9sbC5477yb5Y+q5pyJ5YiX5a695oC75ZKMIDw9IDAg5pe25Li6IG51bGwgKi9cbiAgc2Nyb2xsWDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIOaMieWjsOaYjuWuveavlOS+i+WIhue7meWQhOS4muWKoeWIl+eahOaAu+ihpeWuve+8jOWIl+WkmuaXtuS4uiAwICovXG4gIGZsdWlkRXh0cmE6IG51bWJlcjtcbiAgLyoqIOWunumZhea4suafk+aAu+WuvSA9IOWjsOaYjuaAu+WuvSArIGZsdWlkRXh0cmEgKi9cbiAgZGlzcGxheVRvdGFsOiBudW1iZXI7XG4gIC8qKiDliJflsJHjgIHpnaDooaXlrr3lkIPmu6HlrrnlmajvvIzkuI3pnIDopoHnnJ/mraPmqKrmu5ogKi9cbiAgaXNGbHVpZDogYm9vbGVhbjtcbn1cblxuLyoqIOWIl+Wkmu+8iOaIlumHj+S4jeWIsOWuueWZqOWuve+8ie+8mnNjcm9sbC54ID0g5aOw5piO5oC75a6977yM5q2j5bi45qiq5ruaICovXG5mdW5jdGlvbiBmaXhlZExheW91dChkZWNsYXJlZFdpZHRoOiBudW1iZXIpOiBIZFRhYmxlSG9yaXpvbnRhbExheW91dCB7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsWDogYCR7TWF0aC5jZWlsKGRlY2xhcmVkV2lkdGgpfXB4YCxcbiAgICBmbHVpZEV4dHJhOiAwLFxuICAgIGRpc3BsYXlUb3RhbDogZGVjbGFyZWRXaWR0aCxcbiAgICBpc0ZsdWlkOiBmYWxzZSxcbiAgfTtcbn1cblxuLyoqIOWIl+Wwke+8mnNjcm9sbC54ID0g5a655Zmo5a6977yM5beu6aKd5oyJ5aOw5piO5a695q+U5L6L5YiG5Yiw5ZCE5Lia5Yqh5YiXICovXG5mdW5jdGlvbiBmbHVpZExheW91dChcbiAgY29udGFpbmVyV2lkdGg6IG51bWJlcixcbiAgZGVjbGFyZWRXaWR0aDogbnVtYmVyLFxuKTogSGRUYWJsZUhvcml6b250YWxMYXlvdXQge1xuICBjb25zdCBmbHVpZEV4dHJhID0gTWF0aC5tYXgoMCwgY29udGFpbmVyV2lkdGggLSBkZWNsYXJlZFdpZHRoKTtcbiAgcmV0dXJuIHtcbiAgICBzY3JvbGxYOiBgJHtjb250YWluZXJXaWR0aH1weGAsXG4gICAgZmx1aWRFeHRyYSxcbiAgICBkaXNwbGF5VG90YWw6IGRlY2xhcmVkV2lkdGggKyBmbHVpZEV4dHJhLFxuICAgIGlzRmx1aWQ6IHRydWUsXG4gIH07XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJoZC10YWJsZVwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2hkLXRhYmxlLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9oZC10YWJsZS5jb21wb25lbnQubGVzc1wiXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEhkVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHV1aWQ6IHN0cmluZztcbiAgQElucHV0KCkgdGFibGVDb2xzOiBBcnJheTxIZFRhYmxlQ29sdW1uPiA9IFtdO1xuICBASW5wdXQoKSB0YWJsZURhdGE6IFBhZ2U8YW55PjtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAvKipcbiAgICog5Yu+6YCJ5YiX5b2i5oCB44CCY2hlY2tib3jvvJrlpJrpgInvvIjpu5jorqTvvInvvJtyYWRpb++8muWNlemAie+8jOaXoOihqOWktOWFqOmAie+8jHNlbGVjdEV2ZW50IOS7jeWbnuS8oOaVsOe7hO+8iDAg5oiWIDEg5p2h77yJ44CCXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3RUeXBlOiBcImNoZWNrYm94XCIgfCBcInJhZGlvXCIgPSBcImNoZWNrYm94XCI7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93T3BlcmF0ZUNvbFdhcnBCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIOaYr+WQpuWxleekuuWIl+iuvue9ru+8iOm9v+i9ru+8ie+8jOm7mOiupOW8gOWQr++8m+W8ueeql+etieWcuuaZr+WPr+S8oCBmYWxzZSDlhbPpl60gKi9cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dDb2xTZXR0aW5nczogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSB2aXJ0dWFsU2Nyb2xsOiBib29sZWFuID0gdHJ1ZTtcbiAgLyoqIOaJi+WKqOaMh+WumuihjOmrmO+8m+S4jeS8oOWImeWcqOmmluWxj+a4suafk+WQjuiHquWKqOa1i+mHjyAqL1xuICBASW5wdXQoKSB2aXJ0dWFsSXRlbVNpemU6IG51bWJlcjtcbiAgQElucHV0KCkgc2VsZWN0RmllbGQ6IHN0cmluZyA9IFwiYmlsbE51bWJlclwiO1xuICAvKipcbiAgICog6KGM5Yu+6YCJ56aB55So5a2X5q615ZCN44CC5a6a5LmJ5ZCO5Y+W5b2T5YmN6KGM6K+l5a2X5q6177yaXG4gICAqIOS4uiB0cnVlIOaXtuemgeeUqOivpeihjOWLvumAie+8iOWFqOmAieS5n+S8mui3s+i/h++8ieOAglxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0RGlzYWJsZWRGaWVsZDogc3RyaW5nO1xuICAvKipcbiAgICog6KGM5aSx5pWI5a2X5q615ZCN44CC5a6a5LmJ5ZCO5Y+W5b2T5YmN6KGM6K+l5a2X5q6177yaXG4gICAqIOS4uiB0cnVlIOaXtuaVtOihjOiDjOaZr+iJsuS4uiAjRjdGOEZB44CCXG4gICAqL1xuICBASW5wdXQoKSByb3dJbnZhbGlkRmllbGQ6IHN0cmluZztcbiAgLy8g5ZCI6K6h5Yy65Z+f77yI57G75Z6L5LiOIGhkLWRldGFpbC1saW5lcyDnmoQgVG90YWxPcHRpb24g5LiA6Ie077yJXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93VGFibGVUb3RhbDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB0YWJsZVRvdGFsT3B0aW9uOiBBcnJheTxUb3RhbE9wdGlvbj47XG4gIC8qKlxuICAgKiDlkIjorqHliJfmgLvmlbDvvIjlkKvluo/lj7fliJfvvIzkuI4gaGQtZGV0YWlsLWxpbmVzIOS4gOiHtO+8ie+8m1xuICAgKiDkuI3kvKDliJnmjInlvZPliY3lj6/op4HmlbDmja7liJfmlbAgKyAx77yI5bqP5Y+377yJ5o6o566X44CCXG4gICAqL1xuICBASW5wdXQoKSBjb2x1bW5zTnVtYmVyOiBudW1iZXIgfCBzdHJpbmc7XG4gIEBPdXRwdXQoKSBzb3J0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBzZWxlY3RFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHRhYmxlU2VhcmNoRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKiDooYzlhoXnvJbovpHlj5jmm7TvvIjlt7Llhpnlm57ooYzlr7nosaHvvJtwcmV2aW91cyog5L6b5o6l5Y+j5aSx6LSl5Zue5rua77yJICovXG4gIEBPdXRwdXQoKSBjZWxsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxIZFRhYmxlQ2VsbENoYW5nZT4oKTtcbiAgQElucHV0KCkgdGFibGVMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiDmmK/lkKbmmL7npLrliIbpobXvvJtmYWxzZSDml7bkuIDmrKHlsZXnpLogdGFibGVEYXRhLmNvbnRlbnQg5YWo6YOo6KGMICovXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBwYWdpbmF0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgLyoqXG4gICAqIOaYr+WQpuWJjeerr+WIhumhte+8iOWvuSBjb250ZW50IOWFqOmHj+WIh+eJh++8ieOAglxuICAgKiB0cnVl77ya57+76aG15LiN6Kem5Y+RIHRhYmxlU2VhcmNoRXZlbnTvvIzpgILlkIjor6bmg4Xlhajph4/mlbDmja7vvJtcbiAgICogZmFsc2XvvIjpu5jorqTvvInvvJrmnI3liqHnq6/liIbpobXvvIznv7vpobXop6blj5Hmn6Xor6LvvIjnjrDmnInliJfooajooYzkuLrvvInjgIJcbiAgICog5LiOIHBhZ2luYXRpb249ZmFsc2Ug5ZCM5pe255So5pe25Lul5LiN5YiG6aG15Li65YeG44CCXG4gICAqL1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgZnJvbnRQYWdpbmF0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIOihqOagvOWIhumhteWPguaVsFxuICBASW5wdXQoKSB0YWJsZVBhZ2VJbmRleDogbnVtYmVyID0gMTtcbiAgQElucHV0KCkgdGFibGVQYWdlU2l6ZTogbnVtYmVyID0gMTAwO1xuICBASW5wdXQoKSBpc0ZpcnN0RW50cnlTZWFyY2g6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGlzQ3Jvc3NQYWdlU2VsZWN0OiBib29sZWFuO1xuICBAT3V0cHV0KCkgdGFibGVQYWdlSW5kZXhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHRhYmxlUGFnZVNpemVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHRhYmxlUGFnZVNpemVDaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAQ29udGVudENoaWxkKFwidGFibGVUb3RhbFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgdGFibGVUb3RhbDogVGVtcGxhdGVSZWY8YW55PjtcbiAgQENvbnRlbnRDaGlsZChcInRhYmxlTGVmdEJ1dHRvblwiLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgdGFibGVMZWZ0QnV0dG9uOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKFwidGFibGVSaWdodEJ1dHRvblwiLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgdGFibGVSaWdodEJ1dHRvbjogVGVtcGxhdGVSZWY8YW55PjtcbiAgc2Nyb2xsID0gbnVsbDtcblxuICAvLyDooajmoLzli77pgInlj4LmlbBcbiAgaXNBbGxEaXNwbGF5RGF0YUNoZWNrZWQgPSBmYWxzZTtcbiAgaXNJbmRldGVybWluYXRlID0gZmFsc2U7XG4gIGxpc3RPZkRpc3BsYXlEYXRhID0gW107XG4gIGxpc3RPZkFsbERhdGEgPSBbXTtcbiAgbGlzdE9mU2VsZWN0aW9uOiBBcnJheTxhbnk+IHwgVGVtcGxhdGVSZWY8dm9pZD47XG4gIG1hcE9mQ2hlY2tlZElkOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuICBtYXBPZkNoZWNrTGlzdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAvLyDlkIjorqHlj4LmlbBcbiAgdGFibGVUb3RhbE9wdGlvbkxpc3QgPSBbXTtcbiAgLy8g57yT5a2Y5L+h5oGvXG4gIHRhYmxlQ2FjaGVPcHRpb246IFRhYmxlQ2FjaGVPcHRpb24gPSBuZXcgVGFibGVDYWNoZU9wdGlvbigpO1xuICB1c2VyU2Vzc2lvbjogYW55O1xuXG4gIHRhYmxlQ29sc0NhY2hlOiBBcnJheTxIZFRhYmxlQ29sdW1uPiA9IFtdO1xuICBzaG93VGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2VsZWN0Q29sTGlzdE5vZGVzOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgc2VsZWN0Q29sTGlzdE5vZGVzQ2FjaGU6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICBzaG93TGlzdE5vZGVzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgaXNEcm9wZG93blZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8g6K6+572u5YiX55qE5Y+v6KeB5pON5L2c5pWw57uEXG4gIG5vd0xpc3ROb2RlczogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gIC8vIOiuvue9ruWIl+eahOS4jeWPr+ingeaTjeS9nOaVsOe7hFxuICBoaWRlTGlzdE5vZGVzOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcblxuICAvLyDngrnlh7vml7bpnIDopoHmnInkuLTml7bmlbDnu4TlrZjmlL7kuKTkuKp0cmVlLOeUqOS6juWPlua2iOaXtuWAmeaBouWkjeiwg+aVtOWJjeeahOeKtuaAgVxuICBjYW5jZWxOb3dMaXN0Tm9kZXM6IEFycmF5PFRyZWVHcmlkPiA9IFtdO1xuICBjYW5jZWxIaWRlTGlzdE5vZGVzOiBBcnJheTxUcmVlR3JpZD4gPSBbXTtcbiAgc2hvd0RldGFpbDogYm9vbGVhbiA9IGZhbHNlO1xuICBsb2NhbGZvcmFnZTogYW55ID0gbnVsbDtcbiAgbG9jYWx0aW9uVG1wOiBzdHJpbmcgPSBcIlwiO1xuICBpc0ZpcnN0RW50cnlTZWFyY2hMb2NhbDogYm9vbGVhbiA9IHRydWU7XG4gIGlzQ3Jvc3NQYWdlU2VsZWN0TG9jYWw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiog6Ieq5Yqo5rWL6YeP5YmN55qE5YWc5bqV6KGM6auY77yM5rWL6YeP5a6M5oiQ5ZCO5Lya5pu05pawICovXG4gIG1lYXN1cmVkVmlydHVhbEl0ZW1TaXplID0gNDc7XG5cbiAgLyoqIOiusOW9leW9k+WJjeaYr+WQpuWkhOS6juiZmuaLn+a7muWKqOaooeW8j++8jOeUqOS6juWIh+aNoiBwYWdlU2l6ZSDml7bph43lu7rooajmoLwgKi9cbiAgcHJpdmF0ZSB2aXJ0dWFsU2Nyb2xsQWN0aXZlOiBib29sZWFuIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIOWunumZhea4suafk+WIl+WuveWQiOiuoe+8iOWQq+WLvumAiS/luo/lj7cgKyDooaXlrr3vvInvvIzlkIjorqEgZm9vdGVyIOihqOWuveeUqCAqL1xuICB0YWJsZUNvbFdpZHRoVG90YWwgPSAwO1xuXG4gIC8qKiDlvoXmjInmr5TkvovliIbnu5nlkITkuJrliqHliJfnmoTmgLvooaXlrr3vvJvlj6rlvbHlk43lsZXnpLrvvIzkuI3lhpnlm54gY29sLndpZHRo77yI5YiX5a6957yT5a2Y44CB5ouW5ou95LuN55So5aOw5piO5a6977yJICovXG4gIGZsdWlkRXh0cmFXaWR0aCA9IDA7XG5cbiAgLyoqIOWIl+WwkeOAgemdoOihpeWuveWQg+a7oeWuueWZqO+8muaooeadv+aNruatpOWKoCBoZC10YWJsZS0tZmx1aWQteO+8jOmakOiXjyBmaXhlZC1oZWFkZXIg5bi46am755qE5qiq5rua5qe9ICovXG4gIGZsdWlkSG9yaXpvbnRhbCA9IGZhbHNlO1xuXG4gIC8qKiDlkITkuJrliqHliJfliIbliLDnmoTooaXlrr3vvIjmjInliJflr7nosaHlj5bvvIxhcHBseUhvcml6b250YWxMYXlvdXQg5pe25pW06KGo6YeN5bu677yJICovXG4gIHByaXZhdGUgZmx1aWRFeHRyYUJ5Q29sOiBNYXA8SGRUYWJsZUNvbHVtbiwgbnVtYmVyPiA9IG5ldyBNYXAoKTtcblxuICAvKiog5pWw5o2u5pu05paw5ZCO5b6F5aSN5L2N57q15ZCR5rua5Yqo5L2N572uICovXG4gIHByaXZhdGUgcGVuZGluZ1Jlc2V0U2Nyb2xsVG9wID0gZmFsc2U7XG5cbiAgLyoqIOW9k+WJjeaOkuW6j++8jOihqOagvOmHjeW7uuWQjueUqOS6juaBouWkjeihqOWktOaOkuW6j+aAgSAqL1xuICBwcml2YXRlIGN1cnJlbnRTb3J0S2V5OiBzdHJpbmcgPSBudWxsO1xuICBwcml2YXRlIGN1cnJlbnRTb3J0VmFsdWU6IHN0cmluZyA9IG51bGw7XG5cbiAgQFZpZXdDaGlsZChcImhkVGFibGVcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIG56VGFibGVDb21wb25lbnQ6IE56VGFibGVDb21wb25lbnQ7XG5cbiAgcHJpdmF0ZSB0b3RhbEZvb3RlclNjcm9sbEJvdW5kQm9keTogSFRNTEVsZW1lbnQgPSBudWxsO1xuICBwcml2YXRlIHRvdGFsRm9vdGVyU2Nyb2xsSGFuZGxlcjogKCkgPT4gdm9pZCA9IG51bGw7XG4gIHByaXZhdGUgdG90YWxGb290ZXJTeW5jUmV0cnkgPSAwO1xuXG4gIC8qKiDooajkvZPmnInnq5bmu5rmnaHml7blkIjorqEgZm9vdGVyIOaJjemihOeVmeWPs+S+p+a7muWKqOadoeanvSAqL1xuICB0b3RhbEZvb3Rlck5lZWRZR3V0dGVyID0gZmFsc2U7XG5cbiAgLyoqIOinhuWPoy/lrrnlmajlsLrlr7jlj5jljJbml7bph43nrpcgc2Nyb2xsLngg5LiO5ZCI6K6h5a+56b2QICovXG4gIHByaXZhdGUgdmlld3BvcnRSZXNpemVUaW1lcjogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBib3VuZE9uVmlld3BvcnRSZXNpemU6ICgpID0+IHZvaWQgPSBudWxsO1xuICBwcml2YXRlIGhvc3RSZXNpemVPYnNlcnZlcjogYW55ID0gbnVsbDtcblxuICAvKiogc2VsZWN0IOWxleW8gCAvIOaQnOe0oumYsuaKlu+8iOWvuem9kCBmb3JtLWxpbmVz77yJICovXG4gIHByaXZhdGUgc2VsZWN0T3BlbkNoYW5nZVN1YmplY3QgPSBuZXcgU3ViamVjdDx7XG4gICAgZm46IChvcGVuOiBib29sZWFuLCBsaW5lOiBhbnkpID0+IGFueTtcbiAgICBvcGVuOiBib29sZWFuO1xuICAgIGxpbmU6IGFueTtcbiAgICBjb2w6IEhkVGFibGVDb2x1bW47XG4gIH0+KCk7XG4gIHByaXZhdGUgc2VsZWN0T3BlbkNoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHNlbGVjdFNlYXJjaFN1YmplY3QgPSBuZXcgU3ViamVjdDx7XG4gICAgZm46IChrZXl3b3JkOiBzdHJpbmcsIGxpbmU6IGFueSkgPT4gYW55O1xuICAgIGtleXdvcmQ6IHN0cmluZztcbiAgICBsaW5lOiBhbnk7XG4gICAgY29sOiBIZFRhYmxlQ29sdW1uO1xuICB9PigpO1xuICBwcml2YXRlIHNlbGVjdFNlYXJjaFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuICAvKiog5byC5q2l5Zue5YaZIG9wdGlvbnMg55qE6K6i6ZiF77yM6YG/5YWN6L+e54K55pCc57Si5rOE5ryPICovXG4gIHByaXZhdGUgc2VsZWN0TG9hZGVyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBob3N0RWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgY29tbW9uU2Vzc2lvblNlcnZpY2U6IENvbW1vblNlc3Npb25TZXJ2aWNlLFxuICApIHtcbiAgICB0aGlzLmxvY2FsZm9yYWdlID0gbG9jYWxmb3JhZ2UuY3JlYXRlSW5zdGFuY2Uoe1xuICAgICAgZHJpdmVyOiBsb2NhbGZvcmFnZS5JTkRFWEVEREIsXG4gICAgICBuYW1lOiBcImhkLWZzY21cIiwgLy8g6K6+572u5a2Y5YKo5bqT55qE5ZCN56ewXG4gICAgICB2ZXJzaW9uOiAxLjAsIC8vIOiuvue9ruWtmOWCqOW6k+eahOeJiOacrFxuICAgICAgc3RvcmVOYW1lOiBcImhkLWZzY20tc3RvcmVcIiwgLy8g6K6+572u5a2Y5YKo5bqT55qE5a2Y5YKo56m66Ze05ZCN56ewXG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnVuYmluZFRvdGFsRm9vdGVyU2Nyb2xsU3luYygpO1xuICAgIHRoaXMudW5iaW5kVmlld3BvcnRSZXNpemVTeW5jKCk7XG4gICAgaWYgKHRoaXMuc2VsZWN0T3BlbkNoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zZWxlY3RPcGVuQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdFNlYXJjaFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zZWxlY3RTZWFyY2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0TG9hZGVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdExvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiDkvpvkuJrliqHlnKjoh6rooYzlhpnlm54gb3B0aW9ucyDlkI7op6blj5EgT25QdXNoIOWIt+aWsO+8iOS8mOWFiCByZXR1cm4gT2JzZXJ2YWJsZS9Qcm9taXNlIOeUsee7hOS7tuWkhOeQhu+8iSAqL1xuICBtYXJrRm9yQ2hlY2soKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0ZpcnN0RW50cnlTZWFyY2ggPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmlzRmlyc3RFbnRyeVNlYXJjaExvY2FsID0gdGhpcy5pc0ZpcnN0RW50cnlTZWFyY2g7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzQ3Jvc3NQYWdlU2VsZWN0ID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmlzQ3Jvc3NQYWdlU2VsZWN0TG9jYWwgPSB0aGlzLmlzQ3Jvc3NQYWdlU2VsZWN0O1xuICAgIH1cbiAgICB0aGlzLmxvY2FsdGlvblRtcCA9IGxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGlmICh0aGlzLmxvY2FsdGlvblRtcCkge1xuICAgICAgdGhpcy5sb2NhbHRpb25UbXAgPSB0aGlzLmxvY2FsdGlvblRtcC5yZXBsYWNlKC9cXC8vZywgXCJfXCIpO1xuICAgIH1cbiAgICB0aGlzLnVzZXJTZXNzaW9uID0gdGhpcy5jb21tb25TZXNzaW9uU2VydmljZS5nZXRTZXNzaW9uKFxuICAgICAgXCJfX2p5X2F1dGhvcml6YXRpb25fc2Vzc2lvbl9fXCIsXG4gICAgKTtcbiAgICAvLyDnlKjkuo7lvIDlj5Hnjq/looPosIPor5VcbiAgICBpZiAoIXRoaXMudXNlclNlc3Npb24pIHtcbiAgICAgIHRoaXMudXNlclNlc3Npb24gPSB7XG4gICAgICAgIHVzZXJDb2RlOiBcImRldlwiLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLmJpbmRWaWV3cG9ydFJlc2l6ZVN5bmMoKTtcbiAgICB0aGlzLmRlbGV0ZUhpZGVJdGVtKCk7XG4gICAgaWYgKCF0aGlzLnRhYmxlQ29scyB8fCB0aGlzLnRhYmxlQ29scy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvY2FsZm9yYWdlXG4gICAgICAucmVhZHkoKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmdldEluaXRMb2NhbGZvcmFnZSgpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhcImxvY2FsZm9yYWdl5Yqg6L295byC5bi4c3RlcDFcIiwgZSk7XG4gICAgICAgIHRocm93IFwibG9jYWxmb3JhZ2XliqDovb3lvILluLhcIjtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlKSB7XG4gICAgaWYgKFxuICAgICAgY2hhbmdlc1tcInNlbGVjdFR5cGVcIl0gJiZcbiAgICAgIGNoYW5nZXNbXCJzZWxlY3RUeXBlXCJdW1wicHJldmlvdXNWYWx1ZVwiXSAhPSBudWxsICYmXG4gICAgICBjaGFuZ2VzW1wic2VsZWN0VHlwZVwiXVtcImN1cnJlbnRWYWx1ZVwiXSAhPT1cbiAgICAgICAgY2hhbmdlc1tcInNlbGVjdFR5cGVcIl1bXCJwcmV2aW91c1ZhbHVlXCJdXG4gICAgKSB7XG4gICAgICB0aGlzLnJlc2V0U3RhdHVzKCk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZURhdGFcIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZVRvdGFsT3B0aW9uXCJdIHx8XG4gICAgICBjaGFuZ2VzW1wic2hvd1RhYmxlVG90YWxcIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJjb2x1bW5zTnVtYmVyXCJdIHx8XG4gICAgICBjaGFuZ2VzW1widGFibGVDb2xzXCJdXG4gICAgKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZVRhYmxlVG90YWwoKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzICYmXG4gICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdICYmXG4gICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wiY3VycmVudFZhbHVlXCJdICYmXG4gICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wicHJldmlvdXNWYWx1ZVwiXVxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wiY3VycmVudFZhbHVlXCJdW1wicGFnZVNpemVcIl0gIT09XG4gICAgICAgICAgY2hhbmdlc1tcInRhYmxlRGF0YVwiXVtcInByZXZpb3VzVmFsdWVcIl1bXCJwYWdlU2l6ZVwiXSB8fFxuICAgICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wiY3VycmVudFZhbHVlXCJdW1wicGFnZU51bWJlclwiXSAhPT1cbiAgICAgICAgICBjaGFuZ2VzW1widGFibGVEYXRhXCJdW1wicHJldmlvdXNWYWx1ZVwiXVtcInBhZ2VOdW1iZXJcIl1cbiAgICAgICkge1xuICAgICAgICB0aGlzLnBlbmRpbmdSZXNldFNjcm9sbFRvcCA9IHRydWU7XG4gICAgICAgIC8vIOS4muWKoeWPr+iDveaKiiBQYWdlLnBhZ2VTaXplIOWGmeaIkCBjb250ZW50Lmxlbmd0aO+8jOaNouaVsOaNruaXtuWwseS8mui1sOWIsOi/memHjO+8jFxuICAgICAgICAvLyDlv4Xpobvph43nrpfmqKrlkJHluIPlsYDjgILmu5rliqjmqKHlvI/kuI3lj5jml7bkuI3kvJrph43lu7rvvIzmjpLluo/mgIHkuI3kvJrooqvmuIXmjonjgIJcbiAgICAgICAgdGhpcy5hcHBseVRhYmxlU2Nyb2xsTW9kZShmYWxzZSk7XG4gICAgICAgIC8vIOe/u+mhtS/mlLkgcGFnZVNpemXvvJrkuLvliqjlpJrmrKHlpI3kvY3vvIzopobnm5YgQ0RLIOW8guatpea4suafk+aXtuW6j1xuICAgICAgICB0aGlzLnNjaGVkdWxlUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmlzQ3Jvc3NQYWdlU2VsZWN0TG9jYWwpIHtcbiAgICAgICAgdGhpcy5yZXNldFN0YXR1cygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzW1widGFibGVEYXRhXCJdKSB7XG4gICAgICB0aGlzLnBlbmRpbmdSZXNldFNjcm9sbFRvcCA9IHRydWU7XG4gICAgICAvLyDkuI3orrrmmK/lkKbomZrmi5/mu5rliqjvvIzmlbDmja7lj5jljJblkI7pg73opoHph43nrpfmqKrlkJHluIPlsYBcbiAgICAgIHRoaXMuYXBwbHlUYWJsZVNjcm9sbE1vZGUoZmFsc2UpO1xuICAgICAgLy8g5pWw5o2u5pu05paw5ZCO5aSN5L2N57q15ZCR5rua5Yqo77yI5ZCr6Jma5ouf5rua5Yqo5Zy65pmv77yJXG4gICAgICB0aGlzLnNjaGVkdWxlUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzW1widGFibGVDb2xzXCJdICYmXG4gICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2VzW1widGFibGVDb2xzXCJdLmN1cnJlbnRWYWx1ZSkgIT09XG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbXCJ0YWJsZUNvbHNcIl0ucHJldmlvdXNWYWx1ZSkgJiZcbiAgICAgIGNoYW5nZXNbXCJ0YWJsZUNvbHNcIl0ucHJldmlvdXNWYWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB0aGlzLmRlbGV0ZUhpZGVJdGVtKCk7XG4gICAgICBpZiAoIXRoaXMudGFibGVDb2xzIHx8IHRoaXMudGFibGVDb2xzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmxvY2FsZm9yYWdlXG4gICAgICAgIC5yZWFkeSgpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmdldEluaXRMb2NhbGZvcmFnZSgpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcImxvY2FsZm9yYWdl5Yqg6L295byC5bi4c3RlcDJcIiwgZSk7XG4gICAgICAgICAgdGhyb3cgXCJsb2NhbGZvcmFnZeWKoOi9veW8guW4uFwiO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAoY2hhbmdlc1tcInBhZ2luYXRpb25cIl0gJiYgIWNoYW5nZXNbXCJwYWdpbmF0aW9uXCJdLmZpcnN0Q2hhbmdlKSB8fFxuICAgICAgKGNoYW5nZXNbXCJmcm9udFBhZ2luYXRpb25cIl0gJiYgIWNoYW5nZXNbXCJmcm9udFBhZ2luYXRpb25cIl0uZmlyc3RDaGFuZ2UpXG4gICAgKSB7XG4gICAgICAvLyDliIbpobXmqKHlvI/liIfmjaLpnIDph43lu7ogbnotdGFibGXvvIhmcm9udCAvIHNlcnZlciAvIG5vbmXvvIlcbiAgICAgIHRoaXMudGFibGVQYWdlSW5kZXggPSAxO1xuICAgICAgdGhpcy5hcHBseVRhYmxlU2Nyb2xsTW9kZSh0cnVlKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiDmmK/lkKbotbDliY3nq6/liIbpobXvvIjlr7kgY29udGVudCDliIfniYfvvIzkuI3or7fmsYLlkI7nq6/vvIkgKi9cbiAgZ2V0IHVzZUZyb250UGFnaW5hdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnBhZ2luYXRpb24gJiYgISF0aGlzLmZyb250UGFnaW5hdGlvbjtcbiAgfVxuXG4gIGRlbGV0ZUhpZGVJdGVtKCkge1xuICAgIC8vIOmmluWFiOaKimlzU2hvd+S4umZhbHNl5pWw5o2u5YmU6Zmk5o6JXG4gICAgdGhpcy50YWJsZUNvbHMgPSB0aGlzLnRhYmxlQ29scy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgIC8vIOWmguaenOWvueixoeayoeaciSBpc1Nob3cg5bGe5oCn77yM5YiZ6buY6K6k5Li6IHRydWXvvIzkv53nlZnor6Xlr7nosaFcbiAgICAgIGlmICghaXRlbS5oYXNPd25Qcm9wZXJ0eShcImlzU2hvd1wiKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8vIOWmguaenOWvueixoeaciSBpc1Nob3cg5bGe5oCn77yM5YiZ5qOA5p+l5YW25YC85piv5ZCm5Li6IHRydWVcbiAgICAgIHJldHVybiBpdGVtLmlzU2hvdyA9PT0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHNvcnQoc29ydDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9KSB7XG4gICAgdGhpcy5jdXJyZW50U29ydEtleSA9IHNvcnQgJiYgc29ydC5rZXk7XG4gICAgdGhpcy5jdXJyZW50U29ydFZhbHVlID0gc29ydCAmJiBzb3J0LnZhbHVlO1xuICAgIHRoaXMuc29ydEV2ZW50LmVtaXQoc29ydCk7XG4gIH1cblxuICBnZXRDb2xTb3J0KGNvbDogSGRUYWJsZUNvbHVtbik6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghY29sIHx8ICFjb2wuY2FuU29ydCB8fCAhdGhpcy5jdXJyZW50U29ydEtleSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjb2wubmFtZSA9PT0gdGhpcy5jdXJyZW50U29ydEtleSA/IHRoaXMuY3VycmVudFNvcnRWYWx1ZSA6IG51bGw7XG4gIH1cblxuICB0b2dnbGVTaG93RGV0YWlsKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0RldGFpbCA9ICF0aGlzLnNob3dEZXRhaWw7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5yZWZyZXNoVmlydHVhbFNjcm9sbFZpZXdwb3J0KHRydWUpO1xuICB9XG5cbiAgZ2V0IGVmZmVjdGl2ZVZpcnR1YWxJdGVtU2l6ZSgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLnZpcnR1YWxJdGVtU2l6ZSAhPSBudWxsICYmIHRoaXMudmlydHVhbEl0ZW1TaXplID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMudmlydHVhbEl0ZW1TaXplO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tZWFzdXJlZFZpcnR1YWxJdGVtU2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnurXlkJHlj6/nlKjpq5jluqbmiaPlh4/vvJrmjInpkq7ljLov5ZCI6K6hL+WIhumhteetieWbuuWumuWNoOS9jeOAglxuICAgKiDlv4XpobvkuI4gZGVhbFNjcm9sbCAvIHByZXNldFNjcm9sbEJlZm9yZVJlbW91bnQg5L2/55So5ZCM5LiA5aWX77yM5ZCm5YiZ5Lya6K+v5Yik44CM6IO95pS+5LiL44CN6ICM5LiN6K6+IHNjcm9sbC5544CCXG4gICAqL1xuICBwcml2YXRlIGdldFNjcm9sbFlNYXhPZmZzZXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMudGFibGVUb3RhbCA/IDE4MCA6IDE0MCkgKyAyMTY7XG4gIH1cblxuICAvKipcbiAgICog5b2T5YmN6KeG5Y+j5a6e6ZmF5bGV56S655qE6KGM5pWw44CCXG4gICAqIOWJjeerr+WIhumhteaMiSBwYWdlSW5kZXgvcGFnZVNpemUg5YiH54mH5Lyw566X77yM6YG/5YWN55So5YWo6YePIGxlbmd0aCDor6/liKTpnIDopoHnurXlkJHmu5rliqjjgIJcbiAgICovXG4gIHByaXZhdGUgZ2V0VmlzaWJsZVJvd0NvdW50KCk6IG51bWJlciB7XG4gICAgY29uc3QgY29udGVudCA9XG4gICAgICB0aGlzLnRhYmxlRGF0YSAmJiB0aGlzLnRhYmxlRGF0YS5jb250ZW50ID8gdGhpcy50YWJsZURhdGEuY29udGVudCA6IFtdO1xuICAgIGNvbnN0IHRvdGFsID0gY29udGVudC5sZW5ndGg7XG4gICAgaWYgKCF0aGlzLnVzZUZyb250UGFnaW5hdGlvbikge1xuICAgICAgcmV0dXJuIHRvdGFsO1xuICAgIH1cbiAgICBpZiAodG90YWwgPD0gMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNvbnN0IHBhZ2VTaXplID1cbiAgICAgIE51bWJlcih0aGlzLnRhYmxlUGFnZVNpemUpID4gMCA/IE51bWJlcih0aGlzLnRhYmxlUGFnZVNpemUpIDogMTA7XG4gICAgY29uc3QgcGFnZUluZGV4ID1cbiAgICAgIE51bWJlcih0aGlzLnRhYmxlUGFnZUluZGV4KSA+IDAgPyBOdW1iZXIodGhpcy50YWJsZVBhZ2VJbmRleCkgOiAxO1xuICAgIGNvbnN0IHN0YXJ0ID0gKHBhZ2VJbmRleCAtIDEpICogcGFnZVNpemU7XG4gICAgaWYgKHN0YXJ0ID49IHRvdGFsKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGgubWluKHBhZ2VTaXplLCB0b3RhbCAtIHN0YXJ0KTtcbiAgfVxuXG4gIC8qKiDlvZPliY3pobXlhoXlrrnpq5jluqbmmK/lkKbotoXlh7rop4blj6PvvIjpnIDopoHooajlhoXnurXlkJHmu5rliqjvvIkgKi9cbiAgZ2V0IG5lZWRzVmVydGljYWxTY3JvbGwoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgcm93Q291bnQgPSB0aGlzLmdldFZpc2libGVSb3dDb3VudCgpO1xuICAgIGlmIChyb3dDb3VudCA8PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IG1heE9mZnNldCA9IHRoaXMuZ2V0U2Nyb2xsWU1heE9mZnNldCgpO1xuICAgIGNvbnN0IGVzdGltYXRlZEhlaWdodCA9IHJvd0NvdW50ICogdGhpcy5lZmZlY3RpdmVWaXJ0dWFsSXRlbVNpemU7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHJldHVybiBlc3RpbWF0ZWRIZWlnaHQgPiB3aW5kb3cuaW5uZXJIZWlnaHQgLSBtYXhPZmZzZXQ7XG4gICAgfVxuICAgIHJldHVybiByb3dDb3VudCA+IDEwMDtcbiAgfVxuXG4gIC8qKiDlvZPliY3pobXmlbDmja7og73lrozmlbTlsZXnpLrml7bkuI3lkK/nlKjomZrmi5/mu5rliqjvvIzpgb/lhY3lsJHph4/mlbDmja7kuZ/lh7rnjrDmu5rliqjmnaEgKi9cbiAgZ2V0IHVzZVZpcnR1YWxTY3JvbGwoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnZpcnR1YWxTY3JvbGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubmVlZHNWZXJ0aWNhbFNjcm9sbDtcbiAgfVxuXG4gIGdldFJpZ2h0U3RpY2t5KGNvbDogSGRUYWJsZUNvbHVtbik6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiBjb2wuZml4ZWQgPT09IFwicmlnaHRcIiA/IGAke2NvbC5maXhlZFJpZ2h0V2lkdGggfHwgMH1weGAgOiBudWxsO1xuICB9XG5cbiAgZ2V0TGVmdFN0aWNreShjb2w6IEhkVGFibGVDb2x1bW4pOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gY29sLmZpeGVkID09PSBcImxlZnRcIiA/IGAke2NvbC5maXhlZFdpZHRoIHx8IDB9cHhgIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiDluo/lj7fliJflm7rlrprlrr3vvIjlkKsgcGFkZGluZ++8jOWPr+Wuuee6syA2IOS9jeWmgiAxOTk5OTXvvInjgIJcbiAgICog5LiN6ZSB5q275pe26KGo5L2T5Lya6ZqP5L2N5pWw5Y+Y5a6977yIMeKGkn42NHB477yMMTk5OTk14oaSfjY3cHjvvInvvIzlkIjorqHooYzlr7nkuI3pvZDjgIJcbiAgICovXG4gIHJlYWRvbmx5IGxpbmVOdW1iZXJDb2xXaWR0aCA9IDcyO1xuXG4gIC8qKiDlvIDlkK/lkIjorqHml7bluo/lj7fliJfnmoQgbGVmdO+8iOi3n+WcqOWLvumAieWIl+WQjumdou+8iSAqL1xuICBnZXQgbGluZU51bWJlckxlZnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHRoaXMuc2hvd1NlbGVjdGVkID8gU0VMRUNUX0NPTF9XSURUSCA6IDApICsgXCJweFwiO1xuICB9XG5cbiAgZ2V0IGxpbmVOdW1iZXJDb2xXaWR0aFB4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubGluZU51bWJlckNvbFdpZHRoICsgXCJweFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIOaXoCBzY3JvbGwueCDml7blkIjorqHotbAgZmx1aWTvvIh3aWR0aDoxMDAl77yJ44CCXG4gICAqIOWIl+WwkeaXtuS5n+S8muiuviBzY3JvbGwueO+8iOihpeWuveWQg+a7oe+8ie+8jOWQiOiuoei1sOWbuuWumuihqOWuveOAglxuICAgKi9cbiAgZ2V0IGlzVG90YWxGb290ZXJGbHVpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISh0aGlzLnNjcm9sbCAmJiB0aGlzLnNjcm9sbC54KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNDb2xWaXNpYmxlKGNvbDogSGRUYWJsZUNvbHVtbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWNvbCAmJiBjb2wuaXNTaG93ICE9PSBmYWxzZTtcbiAgfVxuXG4gIC8qKiDkuJrliqHliJflo7DmmI7lrr3vvJrmnKrphY3nva7ml7bmjIkgZml4Q29sV2lkdGggKi9cbiAgcHJpdmF0ZSBnZXRDb2xEZWNsYXJlZFdpZHRoKGNvbDogSGRUYWJsZUNvbHVtbik6IG51bWJlciB7XG4gICAgcmV0dXJuIGNvbCAmJiBjb2wud2lkdGggPiAwID8gY29sLndpZHRoIDogQ29sV2lkdGguZml4Q29sV2lkdGg7XG4gIH1cblxuICAvKiog5aOw5piO5YiX5a695ZCI6K6h77ya5Yu+6YCJ5YiXICsg5bqP5Y+35YiXICsg5Y+v6KeB5Lia5Yqh5YiX77yM5LiN5ZCr6KGl5a69ICovXG4gIHByaXZhdGUgZ2V0RGVjbGFyZWRDb2xXaWR0aFRvdGFsKCk6IG51bWJlciB7XG4gICAgbGV0IHRvdGFsID0gMDtcbiAgICBpZiAodGhpcy5zaG93U2VsZWN0ZWQpIHtcbiAgICAgIHRvdGFsICs9IFNFTEVDVF9DT0xfV0lEVEg7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dUYWJsZVRvdGFsKSB7XG4gICAgICB0b3RhbCArPSB0aGlzLmxpbmVOdW1iZXJDb2xXaWR0aDtcbiAgICB9XG4gICAgKHRoaXMudGFibGVDb2xzIHx8IFtdKS5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzQ29sVmlzaWJsZShjb2wpKSB7XG4gICAgICAgIHRvdGFsICs9IHRoaXMuZ2V0Q29sRGVjbGFyZWRXaWR0aChjb2wpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0b3RhbDtcbiAgfVxuXG4gIC8qKiDmqKHmnb/ph4wgdGggLyB0ZCAvIOWQiOiuoSBjb2wg55So55qE5YiX5a6977ya5aOw5piO5a69ICsg6K+l5YiX5oyJ5q+U5L6L5YiG5Yiw55qE6KGl5a69ICovXG4gIGdldENvbERpc3BsYXlXaWR0aChjb2w6IEhkVGFibGVDb2x1bW4pOiBudW1iZXIge1xuICAgIGNvbnN0IGRlY2xhcmVkID0gdGhpcy5nZXRDb2xEZWNsYXJlZFdpZHRoKGNvbCk7XG4gICAgaWYgKCFjb2wgfHwgdGhpcy5mbHVpZEV4dHJhV2lkdGggPD0gMCkge1xuICAgICAgcmV0dXJuIGRlY2xhcmVkO1xuICAgIH1cbiAgICBjb25zdCBleHRyYSA9IHRoaXMuZmx1aWRFeHRyYUJ5Q29sLmdldChjb2wpO1xuICAgIHJldHVybiBkZWNsYXJlZCArIChleHRyYSA+IDAgPyBleHRyYSA6IDApO1xuICB9XG5cbiAgLyoqXG4gICAqIOaKiiBmbHVpZEV4dHJhIOaMieWQhOWPr+ingeS4muWKoeWIl+WjsOaYjuWuveavlOS+i+WIhumFje+8iOacgOWkp+S9meaVsOazle+8ie+8jFxuICAgKiDli77pgInliJcgLyDluo/lj7fliJfkuI3lj4LkuI7vvJvkv53or4HlkITliJfooaXlrr3kuYvlkoznrYnkuo4gZmx1aWRFeHRyYeOAglxuICAgKi9cbiAgcHJpdmF0ZSByZWJ1aWxkRmx1aWRFeHRyYUJ5Q29sKGZsdWlkRXh0cmE6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZmx1aWRFeHRyYUJ5Q29sID0gbmV3IE1hcCgpO1xuICAgIGlmIChmbHVpZEV4dHJhIDw9IDAgfHwgIXRoaXMudGFibGVDb2xzIHx8ICF0aGlzLnRhYmxlQ29scy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGFydHM6IEFycmF5PHtcbiAgICAgIGNvbDogSGRUYWJsZUNvbHVtbjtcbiAgICAgIGRlY2xhcmVkOiBudW1iZXI7XG4gICAgICBzaGFyZTogbnVtYmVyO1xuICAgICAgZnJhYzogbnVtYmVyO1xuICAgIH0+ID0gW107XG4gICAgbGV0IHN1bURlY2xhcmVkID0gMDtcbiAgICB0aGlzLnRhYmxlQ29scy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgIGlmICghdGhpcy5pc0NvbFZpc2libGUoY29sKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBkZWNsYXJlZCA9IHRoaXMuZ2V0Q29sRGVjbGFyZWRXaWR0aChjb2wpO1xuICAgICAgc3VtRGVjbGFyZWQgKz0gZGVjbGFyZWQ7XG4gICAgICBwYXJ0cy5wdXNoKHsgY29sLCBkZWNsYXJlZCwgc2hhcmU6IDAsIGZyYWM6IDAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHN1bURlY2xhcmVkIDw9IDAgfHwgIXBhcnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgYXNzaWduZWQgPSAwO1xuICAgIHBhcnRzLmZvckVhY2goKHBhcnQpID0+IHtcbiAgICAgIGNvbnN0IGV4YWN0ID0gKGZsdWlkRXh0cmEgKiBwYXJ0LmRlY2xhcmVkKSAvIHN1bURlY2xhcmVkO1xuICAgICAgcGFydC5zaGFyZSA9IE1hdGguZmxvb3IoZXhhY3QpO1xuICAgICAgcGFydC5mcmFjID0gZXhhY3QgLSBwYXJ0LnNoYXJlO1xuICAgICAgYXNzaWduZWQgKz0gcGFydC5zaGFyZTtcbiAgICB9KTtcbiAgICBsZXQgcmVtYWluID0gZmx1aWRFeHRyYSAtIGFzc2lnbmVkO1xuICAgIHBhcnRzXG4gICAgICAuc2xpY2UoKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIuZnJhYyAtIGEuZnJhYylcbiAgICAgIC5mb3JFYWNoKChwYXJ0KSA9PiB7XG4gICAgICAgIGlmIChyZW1haW4gPD0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwYXJ0LnNoYXJlICs9IDE7XG4gICAgICAgIHJlbWFpbiAtPSAxO1xuICAgICAgfSk7XG4gICAgcGFydHMuZm9yRWFjaCgocGFydCkgPT4ge1xuICAgICAgaWYgKHBhcnQuc2hhcmUgPiAwKSB7XG4gICAgICAgIHRoaXMuZmx1aWRFeHRyYUJ5Q29sLnNldChwYXJ0LmNvbCwgcGFydC5zaGFyZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiog5oqK5qiq5ZCR5biD5bGA57uT5p6c5YaZ5Zue57uE5Lu254q25oCB77yIZGVhbFNjcm9sbCAvIHN5bmNIb3Jpem9udGFsU2Nyb2xsIOWFseeUqO+8iSAqL1xuICBwcml2YXRlIGFwcGx5SG9yaXpvbnRhbExheW91dChsYXlvdXQ6IEhkVGFibGVIb3Jpem9udGFsTGF5b3V0KTogdm9pZCB7XG4gICAgdGhpcy5mbHVpZEV4dHJhV2lkdGggPSBsYXlvdXQuZmx1aWRFeHRyYTtcbiAgICB0aGlzLmZsdWlkSG9yaXpvbnRhbCA9IGxheW91dC5pc0ZsdWlkO1xuICAgIHRoaXMucmVidWlsZEZsdWlkRXh0cmFCeUNvbChsYXlvdXQuZmx1aWRFeHRyYSk7XG4gICAgdGhpcy50YWJsZUNvbFdpZHRoVG90YWwgPSBsYXlvdXQuZGlzcGxheVRvdGFsO1xuICB9XG5cbiAgLyoqIGZsdWlkIOKGkiAxMDAl77yb5Zu65a6aIOKGkiBzY3JvbGwueO+8iOS4juihqOS9k+WQjOS4gOWll+aoquWQkeWuveW6pu+8iSAqL1xuICBnZXQgdG90YWxGb290ZXJUYWJsZVdpZHRoKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNUb3RhbEZvb3RlckZsdWlkKSB7XG4gICAgICByZXR1cm4gXCIxMDAlXCI7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNjcm9sbCAmJiB0aGlzLnNjcm9sbC54XG4gICAgICA/IFN0cmluZyh0aGlzLnNjcm9sbC54KVxuICAgICAgOiB0aGlzLnRhYmxlQ29sV2lkdGhUb3RhbCA+IDBcbiAgICAgICAgPyB0aGlzLnRhYmxlQ29sV2lkdGhUb3RhbCArIFwicHhcIlxuICAgICAgICA6IFwiMTAwJVwiO1xuICB9XG5cbiAgLyoqIOW9k+WJjemhteihjOWPt++8iOi3qOmhtei/nue7re+8jOS7jiAxIOW8gOWni++8iSAqL1xuICBnZXRMaW5lTnVtYmVyKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHBhZ2UgPVxuICAgICAgTnVtYmVyKHRoaXMudGFibGVQYWdlSW5kZXgpID4gMCA/IE51bWJlcih0aGlzLnRhYmxlUGFnZUluZGV4KSA6IDE7XG4gICAgY29uc3Qgc2l6ZSA9XG4gICAgICBOdW1iZXIodGhpcy50YWJsZVBhZ2VTaXplKSA+IDAgPyBOdW1iZXIodGhpcy50YWJsZVBhZ2VTaXplKSA6IDA7XG4gICAgY29uc3Qgcm93SW5kZXggPSBOdW1iZXIoaW5kZXgpID49IDAgPyBOdW1iZXIoaW5kZXgpIDogMDtcbiAgICByZXR1cm4gKHBhZ2UgLSAxKSAqIHNpemUgKyByb3dJbmRleCArIDE7XG4gIH1cblxuICB0cmFja0J5Um93ID0gKGluZGV4OiBudW1iZXIsIGRhdGE6IGFueSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3Qga2V5ID0gZGF0YSAmJiBkYXRhW3RoaXMuc2VsZWN0RmllbGRdO1xuICAgIHJldHVybiBrZXkgIT0gbnVsbCA/IFN0cmluZyhrZXkpIDogYHJvdy0ke2luZGV4fWA7XG4gIH07XG5cbiAgLyoqIOiZmuaLn+a7muWKqOaMieaVsOe7hOS4i+agh+i/vei4qu+8jOmBv+WFjeS4muWKoeS4u+mUriB0cmFja0J5IOWvvOiHtCBDREsg6KGM5aSN55So6ZSZ5L2NICovXG4gIHZpcnR1YWxUcmFja0J5Um93ID0gKGluZGV4OiBudW1iZXIpOiBudW1iZXIgPT4gaW5kZXg7XG5cbiAgdHJhY2tCeUNvbCA9IChfaW5kZXg6IG51bWJlciwgY29sOiBIZFRhYmxlQ29sdW1uKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gY29sLnRpdGxlO1xuICB9O1xuXG4gIGdldEluaXRMb2NhbGZvcmFnZSgpIHtcbiAgICAvLyDpppblhYjojrflj5blvZPliY1oZC10YWJsZeWtmOWCqOeahOaVsOaNriDlpoLmnpzmsqHmnInvvIzliJnliJ3lp4vljJbkuIvlvZPliY3nmoTmlbDmja5cbiAgICB0aGlzLmxvY2FsZm9yYWdlXG4gICAgICAuZ2V0SXRlbShcbiAgICAgICAgXCJoZC10YWJsZV9cIiArXG4gICAgICAgICAgdGhpcy51c2VyU2Vzc2lvbi51c2VyQ29kZSArXG4gICAgICAgICAgXCJfXCIgK1xuICAgICAgICAgIHRoaXMubG9jYWx0aW9uVG1wICtcbiAgICAgICAgICBcIl9cIiArXG4gICAgICAgICAgdGhpcy51dWlkLFxuICAgICAgKVxuICAgICAgLnRoZW4oKHZhbHVlOiBUYWJsZUNhY2hlT3B0aW9uKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbiA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMubm9ybWFsaXplVGFibGVDYWNoZU9wdGlvbigpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvbiAmJlxuICAgICAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLnBhZ2VTaXplICYmXG4gICAgICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgPiAxMFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy50YWJsZVBhZ2VTaXplID0gdGhpcy50YWJsZUNhY2hlT3B0aW9uLnBhZ2VTaXplO1xuICAgICAgICAgICAgdGhpcy50YWJsZVBhZ2VTaXplQ2hhbmdlLmVtaXQodGhpcy50YWJsZVBhZ2VTaXplKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uID0gbmV3IFRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICAgICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgPSB0aGlzLnRhYmxlUGFnZVNpemU7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5pyN5Yqh56uv5YiG6aG15omN5Zyo5Yid5aeL5YyW5pe25oqbIHBhZ2VTaXplQ2hhbmdlRXZlbnQg6Kem5Y+R54i25p+l6K+i77yb5YmN56uv5YiG6aG15LiN5oqbXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnBhZ2luYXRpb24gJiZcbiAgICAgICAgICAhdGhpcy5mcm9udFBhZ2luYXRpb24gJiZcbiAgICAgICAgICB0aGlzLmlzRmlyc3RFbnRyeVNlYXJjaExvY2FsXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMudGFibGVQYWdlU2l6ZUNoYW5nZUV2ZW50LmVtaXQodGhpcy50YWJsZVBhZ2VTaXplKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmlzRmlyc3RFbnRyeVNlYXJjaExvY2FsID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluaXRUYWJsZSgpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbiA9IG5ldyBUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5wYWdlU2l6ZSA9IHRoaXMudGFibGVQYWdlU2l6ZTtcbiAgICAgICAgdGhpcy5pbml0VGFibGUoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgaW5pdFRhYmxlKCkge1xuICAgIHRoaXMuc2hvd1RhYmxlID0gZmFsc2U7XG4gICAgaWYgKCF0aGlzLnV1aWQpIHtcbiAgICAgIHRocm93IFwiaGQtdGFibGXnvLrlpLF1dWlk5Y+C5pWw77yM6K+35L2/55So57yW6L6R5Zmo5o+S5Lu255Sf5oiQ5bm257uZaGQtdGFibGXotYvkuoh1dWlk5bGe5oCnXCI7XG4gICAgfVxuICAgIGlmICh0aGlzLmp1ZGdlUmVwZWF0Q29scygpKSB7XG4gICAgICB0aGlzLmRlYWxDb2xzKCk7XG4gICAgICB0aGlzLnNldENvbHMoKTtcbiAgICAgIHRoaXMuZGVhbE9wZXJhdGVCdG4oKTtcbiAgICAgIHRoaXMudmlydHVhbFNjcm9sbEFjdGl2ZSA9IG51bGw7XG4gICAgICB0aGlzLmFwcGx5VGFibGVTY3JvbGxNb2RlKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiDomZrmi58v5pmu6YCa5qih5byP5YiH5o2i5pe26YeN5bu66KGo5qC877yM6YG/5YWN5q6L55WZ5rua5Yqo5a655ZmoICovXG4gIGFwcGx5VGFibGVTY3JvbGxNb2RlKGZvcmNlUmVtb3VudCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgdXNlVmlydHVhbCA9IHRoaXMudXNlVmlydHVhbFNjcm9sbDtcbiAgICBjb25zdCBtb2RlQ2hhbmdlZCA9XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUgIT09IG51bGwgJiZcbiAgICAgIHRoaXMudmlydHVhbFNjcm9sbEFjdGl2ZSAhPT0gdXNlVmlydHVhbDtcbiAgICB0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUgPSB1c2VWaXJ0dWFsO1xuXG4gICAgaWYgKGZvcmNlUmVtb3VudCB8fCBtb2RlQ2hhbmdlZCkge1xuICAgICAgLy8g5b+F6aG75YWI5YaZ5aW9IHNjcm9sbC5577yM5YaN5Yib5bu6IG56LXRhYmxl44CCXG4gICAgICAvLyBuZy16b3JybyDlj6rlnKggQWZ0ZXJWaWV3SW5pdCDnu5HkuIDmrKEgaGVhZGVyL2JvZHkg55qEIHNjcm9sbCDlkIzmraXvvJtcbiAgICAgIC8vIOiLpeWFiOS7pSB5PW51bGwg5Yib5bu65YaN5pS55oiQ5pyJIHnvvIzooajlpLTnm5HlkKzkvJrkuKLvvIzooajnjrDkuLrliJflpLTkuI3ot5/nnYDmqKrmu5rjgIJcbiAgICAgIHRoaXMucHJlc2V0U2Nyb2xsQmVmb3JlUmVtb3VudCh1c2VWaXJ0dWFsKTtcbiAgICAgIHRoaXMucmVtb3VudFRhYmxlKHVzZVZpcnR1YWwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZIYXNYID0gISEodGhpcy5zY3JvbGwgJiYgdGhpcy5zY3JvbGwueCk7XG4gICAgY29uc3QgcHJldkhhc1kgPSAhISh0aGlzLnNjcm9sbCAmJiB0aGlzLnNjcm9sbC55KTtcbiAgICB0aGlzLmRlYWxTY3JvbGwoKTtcbiAgICBjb25zdCBuZXh0SGFzWCA9ICEhKHRoaXMuc2Nyb2xsICYmIHRoaXMuc2Nyb2xsLngpO1xuICAgIGNvbnN0IG5leHRIYXNZID0gISEodGhpcy5zY3JvbGwgJiYgdGhpcy5zY3JvbGwueSk7XG4gICAgLy8gc2Nyb2xsLnggLyBzY3JvbGwueSDku47ml6DliLDmnInvvIjmiJblj43ov4fmnaXvvInml7blv4Xpobvph43lu7rvvIzljp/lnLDmlLnlgLzkuI3nlJ/mlYjvvJpcbiAgICAvLyAtIHnvvJpuZy16b3JybyA4IOWPquWcqCBBZnRlclZpZXdJbml0IOe7keS4gOasoeihqOWktC/ooajkvZPmu5rliqjlkIzmraXvvIzkuJTlhrPlrprooajlpLTmmK/lkKbmi4bmiJDni6znq4sgdGFibGVcbiAgICAvLyAtIHjvvJrlhrPlrprmmK/lkKbluKYgYW50LXRhYmxlLWZpeGVk77yIdGFibGUtbGF5b3V0OiBmaXhlZO+8ie+8jOWLvumAieWIl+mUgeWuveS+nei1luWug1xuICAgIGlmIChwcmV2SGFzWSAhPT0gbmV4dEhhc1kgfHwgcHJldkhhc1ggIT09IG5leHRIYXNYKSB7XG4gICAgICB0aGlzLnJlbW91bnRUYWJsZSh1c2VWaXJ0dWFsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLmFmdGVyVGFibGVSZW5kZXIodXNlVmlydHVhbCk7XG4gIH1cblxuICAvKiog6ZSA5q+B5bm26YeN5bu6IG56LXRhYmxl77ya562JIERPTSDlh7rmnaXlkI7lho3mjInnnJ/lrp7lrrnlmajlrr3ph43nrpfkuIDmrKHmqKrlkJHluIPlsYAgKi9cbiAgcHJpdmF0ZSByZW1vdW50VGFibGUodXNlVmlydHVhbDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2hvd1RhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNob3dUYWJsZSA9IHRydWU7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmRlYWxTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMuYWZ0ZXJUYWJsZVJlbmRlcih1c2VWaXJ0dWFsKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIOmHjeW7uuWJjemihOiuviBzY3JvbGzvvIzkv53or4EgQWZ0ZXJWaWV3SW5pdCDml7YgaGVhZGVyL2JvZHkg57uT5p6E5bey5q2j56GuICovXG4gIHByaXZhdGUgcHJlc2V0U2Nyb2xsQmVmb3JlUmVtb3VudCh1c2VWaXJ0dWFsOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgbWF4T2Zmc2V0ID0gdGhpcy5nZXRTY3JvbGxZTWF4T2Zmc2V0KCk7XG4gICAgY29uc3QgeCA9IHRoaXMuc2Nyb2xsID8gdGhpcy5zY3JvbGwueCA6IG51bGw7XG4gICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbCAmJiAhdXNlVmlydHVhbCkge1xuICAgICAgdGhpcy5zY3JvbGwgPSB7IHgsIHk6IG51bGwgfTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zY3JvbGwgPSB7XG4gICAgICB4LFxuICAgICAgeTogYGNhbGMoMTAwdmggLSAke21heE9mZnNldH1weClgLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFmdGVyVGFibGVSZW5kZXIodXNlVmlydHVhbDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh1c2VWaXJ0dWFsKSB7XG4gICAgICB0aGlzLnJlZnJlc2hWaXJ0dWFsU2Nyb2xsVmlld3BvcnQodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGwpIHtcbiAgICAgIHRoaXMubWVhc3VyZVZpcnR1YWxJdGVtU2l6ZSh0cnVlKTtcbiAgICAgIC8vIOWunua1i+ihjOmrmOWQjuWPr+iDveS7juOAjOiDveaUvuS4i+OAjeWPmOS4uuOAjOi2heWHuuOAje+8jOmcgOWIh+aNoua7muWKqOaooeW8j1xuICAgICAgaWYgKHRoaXMudXNlVmlydHVhbFNjcm9sbCkge1xuICAgICAgICB0aGlzLmFwcGx5VGFibGVTY3JvbGxNb2RlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc3luY0hvcml6b250YWxTY3JvbGwoKTtcbiAgICAgIHRoaXMuZmx1c2hSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVmcmVzaFZpcnR1YWxTY3JvbGxWaWV3cG9ydChmb3JjZU1lYXN1cmUgPSBmYWxzZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy51c2VWaXJ0dWFsU2Nyb2xsKSB7XG4gICAgICBpZiAoZm9yY2VNZWFzdXJlKSB7XG4gICAgICAgIHRoaXMubWVhc3VyZVZpcnR1YWxJdGVtU2l6ZShmb3JjZU1lYXN1cmUpO1xuICAgICAgICB0aGlzLmRlYWxTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmZsdXNoUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCB2aWV3cG9ydCA9XG4gICAgICAgIHRoaXMubnpUYWJsZUNvbXBvbmVudCAmJiB0aGlzLm56VGFibGVDb21wb25lbnQuY2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0O1xuICAgICAgaWYgKCF2aWV3cG9ydCkge1xuICAgICAgICB0aGlzLnN5bmNIb3Jpem9udGFsU2Nyb2xsKCk7XG4gICAgICAgIHRoaXMuZmx1c2hSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtZWFzdXJlZCA9IHRoaXMubWVhc3VyZVZpcnR1YWxJdGVtU2l6ZShmb3JjZU1lYXN1cmUpO1xuICAgICAgaWYgKG1lYXN1cmVkKSB7XG4gICAgICAgIHRoaXMuZGVhbFNjcm9sbCgpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgdmlld3BvcnQuY2hlY2tWaWV3cG9ydFNpemUoKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5tZWFzdXJlVmlydHVhbEl0ZW1TaXplKGZvcmNlTWVhc3VyZSk7XG4gICAgICAgICAgdGhpcy5zeW5jSG9yaXpvbnRhbFNjcm9sbCgpO1xuICAgICAgICAgIHZpZXdwb3J0LmNoZWNrVmlld3BvcnRTaXplKCk7XG4gICAgICAgICAgdGhpcy5mbHVzaFJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmlld3BvcnQuY2hlY2tWaWV3cG9ydFNpemUoKTtcbiAgICAgICAgdGhpcy5zeW5jSG9yaXpvbnRhbFNjcm9sbCgpO1xuICAgICAgICB0aGlzLmZsdXNoUmVzZXRUYWJsZUJvZHlTY3JvbGxUb3AoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiDmlbDmja7liLfmlrDlkI7lsIbooajkvZPnurXlkJHmu5rliqjlpI3kvY3liLDpobbpg6ggKi9cbiAgcHJpdmF0ZSByZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubnpUYWJsZUNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuelRhYmxlID0gdGhpcy5uelRhYmxlQ29tcG9uZW50IGFzIGFueTtcbiAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMubnpUYWJsZUNvbXBvbmVudC5jZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG4gICAgaWYgKHZpZXdwb3J0KSB7XG4gICAgICBpZiAodHlwZW9mICh2aWV3cG9ydCBhcyBhbnkpLnNjcm9sbFRvT2Zmc2V0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgKHZpZXdwb3J0IGFzIGFueSkuc2Nyb2xsVG9PZmZzZXQoMCk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mICh2aWV3cG9ydCBhcyBhbnkpLnNjcm9sbFRvSW5kZXggPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAodmlld3BvcnQgYXMgYW55KS5zY3JvbGxUb0luZGV4KDApO1xuICAgICAgfVxuICAgICAgY29uc3Qgdmlld3BvcnRFbCA9XG4gICAgICAgIHZpZXdwb3J0LmVsZW1lbnRSZWYgJiZcbiAgICAgICAgKHZpZXdwb3J0LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICBpZiAodmlld3BvcnRFbCkge1xuICAgICAgICB2aWV3cG9ydEVsLnNjcm9sbFRvcCA9IDA7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGJvZHlDYW5kaWRhdGVzID0gW1xuICAgICAgbnpUYWJsZS5taXhUYWJsZUJvZHlOYXRpdmVFbGVtZW50LFxuICAgICAgbnpUYWJsZS50YWJsZUJvZHlOYXRpdmVFbGVtZW50LFxuICAgICAgbnpUYWJsZS50YWJsZUJvZHlFbGVtZW50ICYmIG56VGFibGUudGFibGVCb2R5RWxlbWVudC5uYXRpdmVFbGVtZW50LFxuICAgIF07XG4gICAgYm9keUNhbmRpZGF0ZXMuZm9yRWFjaCgoZWw6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwuc2Nyb2xsVG9wID0gMDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCB0YWJsZU1haW4gPVxuICAgICAgbnpUYWJsZS50YWJsZU1haW5FbGVtZW50ICYmXG4gICAgICAobnpUYWJsZS50YWJsZU1haW5FbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpO1xuICAgIGlmICghdGFibGVNYWluKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5vZGVzID0gdGFibGVNYWluLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICBcIi5hbnQtdGFibGUtYm9keSwgY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0XCIsXG4gICAgKTtcbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG5vZGVzLCAoZWw6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICBlbC5zY3JvbGxUb3AgPSAwO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOaVsOaNruabtOaWsOWQjuWkmuasoeWwneivleWkjeS9jeOAglxuICAgKiBuZy16b3JybyA4ICsgQ0RLIOiZmuaLn+a7muWKqOS8muWcqOaVsOaNruWIt+aWsOWQjuW8guatpeaUueWGmSBzY3JvbGxUb3DvvIzljZXmrKHlpI3kvY3nu4/luLjooqvopobnm5bjgIJcbiAgICovXG4gIHByaXZhdGUgc2NoZWR1bGVSZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpOiB2b2lkIHtcbiAgICAvLyDlpJrmrKHlsJ3or5XvvJropobnm5YgbnotdGFibGUgLyBDREsg6Jma5ouf5rua5Yqo5byC5q2l5pS55YaZIHNjcm9sbFRvcFxuICAgIGNvbnN0IGRlbGF5cyA9IFswLCA1MCwgMTAwXTtcbiAgICBkZWxheXMuZm9yRWFjaCgobXMsIGluZGV4KSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICAgICAgICBpZiAoaW5kZXggPT09IGRlbGF5cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nUmVzZXRTY3JvbGxUb3AgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSwgbXMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmbHVzaFJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wZW5kaW5nUmVzZXRTY3JvbGxUb3ApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZXNldFRhYmxlQm9keVNjcm9sbFRvcCgpO1xuICB9XG5cbiAgLyoqIOacquaJi+WKqOS8oCB2aXJ0dWFsSXRlbVNpemUg5pe277yM5LuO5bey5riy5p+T6KGM5rWL6YeP55yf5a6e6auY5bqmICovXG4gIG1lYXN1cmVWaXJ0dWFsSXRlbVNpemUoZm9yY2UgPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnZpcnR1YWxJdGVtU2l6ZSAhPSBudWxsICYmIHRoaXMudmlydHVhbEl0ZW1TaXplID4gMCAmJiAhZm9yY2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgdmlld3BvcnQgPVxuICAgICAgdGhpcy5uelRhYmxlQ29tcG9uZW50ICYmIHRoaXMubnpUYWJsZUNvbXBvbmVudC5jZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG4gICAgY29uc3QgdGFibGVCb2R5ID1cbiAgICAgIHRoaXMubnpUYWJsZUNvbXBvbmVudCAmJlxuICAgICAgKHRoaXMubnpUYWJsZUNvbXBvbmVudC50YWJsZUJvZHlOYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KTtcbiAgICBjb25zdCByb3cgPVxuICAgICAgKHZpZXdwb3J0ICYmXG4gICAgICAgICgodmlld3BvcnQuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgIFwidHIuaGQtdGFibGUtdmlydHVhbC1yb3dcIixcbiAgICAgICAgKSBhcyBIVE1MRWxlbWVudCkpIHx8XG4gICAgICAodGFibGVCb2R5ICYmICh0YWJsZUJvZHkucXVlcnlTZWxlY3RvcihcInRib2R5IHRyXCIpIGFzIEhUTUxFbGVtZW50KSk7XG4gICAgaWYgKCFyb3cgfHwgcm93Lm9mZnNldEhlaWdodCA8PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGhlaWdodCA9IHJvdy5vZmZzZXRIZWlnaHQ7XG4gICAgaWYgKGhlaWdodCA9PT0gdGhpcy5tZWFzdXJlZFZpcnR1YWxJdGVtU2l6ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm1lYXN1cmVkVmlydHVhbEl0ZW1TaXplID0gaGVpZ2h0O1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8g6K6+572u5YiX54K55Ye75Y+W5raIXG4gIGNhbmNlbERyb3Bkb3duKCk6IHZvaWQge1xuICAgIHRoaXMuaXNEcm9wZG93blZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLmhpZGVMaXN0Tm9kZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuY2FuY2VsSGlkZUxpc3ROb2RlcykpO1xuICAgIHRoaXMubm93TGlzdE5vZGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmNhbmNlbE5vd0xpc3ROb2RlcykpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLy8g54K55Ye76Kem5Y+R6K6+572u5YiXXG4gIGNvbmZpcm1Ecm9wZG93bigpOiB2b2lkIHtcbiAgICAvLyDkuLTml7blrZjmlL7kuIvvvIzlj5bmtojnmoTml7blgJnmgaLlpI3ljp/mnaXnmoTnirbmgIEgICDmt7Hmi7fotJ3kuIvlr7nosaHmlbDnu4RcbiAgICB0aGlzLmNhbmNlbEhpZGVMaXN0Tm9kZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuaGlkZUxpc3ROb2RlcykpO1xuICAgIHRoaXMuY2FuY2VsTm93TGlzdE5vZGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLm5vd0xpc3ROb2RlcykpO1xuICAgIHRoaXMuaXNEcm9wZG93blZpc2libGUgPSB0cnVlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgc3VibWl0R3JpZHMoKSB7XG4gICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMgPSBbXTtcbiAgICB0aGlzLm5vd0xpc3ROb2Rlcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5wdXNoKGl0ZW0udGl0bGUpO1xuICAgIH0pO1xuICAgIHRoaXMuc2F2ZVRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICB0aGlzLmluaXRUYWJsZSgpO1xuICAgIHRoaXMuaXNEcm9wZG93blZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8vIOS7jue8k+WtmOiuvue9ruWIl1xuICBzZXRDb2xzKCkge1xuICAgIHRoaXMuc2hvd0xpc3ROb2RlcyA9IGZhbHNlO1xuICAgIHRoaXMubm93TGlzdE5vZGVzID0gW107XG4gICAgdGhpcy5oaWRlTGlzdE5vZGVzID0gW107XG4gICAgaWYgKHRoaXMuaGFzQ29sc0NhY2hlKCkpIHtcbiAgICAgIGxldCB7IG5vdEluY29scywgaW5jb2xzIH0gPSB0aGlzLnRhYmxlQ29sc0NhY2hlLnJlZHVjZShcbiAgICAgICAgKGFjYywgaXRlbSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5pbmNsdWRlcyhpdGVtLnRpdGxlKSkge1xuICAgICAgICAgICAgYWNjLmluY29scy5wdXNoKGl0ZW0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY2Mubm90SW5jb2xzLnB1c2goaXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sXG4gICAgICAgIHsgbm90SW5jb2xzOiBbXSwgaW5jb2xzOiBbXSB9LFxuICAgICAgKTtcbiAgICAgIGluY29scy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMuaW5kZXhPZihhLnRpdGxlKSAtXG4gICAgICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMuaW5kZXhPZihiLnRpdGxlKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnRhYmxlQ29scyA9IGluY29scy5jb25jYXQobm90SW5jb2xzKTtcbiAgICB9XG5cbiAgICB0aGlzLnRhYmxlQ29scy5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzQ29sc0NhY2hlKCkpIHtcbiAgICAgICAgZWxlbWVudC5pc1Nob3cgPSB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scy5pbmNsdWRlcyhlbGVtZW50LnRpdGxlKVxuICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIGlmIChlbGVtZW50LmlzU2hvdykge1xuICAgICAgICAgIHRoaXMubm93TGlzdE5vZGVzLnB1c2goe1xuICAgICAgICAgICAgdGl0bGU6IGVsZW1lbnQudGl0bGUsXG4gICAgICAgICAgICBrZXk6IGVsZW1lbnQudGl0bGUsXG4gICAgICAgICAgICBkaXNhYmxlZDogZWxlbWVudC5maXhlZCA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgICAgIC8vIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY2hlY2tlZDogdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMuaW5jbHVkZXMoZWxlbWVudC50aXRsZSlcbiAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5oaWRlTGlzdE5vZGVzLnB1c2goe1xuICAgICAgICAgICAgdGl0bGU6IGVsZW1lbnQudGl0bGUsXG4gICAgICAgICAgICBrZXk6IGVsZW1lbnQudGl0bGUsXG4gICAgICAgICAgICBkaXNhYmxlZDogZWxlbWVudC5maXhlZCA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgICAgIC8vIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY2hlY2tlZDogdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMuaW5jbHVkZXMoZWxlbWVudC50aXRsZSlcbiAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuaXNTaG93ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMucHVzaCh7XG4gICAgICAgICAgdGl0bGU6IGVsZW1lbnQudGl0bGUsXG4gICAgICAgICAga2V5OiBlbGVtZW50LnRpdGxlLFxuICAgICAgICAgIGNoZWNrZWQ6IHRydWUsXG4gICAgICAgICAgLy8gc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgICAgICAgZGlzYWJsZWQ6IGVsZW1lbnQuZml4ZWQgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8g6LCD5pW05YiX5a695Li657yT5a2Y5a695bqmXG4gICAgaWYgKFxuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uICYmXG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzICYmXG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzLnNpemUgIT09IDBcbiAgICApIHtcbiAgICAgIHRoaXMudGFibGVDb2xzLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICBpZiAodGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocy5oYXMoY29sLnRpdGxlKSkge1xuICAgICAgICAgIGNvbC53aWR0aCA9IHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMuZ2V0KGNvbC50aXRsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuZGVhbENvbHMoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2hvd0xpc3ROb2RlcyA9IHRydWU7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvLyDmi5bmi73mk43kvZxcbiAgYmVmb3JlRHJvcCA9IChhcmc6IE56Rm9ybWF0QmVmb3JlRHJvcEV2ZW50KTogT2JzZXJ2YWJsZTxib29sZWFuPiA9PiB7XG4gICAgaWYgKFxuICAgICAgYXJnLm5vZGUub3JpZ2luLmRpc2FibGVkIHx8XG4gICAgICAhYXJnLmRyYWdOb2RlLm9yaWdpbi5jaGVja2VkIHx8XG4gICAgICBhcmcucG9zID09PSAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbm9kZTogVHJlZUdyaWQgPSBuZXcgVHJlZUdyaWQoKTtcbiAgICAgIG5vZGUuY2hlY2tlZCA9IGFyZy5kcmFnTm9kZS5vcmlnaW4uY2hlY2tlZDtcbiAgICAgIG5vZGUuZGlzYWJsZWQgPSBhcmcuZHJhZ05vZGUub3JpZ2luLmRpc2FibGVkO1xuICAgICAgbm9kZS5leHBhbmRlZCA9IGFyZy5kcmFnTm9kZS5vcmlnaW4uZXhwYW5kZWQ7XG4gICAgICBub2RlLmlzTGVhZiA9IGFyZy5kcmFnTm9kZS5vcmlnaW4uaXNMZWFmO1xuICAgICAgbm9kZS5rZXkgPSBhcmcuZHJhZ05vZGUub3JpZ2luLmtleTtcbiAgICAgIG5vZGUuc2VsZWN0YWJsZSA9IGFyZy5kcmFnTm9kZS5vcmlnaW4uc2VsZWN0YWJsZTtcbiAgICAgIG5vZGUudGl0bGUgPSBhcmcuZHJhZ05vZGUub3JpZ2luLnRpdGxlO1xuICAgICAgLy8g5ouW5ou95YWD57Sg5LiL5qCHXG4gICAgICBsZXQgZHJhZ05vZGVJbmRleCA9IHRoaXMubm93TGlzdE5vZGVzLmZpbmRJbmRleCgoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS50aXRsZSA9PSBhcmcuZHJhZ05vZGUub3JpZ2luLnRpdGxlO1xuICAgICAgfSk7XG4gICAgICAvLyDnm67moIfkvY3nva7nmoTkuIvmoIdcbiAgICAgIGxldCBub2RlSW5kZXggPVxuICAgICAgICB0aGlzLm5vd0xpc3ROb2Rlcy5maW5kSW5kZXgoKGl0ZW0pID0+IHtcbiAgICAgICAgICByZXR1cm4gaXRlbS50aXRsZSA9PSBhcmcubm9kZS5vcmlnaW4udGl0bGU7XG4gICAgICAgIH0pICsgKGFyZy5wb3MgPT09IC0xID8gMCA6IGFyZy5wb3MpO1xuICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMuc3BsaWNlKG5vZGVJbmRleCwgMCwgbm9kZSk7XG4gICAgICB0aGlzLm5vd0xpc3ROb2Rlcy5zcGxpY2UoXG4gICAgICAgIG5vZGVJbmRleCA+PSBkcmFnTm9kZUluZGV4ID8gZHJhZ05vZGVJbmRleCA6IGRyYWdOb2RlSW5kZXggKyAxLFxuICAgICAgICAxLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBvZih0cnVlKS5waXBlKGRlbGF5KDEwMCkpO1xuICAgIH1cbiAgfTtcblxuICBtb3ZlRWxlbWVudE5lYXJieShhcnIsIGVsZW1lbnRUb01vdmVUaXRsZSwgdGFyZ2V0RWxlbWVudFRpdGxlLCBwb3MpIHtcbiAgICBjb25zdCB0bXBBcnJheSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYXJyKSk7XG4gICAgY29uc3QgdGFyZ2V0SW5kZXggPSB0bXBBcnJheS5maW5kSW5kZXgoXG4gICAgICAoaXRlbSkgPT4gaXRlbS50aXRsZSA9PT0gdGFyZ2V0RWxlbWVudFRpdGxlLFxuICAgICk7XG4gICAgY29uc3QgZWxlbWVudEluZGV4ID0gdG1wQXJyYXkuZmluZEluZGV4KFxuICAgICAgKGl0ZW0pID0+IGl0ZW0udGl0bGUgPT09IGVsZW1lbnRUb01vdmVUaXRsZSxcbiAgICApO1xuICAgIGNvbnN0IG5ld0luZGV4ID0gcG9zIDwgMCA/IHRhcmdldEluZGV4ICsgcG9zIDogdGFyZ2V0SW5kZXg7XG4gICAgLy8g56e76Zmk55uu5qCH5YWD57Sg77yM5bm25o+S5YWl5Yiw5paw55qE5L2N572uXG4gICAgY29uc3QgcmVtb3ZlZEVsZW1lbnQgPSB0bXBBcnJheS5zcGxpY2UoZWxlbWVudEluZGV4LCAxKTtcbiAgICB0bXBBcnJheS5zcGxpY2UobmV3SW5kZXggKyAxLCAwLCByZW1vdmVkRWxlbWVudFswXSk7XG4gICAgcmV0dXJuIHRtcEFycmF5O1xuICB9XG5cbiAgLy8g5Yu+6YCJ5pON5L2cXG4gIGNoZWNrQWN0aW9uKGV2ZW50OiBOekZvcm1hdEVtaXRFdmVudCk6IHZvaWQge1xuICAgIC8vIOWLvumAieWPquacieWcqGhpZGVMaXN0Tm9kZXMs5Y+W5raI5Yu+6YCJ5Y+q5pyJ5Zyobm93TGlzdE5vZGVzXG4gICAgaWYgKGV2ZW50Lm5vZGUub3JpZ2luLmNoZWNrZWQpIHtcbiAgICAgIGxldCBub2RlOiBUcmVlR3JpZCA9IG5ldyBUcmVlR3JpZCgpO1xuICAgICAgbm9kZSA9IHRoaXMuaGlkZUxpc3ROb2Rlcy5maW5kKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLnRpdGxlID09PSBldmVudC5ub2RlLm9yaWdpbi50aXRsZTtcbiAgICAgIH0pO1xuICAgICAgbm9kZS5jaGVja2VkID0gdHJ1ZTtcbiAgICAgIC8vIOaJvuWIsOesrOS4gOS4qmZpeGVk5bGe5oCn5Li6cmlnaHTnmoR0aXRsZe+8jOaJvuWIsOaPkuWFpeWFg+e0oOeahOS9jee9rlxuICAgICAgbGV0IHRpdGxlID0gbnVsbDtcbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLnRhYmxlQ29sc0NhY2hlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmICh0aGlzLnRhYmxlQ29sc0NhY2hlW2ldLmZpeGVkID09PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgICB0aXRsZSA9IHRoaXMudGFibGVDb2xzQ2FjaGVbaV0udGl0bGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxldCB0ZW1wb3JhcnlOb2RlTGlzdCA9IHRoaXMubm93TGlzdE5vZGVzLnNsaWNlKDApO1xuICAgICAgaWYgKCF0aXRsZSkge1xuICAgICAgICB0ZW1wb3JhcnlOb2RlTGlzdC5wdXNoKG5vZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm5vd0xpc3ROb2Rlcy5maW5kSW5kZXgoXG4gICAgICAgICAgKG5vZGUpID0+IG5vZGUudGl0bGUgPT09IHRpdGxlLFxuICAgICAgICApO1xuICAgICAgICB0ZW1wb3JhcnlOb2RlTGlzdC5zcGxpY2UoaW5kZXgsIDAsIG5vZGUpO1xuICAgICAgfVxuICAgICAgdGhpcy5ub3dMaXN0Tm9kZXMgPSB0ZW1wb3JhcnlOb2RlTGlzdDtcbiAgICAgIHRoaXMuaGlkZUxpc3ROb2RlcyA9IHRoaXMuaGlkZUxpc3ROb2Rlcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udGl0bGUgIT09IGV2ZW50Lm5vZGUub3JpZ2luLnRpdGxlO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmICh0aGlzLmhpZGVMaXN0Tm9kZXMubGVuZ3RoID09PSAwICYmIHRoaXMudGFibGVDYWNoZU9wdGlvbiAmJiB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29scykge1xuICAgICAgLy8gICB0aGlzLmhpZGVMaXN0Tm9kZXMgPSB0aGlzLmdldEhpZGVMaXN0Tm9kZXMoKTtcbiAgICAgIC8vIH1cbiAgICAgIGxldCB0ZW1wb3JhcnlOb2RlTGlzdCA9IHRoaXMuaGlkZUxpc3ROb2Rlcy5zbGljZSgwKTtcbiAgICAgIHRoaXMubm93TGlzdE5vZGVzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0udGl0bGUgPT09IGV2ZW50Lm5vZGUub3JpZ2luLnRpdGxlKSB7XG4gICAgICAgICAgY29uc3QgaW5uZXJJdGVtID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShpdGVtKSk7XG4gICAgICAgICAgaW5uZXJJdGVtLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICB0ZW1wb3JhcnlOb2RlTGlzdC5wdXNoKGlubmVySXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5oaWRlTGlzdE5vZGVzID0gdGVtcG9yYXJ5Tm9kZUxpc3Q7XG5cbiAgICAgIC8vIOS4uuS6humYsuatouacqumAieaLqeeahOaVsOe7hOmhuuW6j+WboOS4unB1c2jmlrnms5XogIzmlLnlj5jvvIzpgJrov4fliJ3lp4vmlbDmja7ojrflj5bmmL7npLrnmoTlrZfmrrXliJfooahcbiAgICAgIHRoaXMubm93TGlzdE5vZGVzID0gdGhpcy5ub3dMaXN0Tm9kZXMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLnRpdGxlICE9PSBldmVudC5ub2RlLm9yaWdpbi50aXRsZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8vIOmYsuatouacqumAieaLqeeahOaVsOe7hOmhuuW6j+WboOS4unB1c2jmlrnms5XogIzmlLnlj5jvvIzku47liJ3lp4vmlbDmja7ojrflj5bpmpDol4/mnKrmmL7npLrnmoTlrZfmrrXliJfooahcbiAgZ2V0SGlkZUxpc3ROb2RlcygpOiBBcnJheTxUcmVlR3JpZD4ge1xuICAgIGxldCB0ZW1wb3JhcnlOb2RlTGlzdDogQXJyYXk8VHJlZUdyaWQ+ID0gW107XG4gICAgLy8g5LuOdGFibGVDb2xzQ2FjaGXph4zpnaLmib7msqHmnInlnKhzdG9yYWdl6YeM6Z2i5Ye6546w55qE5a2X5q61LOe7hOaIkGhpZGVMaXN0XG4gICAgdGhpcy50YWJsZUNvbHNDYWNoZS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpZiAoIXRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmluY2x1ZGVzKGl0ZW0udGl0bGUpKSB7XG4gICAgICAgIGxldCBub2RlSXRlbTogVHJlZUdyaWQgPSBuZXcgVHJlZUdyaWQoKTtcbiAgICAgICAgbm9kZUl0ZW0udGl0bGUgPSBpdGVtLnRpdGxlO1xuICAgICAgICBub2RlSXRlbS5rZXkgPSBpdGVtLnRpdGxlO1xuICAgICAgICBub2RlSXRlbS5kaXNhYmxlZCA9IGl0ZW0uZml4ZWQgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIG5vZGVJdGVtLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgdGVtcG9yYXJ5Tm9kZUxpc3QucHVzaChub2RlSXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRlbXBvcmFyeU5vZGVMaXN0O1xuICB9XG5cbiAgZGVhbENvbHMoKSB7XG4gICAgaWYgKCF0aGlzLnRhYmxlQ29sc1swXS5taW5XaWR0aCkge1xuICAgICAgdGhpcy50YWJsZUNvbHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIHNwYW4uc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgICAgIHNwYW4uc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIHNwYW4uc3R5bGUud2hpdGVTcGFjZSA9IFwibm93cmFwXCI7XG4gICAgICAgIHNwYW4uc3R5bGUuZm9udFNpemUgPSBcIjE0cHhcIjtcbiAgICAgICAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjsgLy8g5bCG5qC35byP5L+u5pS55Li6IGlubGluZS1ibG9ja1xuICAgICAgICBzcGFuLmlubmVyVGV4dCA9IGl0ZW0udGl0bGU7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gICAgICAgIGl0ZW0ubWluV2lkdGggPSBzcGFuLm9mZnNldFdpZHRoICsgMTY7XG4gICAgICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNwYW4pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIOWkhOeQhuW3puWPs+WQuOmZhOeahOaVsOaNruWcqOaVsOe7hOS4reeahOS9jee9rlxuICAgIGNvbnN0IGxlZnRGaXhlZENvbHMgPSB0aGlzLnRhYmxlQ29scy5maWx0ZXIoKGNvbCkgPT4gY29sLmZpeGVkID09PSBcImxlZnRcIik7XG4gICAgY29uc3QgcmlnaHRGaXhlZENvbHMgPSB0aGlzLnRhYmxlQ29scy5maWx0ZXIoXG4gICAgICAoY29sKSA9PiBjb2wuZml4ZWQgPT09IFwicmlnaHRcIixcbiAgICApO1xuICAgIGNvbnN0IG5vcm1hbENvbHMgPSB0aGlzLnRhYmxlQ29scy5maWx0ZXIoKGNvbCkgPT4gIWNvbC5maXhlZCk7XG4gICAgY29uc3QgcmVzdWx0Q29scyA9IGxlZnRGaXhlZENvbHMuY29uY2F0KG5vcm1hbENvbHMpLmNvbmNhdChyaWdodEZpeGVkQ29scyk7XG4gICAgdGhpcy50YWJsZUNvbHMgPSByZXN1bHRDb2xzO1xuICAgIGlmICghdGhpcy50YWJsZUNvbHNDYWNoZSB8fCB0aGlzLnRhYmxlQ29sc0NhY2hlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8g57yT5a2Y5LiA5LiL6KGo5qC855qE5pWw5o2uXG4gICAgICB0aGlzLnRhYmxlQ29sc0NhY2hlID0gWy4uLnRoaXMudGFibGVDb2xzXTtcbiAgICB9XG4gIH1cblxuICBub3JtYWxpemVUYWJsZUNhY2hlT3B0aW9uKCkge1xuICAgIGlmICghdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocykge1xuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgfSBlbHNlIGlmICghKHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xXaWR0aHMgaW5zdGFuY2VvZiBNYXApKSB7XG4gICAgICBjb25zdCBjb2xXaWR0aHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgT2JqZWN0LmtleXModGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGNvbFdpZHRocy5zZXQoa2V5LCAodGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocyBhcyBhbnkpW2tleV0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24uY29sV2lkdGhzID0gY29sV2lkdGhzO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFzQ29sc0NhY2hlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbiAmJlxuICAgICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbHMgJiZcbiAgICAgIHRoaXMudGFibGVDYWNoZU9wdGlvbi5jb2xzLmxlbmd0aCA+IDBcbiAgICApO1xuICB9XG5cbiAgc2F2ZVRhYmxlQ2FjaGVPcHRpb24oKSB7XG4gICAgdGhpcy5sb2NhbGZvcmFnZS5zZXRJdGVtKFxuICAgICAgXCJoZC10YWJsZV9cIiArXG4gICAgICAgIHRoaXMudXNlclNlc3Npb24udXNlckNvZGUgK1xuICAgICAgICBcIl9cIiArXG4gICAgICAgIHRoaXMubG9jYWx0aW9uVG1wICtcbiAgICAgICAgXCJfXCIgK1xuICAgICAgICB0aGlzLnV1aWQsXG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24sXG4gICAgKTtcbiAgfVxuXG4gIGp1ZGdlUmVwZWF0Q29scygpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGFibGVDb2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCB0aGlzLnRhYmxlQ29scy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAodGhpcy50YWJsZUNvbHNbaV0udGl0bGUgPT09IHRoaXMudGFibGVDb2xzW2pdLnRpdGxlKSB7XG4gICAgICAgICAgdGhyb3cgYGhkLXRhYmxl57uE5Lu25Lit5YiX5ZCNICR7dGhpcy50YWJsZUNvbHNbaV0udGl0bGV9IOmHjeWkjWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBvblJlc2l6ZSh7IHdpZHRoIH06IE56UmVzaXplRXZlbnQsIGNvbDogSGRUYWJsZUNvbHVtbik6IHZvaWQge1xuICAgIHRoaXMubm9ybWFsaXplVGFibGVDYWNoZU9wdGlvbigpO1xuICAgIGxldCB0ZW1wV2lkdGggPSAwO1xuICAgIGlmICh3aWR0aCA+IGNvbC5taW5XaWR0aCkge1xuICAgICAgdGVtcFdpZHRoID0gd2lkdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRlbXBXaWR0aCA9IGNvbC5taW5XaWR0aDtcbiAgICB9XG4gICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLmNvbFdpZHRocy5zZXQoY29sLnRpdGxlLCB0ZW1wV2lkdGgpO1xuICAgIHRoaXMuc2F2ZVRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICB0aGlzLnRhYmxlQ29scyA9IHRoaXMudGFibGVDb2xzLm1hcCgoZSkgPT5cbiAgICAgIGUudGl0bGUgPT09IGNvbC50aXRsZSA/IHsgLi4uZSwgd2lkdGg6IHRlbXBXaWR0aCB9IDogZSxcbiAgICApO1xuICAgIHRoaXMuZGVhbFNjcm9sbCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zeW5jVG90YWxGb290ZXJXaXRoQm9keSgpKTtcbiAgfVxuXG4gIGRlYWxPcGVyYXRlQnRuKCkge1xuICAgIGxldCBvcGVyYXRlQ29sID0gdGhpcy50YWJsZUNvbHMuZmluZCgoY29sKSA9PiBjb2wudGl0bGUgPT09IFwi5pON5L2cXCIpIHx8IG51bGw7XG4gICAgaWYgKG9wZXJhdGVDb2wpIHtcbiAgICAgIGxldCB0ZXh0U3RyID0gXCJcIjtcbiAgICAgIG9wZXJhdGVDb2wuYnRuTGlzdC5mb3JFYWNoKChidG4pID0+IHtcbiAgICAgICAgaWYgKCFidG4uaXNSZXBlYXQpIHtcbiAgICAgICAgICB0ZXh0U3RyICs9IHR5cGVvZiBidG4ubmFtZSA9PT0gXCJmdW5jdGlvblwiID8gXCLmk43kvZxcIiA6IGJ0bi5uYW1lO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuICAgICAgc3Bhbi5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgIHNwYW4uc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICBzcGFuLnN0eWxlLndoaXRlU3BhY2UgPSBcIm5vd3JhcFwiO1xuICAgICAgc3Bhbi5zdHlsZS5mb250U2l6ZSA9IFwiMTRweFwiO1xuICAgICAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjsgLy8g5bCG5qC35byP5L+u5pS55Li6IGlubGluZS1ibG9ja1xuICAgICAgc3Bhbi5pbm5lclRleHQgPSB0ZXh0U3RyO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzcGFuKTtcbiAgICAgIG9wZXJhdGVDb2wud2lkdGggPVxuICAgICAgICBzcGFuLm9mZnNldFdpZHRoICtcbiAgICAgICAgKG9wZXJhdGVDb2wuYnRuTGlzdC5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmlzUmVwZWF0KS5sZW5ndGggLSAxKSAqIDQgK1xuICAgICAgICAxNjtcbiAgICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzcGFuKTtcbiAgICB9XG4gIH1cblxuICB0cmlnZ2VyRXZlbnQoZm46IGFueSwgZXZlbnQ6IGFueSkge1xuICAgIGlmIChmbikge1xuICAgICAgZm4oZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIG5lZWRTaG93Q29uZmlybShidG46IE9wZXJhdGVCdG4sIGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgYnRuLnNob3dDb25maXJtID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBidG4uc2hvd0NvbmZpcm0oZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiAhIWJ0bi5zaG93Q29uZmlybTtcbiAgfVxuXG4gIGdldEJ0bk5hbWUoYnRuOiBPcGVyYXRlQnRuLCBkYXRhOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgYnRuLm5hbWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIGJ0bi5uYW1lKGRhdGEpIHx8IFwiXCI7XG4gICAgfVxuICAgIHJldHVybiBidG4ubmFtZSAhPSBudWxsID8gU3RyaW5nKGJ0bi5uYW1lKSA6IFwiXCI7XG4gIH1cblxuICBpc0RhbmdlckJ0bihidG46IE9wZXJhdGVCdG4sIGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldEJ0bk5hbWUoYnRuLCBkYXRhKSA9PT0gXCLliKDpmaRcIjtcbiAgfVxuXG4gIC8qKiDomZrmi5/mu5rliqjlvIDlkK/ml7bkvb/nlKjop4blj6PmnIDlpKfpq5jluqYgKi9cbiAgcHJpdmF0ZSBnZXRWaXJ0dWFsU2Nyb2xsWShtYXhPZmZzZXQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBjYWxjKDEwMHZoIC0gJHttYXhPZmZzZXR9cHgpYDtcbiAgfVxuXG4gIC8qXG4gICAqIOaoquWQkeW4g+WxgO+8iOWLvumAieWIl+mUgSA0MHB4IOeahOWFs+mUru+8iVxuICAgKlxuICAgKiDli77pgInliJflj6rmnInlnKggdGFibGUtbGF5b3V0OiBmaXhlZCDkuIvmiY3plIHlvpfkvY/vvJpuZy16b3JybyA4IOS7heWcqCBuelNjcm9sbC54IOacieWAvOaXtlxuICAgKiDnu5kgdGFibGUg5YqgIGFudC10YWJsZS1maXhlZO+8m2F1dG8g5biD5bGA5LiLIHRhYmxlIOWuvSAxMDAl44CB5q+P5YiX6YO95pyJIG56V2lkdGjvvIxcbiAgICog5Ymp5L2Z56m66Ze05Lya5oyJ5q+U5L6L5pGK5Yiw5omA5pyJ5YiX77yI5ZCr5Yu+6YCJ5YiX77yJ77yM5Y2V5YWD5qC85LiK55qEIG1heC13aWR0aCDkuZ/kuI3nlJ/mlYjjgIJcbiAgICog5omA5Lul5Y+q6KaB5pyJ5YiX77yI5peg6K665pyJ5rKh5pyJ5pWw5o2u77yJ5bCx5LiA5a6a6K6+572uIHNjcm9sbC5477yaXG4gICAqIC0g5YiX5bCR77yac2Nyb2xsLnggPSDlrrnlmajlrr3vvIzlt67pop3mjInlo7DmmI7lrr3mr5TkvovliIbliLDlkITkuJrliqHliJfvvIhmbHVpZO+8jOS4jeWHuuecn+aoqua7mu+8iVxuICAgKiAtIOWIl+Wkmu+8mnNjcm9sbC54ID0g5aOw5piO5oC75a6977yM5q2j5bi45qiq5ruaXG4gICAqIGxlc3Mg6YeM5Yu+6YCJ5YiX55qEIDQwcHgg5Y+q5pivIGZpeGVkIOW4g+WxgOS4i+eahOWFnOW6leOAglxuICAgKi9cblxuICAvKipcbiAgICog5oyJ5aOw5piO5YiX5a695ZCI6K6hICsg5a655Zmo5a69566X5Ye65qiq5ZCR5biD5bGA44CCXG4gICAqIOWIpOaWreOAjOaYr+WQpui2heWuveOAjeeUqCBvZmZzZXRXaWR0aO+8iOWQq+erlua7muadoeanve+8ie+8jOmBv+WFjeWPquWboOerlua7muadoeWwseivr+W8gOaoqua7mu+8m1xuICAgKiDooaXlrr3nm67moIfnlKggY2xpZW50V2lkdGgg5bm25ZCR5LiL5Y+W5pW077yM6YG/5YWN6KGo5a695aSaIDFweCDpgLzlh7rmqKrmu5rmnaHjgIJcbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUhvcml6b250YWxMYXlvdXQoXG4gICAgZGVjbGFyZWRDb2xXaWR0aDogbnVtYmVyLFxuICApOiBIZFRhYmxlSG9yaXpvbnRhbExheW91dCB7XG4gICAgaWYgKGRlY2xhcmVkQ29sV2lkdGggPD0gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2Nyb2xsWDogbnVsbCxcbiAgICAgICAgZmx1aWRFeHRyYTogMCxcbiAgICAgICAgZGlzcGxheVRvdGFsOiBkZWNsYXJlZENvbFdpZHRoLFxuICAgICAgICBpc0ZsdWlkOiBmYWxzZSxcbiAgICAgIH07XG4gICAgfVxuICAgIGxldCBjb21wYXJlV2lkdGggPSB0aGlzLm56VGFibGVDb21wb25lbnRcbiAgICAgID8gZ2V0VGFibGVTY3JvbGxYVmlld3BvcnRXaWR0aCh0aGlzLm56VGFibGVDb21wb25lbnQpXG4gICAgICA6IDA7XG4gICAgLy8g6KGo5L2T6L+Y5rKh5riy5p+T5Ye65p2l77yI5Yia6YeN5bu6IC8g5ZyoIHNwaW4g6YeM77yJ5pe255So5a6/5Li75a695YWc5bqVXG4gICAgaWYgKGNvbXBhcmVXaWR0aCA8PSAwICYmIHRoaXMuaG9zdEVsICYmIHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIGNvbXBhcmVXaWR0aCA9ICh0aGlzLmhvc3RFbC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5vZmZzZXRXaWR0aDtcbiAgICB9XG4gICAgLy8g5LuN6YeP5LiN5Yiw77yI5aaC5a6/5Li75ZyoIGRpc3BsYXk6bm9uZSDph4zvvInvvJrlhYjmjInlo7DmmI7lrr3otbAgZml4ZWTvvIznrYkgUmVzaXplT2JzZXJ2ZXIg6Kem5Y+R5YaN6L2sIGZsdWlkXG4gICAgaWYgKGNvbXBhcmVXaWR0aCA8PSAwKSB7XG4gICAgICByZXR1cm4gZml4ZWRMYXlvdXQoZGVjbGFyZWRDb2xXaWR0aCk7XG4gICAgfVxuICAgIC8vIDFweCDlrrnlt67vvIzpgb/lhY3kuprlg4/ntKDor6/liKRcbiAgICBpZiAoZGVjbGFyZWRDb2xXaWR0aCA+IGNvbXBhcmVXaWR0aCArIDEpIHtcbiAgICAgIHJldHVybiBmaXhlZExheW91dChkZWNsYXJlZENvbFdpZHRoKTtcbiAgICB9XG4gICAgY29uc3QgZmlsbFdpZHRoID0gdGhpcy5uelRhYmxlQ29tcG9uZW50XG4gICAgICA/IGdldFRhYmxlVmlld3BvcnRXaWR0aCh0aGlzLm56VGFibGVDb21wb25lbnQpXG4gICAgICA6IDA7XG4gICAgY29uc3QgY29udGFpbmVyV2lkdGggPSBNYXRoLmZsb29yKGZpbGxXaWR0aCA+IDAgPyBmaWxsV2lkdGggOiBjb21wYXJlV2lkdGgpO1xuICAgIHJldHVybiBmbHVpZExheW91dChjb250YWluZXJXaWR0aCwgZGVjbGFyZWRDb2xXaWR0aCk7XG4gIH1cblxuICAvKiog6KGo5qC85riy5p+T5ZCO5oyJ55yf5a6e5a655Zmo5a695qCh5q2j5qiq5ZCR5biD5bGA77yb5Y+q5pS5IHjvvIx5IOS/neaMgeS4jeWPmCAqL1xuICBwcml2YXRlIHN5bmNIb3Jpem9udGFsU2Nyb2xsKCk6IHZvaWQge1xuICAgIGNvbnN0IHByZXZIYXNYID0gISEodGhpcy5zY3JvbGwgJiYgdGhpcy5zY3JvbGwueCk7XG4gICAgY29uc3QgbGF5b3V0ID0gdGhpcy5yZXNvbHZlSG9yaXpvbnRhbExheW91dChcbiAgICAgIHRoaXMuZ2V0RGVjbGFyZWRDb2xXaWR0aFRvdGFsKCksXG4gICAgKTtcbiAgICBjb25zdCB1bmNoYW5nZWQgPVxuICAgICAgdGhpcy5zY3JvbGwgJiZcbiAgICAgIHRoaXMuc2Nyb2xsLnggPT09IGxheW91dC5zY3JvbGxYICYmXG4gICAgICB0aGlzLmZsdWlkRXh0cmFXaWR0aCA9PT0gbGF5b3V0LmZsdWlkRXh0cmEgJiZcbiAgICAgIHRoaXMuZmx1aWRIb3Jpem9udGFsID09PSBsYXlvdXQuaXNGbHVpZDtcbiAgICBpZiAodW5jaGFuZ2VkKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3luY1RvdGFsRm9vdGVyV2l0aEJvZHkoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYXBwbHlIb3Jpem9udGFsTGF5b3V0KGxheW91dCk7XG4gICAgdGhpcy5yZWZyZXNoU3RpY2t5T2Zmc2V0cygpO1xuICAgIHRoaXMuc2Nyb2xsID0geyB4OiBsYXlvdXQuc2Nyb2xsWCwgeTogdGhpcy5zY3JvbGwgPyB0aGlzLnNjcm9sbC55IDogbnVsbCB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIC8vIHgg5LuO5peg5Yiw5pyJ77yI5oiW5Y+N6L+H5p2l77yJ6KaB6YeN5bu65omN6IO95YiH5o2iIHRhYmxlLWxheW91dFxuICAgIGlmIChwcmV2SGFzWCAhPT0gISFsYXlvdXQuc2Nyb2xsWCkge1xuICAgICAgdGhpcy5hcHBseVRhYmxlU2Nyb2xsTW9kZSh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnN5bmNIZWFkZXJCb2R5U2Nyb2xsTGVmdCgpKTtcbiAgfVxuXG4gIC8qKiDmiYvliqjmiorooajkvZPmqKrlkJHmu5rliqjlkIzmraXliLDooajlpLQgLyDlkIjorqEgZm9vdGVy77yI5YWc5bqVIG5nLXpvcnJvIOebkeWQrOS4ouWkseeahOaDheWGte+8iSAqL1xuICBwcml2YXRlIHN5bmNIZWFkZXJCb2R5U2Nyb2xsTGVmdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubnpUYWJsZUNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBoZWFkZXIgPSAodGhpcy5uelRhYmxlQ29tcG9uZW50IGFzIGFueSlcbiAgICAgIC50YWJsZUhlYWRlck5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGNvbnN0IGJvZHkgPSB0aGlzLmdldFRhYmxlQm9keVNjcm9sbEVsKCk7XG4gICAgaWYgKHRoaXMuc2Nyb2xsICYmIHRoaXMuc2Nyb2xsLnggJiYgaGVhZGVyICYmIGJvZHkpIHtcbiAgICAgIGlmIChoZWFkZXIuc2Nyb2xsTGVmdCAhPT0gYm9keS5zY3JvbGxMZWZ0KSB7XG4gICAgICAgIGhlYWRlci5zY3JvbGxMZWZ0ID0gYm9keS5zY3JvbGxMZWZ0O1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN5bmNUb3RhbEZvb3RlcldpdGhCb2R5KCk7XG4gIH1cblxuICAvKiog5Y+W6KGo5L2T5qiq5ZCR5rua5Yqo5a655Zmo77yI6Jma5ouf5rua5Yqo5LyY5YWIIHZpZXdwb3J077yJICovXG4gIHByaXZhdGUgZ2V0VGFibGVCb2R5U2Nyb2xsRWwoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMubnpUYWJsZUNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1peCA9ICh0aGlzLm56VGFibGVDb21wb25lbnQgYXMgYW55KVxuICAgICAgLm1peFRhYmxlQm9keU5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmIChtaXgpIHtcbiAgICAgIHJldHVybiBtaXg7XG4gICAgfVxuICAgIGNvbnN0IGhvc3QgPSB0aGlzLmhvc3RFbCAmJiAodGhpcy5ob3N0RWwubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgaWYgKCFob3N0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIChob3N0LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIFwiY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0LmFudC10YWJsZS1ib2R5XCIsXG4gICAgICApIGFzIEhUTUxFbGVtZW50KSB8fFxuICAgICAgKGhvc3QucXVlcnlTZWxlY3RvcihcIi5hbnQtdGFibGUtYm9keVwiKSBhcyBIVE1MRWxlbWVudCkgfHxcbiAgICAgIG51bGxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUb3RhbEZvb3RlclNjcm9sbEVsKCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuaG9zdEVsICYmICh0aGlzLmhvc3RFbC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KTtcbiAgICByZXR1cm4gaG9zdFxuICAgICAgPyAoaG9zdC5xdWVyeVNlbGVjdG9yKFwiLmhkLXRhYmxlLXRvdGFsLWZvb3RlclwiKSBhcyBIVE1MRWxlbWVudClcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8qKiDooajkvZPmmK/lkKblh7rnjrDnurXlkJHmu5rliqjmnaHvvIjlkKvmu5rliqjmnaHmp73lrr3vvIkgKi9cbiAgcHJpdmF0ZSBib2R5SGFzVmVydGljYWxTY3JvbGxiYXIoYm9keTogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICBpZiAoIWJvZHkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIGJvZHkuc2Nyb2xsSGVpZ2h0ID4gYm9keS5jbGllbnRIZWlnaHQgKyAxIHx8XG4gICAgICBib2R5Lm9mZnNldFdpZHRoIC0gYm9keS5jbGllbnRXaWR0aCA+IDFcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOWQiOiuoSBmb290ZXIg5LiO6KGo5L2T6IGU5Yqo77yaXG4gICAqIC0gZmx1aWTvvIjliJfmnKrmkpHmu6HvvInvvJrkuI3mqKrmu5rjgIHkuI3mtYvlrr3vvIzooajlrr0gMTAwJSDkuI7ooajkvZPlkIzmr5Tkvovmi4nkvLjvvJtcbiAgICogLSBmaXhlZO+8iOaciSBzY3JvbGwueO+8ie+8muWQjOatpSBzY3JvbGxMZWZ077ybXG4gICAqIC0g5LuF5b2T6KGo5L2T5pyJ56uW5rua5p2h5pe26aKE55WZ5Y+z5L6n5qe977yM6KGM5bCR5peg56uW5rua5pe25LiN5Y2g5L2N44CCXG4gICAqL1xuICBwcml2YXRlIHN5bmNUb3RhbEZvb3RlcldpdGhCb2R5KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG93VGFibGVUb3RhbCkge1xuICAgICAgdGhpcy51bmJpbmRUb3RhbEZvb3RlclNjcm9sbFN5bmMoKTtcbiAgICAgIGlmICh0aGlzLnRvdGFsRm9vdGVyTmVlZFlHdXR0ZXIpIHtcbiAgICAgICAgdGhpcy50b3RhbEZvb3Rlck5lZWRZR3V0dGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmb290ZXIgPSB0aGlzLmdldFRvdGFsRm9vdGVyU2Nyb2xsRWwoKTtcbiAgICBjb25zdCBib2R5ID0gdGhpcy5nZXRUYWJsZUJvZHlTY3JvbGxFbCgpO1xuICAgIGlmICghZm9vdGVyKSB7XG4gICAgICBpZiAodGhpcy50b3RhbEZvb3RlclN5bmNSZXRyeSA8IDEwKSB7XG4gICAgICAgIHRoaXMudG90YWxGb290ZXJTeW5jUmV0cnkrKztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnN5bmNUb3RhbEZvb3RlcldpdGhCb2R5KCksIDUwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy50b3RhbEZvb3RlclN5bmNSZXRyeSA9IDA7XG4gICAgY29uc3QgbmVlZFlHdXR0ZXIgPSAhIShib2R5ICYmIHRoaXMuYm9keUhhc1ZlcnRpY2FsU2Nyb2xsYmFyKGJvZHkpKTtcbiAgICBpZiAodGhpcy50b3RhbEZvb3Rlck5lZWRZR3V0dGVyICE9PSBuZWVkWUd1dHRlcikge1xuICAgICAgdGhpcy50b3RhbEZvb3Rlck5lZWRZR3V0dGVyID0gbmVlZFlHdXR0ZXI7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNUb3RhbEZvb3RlckZsdWlkKSB7XG4gICAgICB0aGlzLnVuYmluZFRvdGFsRm9vdGVyU2Nyb2xsU3luYygpO1xuICAgICAgZm9vdGVyLnNjcm9sbExlZnQgPSAwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoYm9keSkge1xuICAgICAgdGhpcy5zeW5jVG90YWxGb290ZXJTY3JvbGxMZWZ0KGJvZHkuc2Nyb2xsTGVmdCk7XG4gICAgICB0aGlzLmJpbmRUb3RhbEZvb3RlclNjcm9sbFN5bmMoYm9keSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jVG90YWxGb290ZXJTY3JvbGxMZWZ0KHNjcm9sbExlZnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGZvb3RlciA9IHRoaXMuZ2V0VG90YWxGb290ZXJTY3JvbGxFbCgpO1xuICAgIGlmIChmb290ZXIgJiYgZm9vdGVyLnNjcm9sbExlZnQgIT09IHNjcm9sbExlZnQpIHtcbiAgICAgIGZvb3Rlci5zY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJpbmRUb3RhbEZvb3RlclNjcm9sbFN5bmMoYm9keTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvd1RhYmxlVG90YWwgfHwgIWJvZHkgfHwgdGhpcy5pc1RvdGFsRm9vdGVyRmx1aWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy50b3RhbEZvb3RlclNjcm9sbEJvdW5kQm9keSA9PT0gYm9keSAmJlxuICAgICAgdGhpcy50b3RhbEZvb3RlclNjcm9sbEhhbmRsZXJcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51bmJpbmRUb3RhbEZvb3RlclNjcm9sbFN5bmMoKTtcbiAgICB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsQm91bmRCb2R5ID0gYm9keTtcbiAgICB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHRoaXMuc3luY1RvdGFsRm9vdGVyU2Nyb2xsTGVmdChib2R5LnNjcm9sbExlZnQpO1xuICAgIH07XG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMudG90YWxGb290ZXJTY3JvbGxIYW5kbGVyLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgIH0gYXMgYW55KTtcbiAgfVxuXG4gIHByaXZhdGUgdW5iaW5kVG90YWxGb290ZXJTY3JvbGxTeW5jKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsQm91bmRCb2R5ICYmIHRoaXMudG90YWxGb290ZXJTY3JvbGxIYW5kbGVyKSB7XG4gICAgICB0aGlzLnRvdGFsRm9vdGVyU2Nyb2xsQm91bmRCb2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgIFwic2Nyb2xsXCIsXG4gICAgICAgIHRoaXMudG90YWxGb290ZXJTY3JvbGxIYW5kbGVyLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy50b3RhbEZvb3RlclNjcm9sbEJvdW5kQm9keSA9IG51bGw7XG4gICAgdGhpcy50b3RhbEZvb3RlclNjcm9sbEhhbmRsZXIgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOebkeWQrOeql+WPoyAvIOWuueWZqOWuveW6puWPmOWMlu+8mumHjeaWsOWIpOWumiBzY3JvbGwueO+8iGZsdWlk4oaUZml4ZWTvvInkuI7lkIjorqHlj7Pkvqfnq5bmu5rmp73vvIxcbiAgICog6YG/5YWN5ouJ5a69L+e8qeeqhOWxj+W5leWQjuWQiOiuoeihjOWuveS4juihqOS9k+mUmeS9jeOAglxuICAgKi9cbiAgcHJpdmF0ZSBiaW5kVmlld3BvcnRSZXNpemVTeW5jKCk6IHZvaWQge1xuICAgIHRoaXMuYm91bmRPblZpZXdwb3J0UmVzaXplID0gKCkgPT4gdGhpcy5zY2hlZHVsZVZpZXdwb3J0U2Nyb2xsU3luYygpO1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLmJvdW5kT25WaWV3cG9ydFJlc2l6ZSk7XG4gICAgfVxuICAgIGNvbnN0IFJPID1cbiAgICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyAod2luZG93IGFzIGFueSkuUmVzaXplT2JzZXJ2ZXIgOiBudWxsO1xuICAgIGlmIChSTyAmJiB0aGlzLmhvc3RFbCAmJiB0aGlzLmhvc3RFbC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICB0aGlzLmhvc3RSZXNpemVPYnNlcnZlciA9IG5ldyBSTygoKSA9PiB0aGlzLnNjaGVkdWxlVmlld3BvcnRTY3JvbGxTeW5jKCkpO1xuICAgICAgdGhpcy5ob3N0UmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmhvc3RFbC5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVuYmluZFZpZXdwb3J0UmVzaXplU3luYygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ib3VuZE9uVmlld3BvcnRSZXNpemUgJiYgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5ib3VuZE9uVmlld3BvcnRSZXNpemUpO1xuICAgIH1cbiAgICB0aGlzLmJvdW5kT25WaWV3cG9ydFJlc2l6ZSA9IG51bGw7XG4gICAgaWYgKHRoaXMuaG9zdFJlc2l6ZU9ic2VydmVyKSB7XG4gICAgICB0aGlzLmhvc3RSZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICB0aGlzLmhvc3RSZXNpemVPYnNlcnZlciA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnZpZXdwb3J0UmVzaXplVGltZXIgIT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudmlld3BvcnRSZXNpemVUaW1lcik7XG4gICAgICB0aGlzLnZpZXdwb3J0UmVzaXplVGltZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVWaWV3cG9ydFNjcm9sbFN5bmMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlld3BvcnRSZXNpemVUaW1lciAhPSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy52aWV3cG9ydFJlc2l6ZVRpbWVyKTtcbiAgICB9XG4gICAgdGhpcy52aWV3cG9ydFJlc2l6ZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnZpZXdwb3J0UmVzaXplVGltZXIgPSBudWxsO1xuICAgICAgaWYgKCF0aGlzLnRhYmxlQ29scyB8fCAhdGhpcy50YWJsZUNvbHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3luY0hvcml6b250YWxTY3JvbGwoKTtcbiAgICAgIC8vIOetieihqOS9k+W4g+WxgOeos+WumuWQjuWGjeagoeWQiOiuoeerlua7muanvSAvIOaoqua7muWQjOatpVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnN5bmNUb3RhbEZvb3RlcldpdGhCb2R5KCksIDUwKTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIOW3pi/lj7Plhrvnu5PlgY/np7vmjInlsZXnpLrlrr3ntK/orqHvvIhmbHVpZCDmr5TkvovooaXlrr3lkI7lkITliJflj5jlrr3vvIzkuI3og73lho3nlKjlo7DmmI7lrr3vvInjgIJcbiAgICog6aG75ZyoIGFwcGx5SG9yaXpvbnRhbExheW91dCDkuYvlkI7osIPnlKjjgIJcbiAgICovXG4gIHByaXZhdGUgcmVmcmVzaFN0aWNreU9mZnNldHMoKTogdm9pZCB7XG4gICAgbGV0IGxlZnRPZmZzZXQgPSAwO1xuICAgIGlmICh0aGlzLnNob3dTZWxlY3RlZCkge1xuICAgICAgbGVmdE9mZnNldCArPSBTRUxFQ1RfQ09MX1dJRFRIO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG93VGFibGVUb3RhbCkge1xuICAgICAgbGVmdE9mZnNldCArPSB0aGlzLmxpbmVOdW1iZXJDb2xXaWR0aDtcbiAgICB9XG4gICAgKHRoaXMudGFibGVDb2xzIHx8IFtdKS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpZiAoIWl0ZW0ud2lkdGgpIHtcbiAgICAgICAgaXRlbS53aWR0aCA9IENvbFdpZHRoLmZpeENvbFdpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNDb2xWaXNpYmxlKGl0ZW0pKSB7XG4gICAgICAgIGl0ZW0uZml4ZWRXaWR0aCA9IGxlZnRPZmZzZXQ7XG4gICAgICAgIGxlZnRPZmZzZXQgKz0gdGhpcy5nZXRDb2xEaXNwbGF5V2lkdGgoaXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsZXQgcmlnaHRPZmZzZXQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAodGhpcy50YWJsZUNvbHMgfHwgW10pLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy50YWJsZUNvbHNbaV07XG4gICAgICBpZiAoIXRoaXMuaXNDb2xWaXNpYmxlKGl0ZW0pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW0uZml4ZWQgPT09IFwicmlnaHRcIikge1xuICAgICAgICBpdGVtLmZpeGVkUmlnaHRXaWR0aCA9IHJpZ2h0T2Zmc2V0O1xuICAgICAgICByaWdodE9mZnNldCArPSB0aGlzLmdldENvbERpc3BsYXlXaWR0aChpdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW0uZml4ZWRSaWdodFdpZHRoID0gMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkZWFsU2Nyb2xsKCkge1xuICAgICh0aGlzLnRhYmxlQ29scyB8fCBbXSkuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKCFpdGVtLndpZHRoKSB7XG4gICAgICAgIGl0ZW0ud2lkdGggPSBDb2xXaWR0aC5maXhDb2xXaWR0aDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGxheW91dCA9IHRoaXMucmVzb2x2ZUhvcml6b250YWxMYXlvdXQoXG4gICAgICB0aGlzLmdldERlY2xhcmVkQ29sV2lkdGhUb3RhbCgpLFxuICAgICk7XG4gICAgdGhpcy5hcHBseUhvcml6b250YWxMYXlvdXQobGF5b3V0KTtcbiAgICB0aGlzLnJlZnJlc2hTdGlja3lPZmZzZXRzKCk7XG4gICAgY29uc3QgbWF4T2Zmc2V0ID0gdGhpcy5nZXRTY3JvbGxZTWF4T2Zmc2V0KCk7XG4gICAgY29uc3QgdXNlVmlydHVhbCA9IHRoaXMudXNlVmlydHVhbFNjcm9sbDtcbiAgICBjb25zdCBzY3JvbGxYID0gbGF5b3V0LnNjcm9sbFg7XG5cbiAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsICYmICF1c2VWaXJ0dWFsKSB7XG4gICAgICB0aGlzLnNjcm9sbCA9IHtcbiAgICAgICAgeDogc2Nyb2xsWCxcbiAgICAgICAgeTogbnVsbCxcbiAgICAgIH07XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZpcnR1YWxTY3JvbGwpIHtcbiAgICAgIHRoaXMuc2Nyb2xsID0ge1xuICAgICAgICB4OiBzY3JvbGxYLFxuICAgICAgICB5OiBgY2FsYygxMDB2aCAtICR7bWF4T2Zmc2V0fXB4KWAsXG4gICAgICB9O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2Nyb2xsID0ge1xuICAgICAgeDogc2Nyb2xsWCxcbiAgICAgIHk6IHRoaXMuZ2V0VmlydHVhbFNjcm9sbFkobWF4T2Zmc2V0KSxcbiAgICB9O1xuICB9XG5cbiAgLy8g6KGo5qC85Yu+6YCJ6YC76L6RXG4gIGN1cnJlbnRQYWdlRGF0YUNoYW5nZSgkZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubGlzdE9mRGlzcGxheURhdGEgPSAkZXZlbnQ7XG4gICAgdGhpcy5yZWZyZXNoU3RhdHVzKCk7XG4gICAgaWYgKCF0aGlzLmlzQ3Jvc3NQYWdlU2VsZWN0TG9jYWwpIHtcbiAgICAgIHRoaXMucmVzZXRTdGF0dXMoKTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBzZWFyY2gocmVzZXQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMucGFnaW5hdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyDliY3nq6/liIbpobXvvJrlj6rlkIzmraXpobXnoIEv5p2h5pWw77yM5LiN6Kem5Y+R54i257uE5Lu25p+l6K+iXG4gICAgaWYgKHRoaXMuZnJvbnRQYWdpbmF0aW9uKSB7XG4gICAgICBpZiAocmVzZXQpIHtcbiAgICAgICAgdGhpcy50YWJsZVBhZ2VJbmRleCA9IDE7XG4gICAgICAgIHRoaXMudGFibGVQYWdlU2l6ZUNoYW5nZS5lbWl0KHRoaXMudGFibGVQYWdlU2l6ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRhYmxlUGFnZUluZGV4Q2hhbmdlLmVtaXQodGhpcy50YWJsZVBhZ2VJbmRleCk7XG4gICAgICB9XG4gICAgICB0aGlzLnRhYmxlQ2FjaGVPcHRpb24ucGFnZVNpemUgPSB0aGlzLnRhYmxlUGFnZVNpemU7XG4gICAgICB0aGlzLnNhdmVUYWJsZUNhY2hlT3B0aW9uKCk7XG4gICAgICAvLyDmjInlvZPliY3pobXooYzmlbDph43nrpfmmK/lkKbpnIDopoEgc2Nyb2xsLnnvvIjmnKvpobXmlbDmja7lsJHml7bljrvmjonlm7rlrprpq5jluqbvvIzpgb/lhY3nlZnnmb3vvIlcbiAgICAgIHRoaXMucGVuZGluZ1Jlc2V0U2Nyb2xsVG9wID0gdHJ1ZTtcbiAgICAgIHRoaXMuYXBwbHlUYWJsZVNjcm9sbE1vZGUoZmFsc2UpO1xuICAgICAgdGhpcy5zY2hlZHVsZVJlc2V0VGFibGVCb2R5U2Nyb2xsVG9wKCk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy50YWJsZUNhY2hlT3B0aW9uLnBhZ2VTaXplID0gdGhpcy50YWJsZVBhZ2VTaXplO1xuICAgIHRoaXMuc2F2ZVRhYmxlQ2FjaGVPcHRpb24oKTtcbiAgICBpZiAocmVzZXQpIHtcbiAgICAgIHRoaXMudGFibGVQYWdlU2l6ZUNoYW5nZS5lbWl0KHRoaXMudGFibGVQYWdlU2l6ZSk7XG4gICAgICB0aGlzLnRhYmxlUGFnZVNpemVDaGFuZ2VFdmVudC5lbWl0KHRoaXMudGFibGVQYWdlU2l6ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGFibGVQYWdlSW5kZXhDaGFuZ2UuZW1pdCh0aGlzLnRhYmxlUGFnZUluZGV4KTtcbiAgICAgIC8vIOinpuWPkeeItue7hOS7tuafpeivouS6i+S7tlxuICAgICAgdGhpcy50YWJsZVNlYXJjaEV2ZW50LmVtaXQocmVzZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlupXpg6jlkIjorqHvvJrkuI4gaGQtZGV0YWlsLWxpbmVzIOebuOWQjO+8jOS9v+eUqCBUb3RhbE9wdGlvbu+8iGluc2VydEluZGV4IC8gaW5zZXJ0VmFsdWXvvInjgIJcbiAgICog5byA5ZCv5ZCO5by65Yi25bGV56S65bqP5Y+35YiX77yM44CM5ZCI6K6h44CN6JC95Zyo5bqP5Y+35YiX5LiL77ybXG4gICAqIGluc2VydEluZGV4IOS7jiAxIOi1t+WvueW6lOWPr+ingeaVsOaNruWIl++8m+acquS8oCBpbnNlcnRWYWx1ZSDml7bmjInor6XliJcgbmFtZSDlr7kgY29udGVudCDmsYLlkozjgIJcbiAgICovXG4gIGNhbGN1bGF0ZVRhYmxlVG90YWwoKSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuc2hvd1RhYmxlVG90YWwgfHxcbiAgICAgICF0aGlzLnRhYmxlVG90YWxPcHRpb24gfHxcbiAgICAgICF0aGlzLnRhYmxlVG90YWxPcHRpb24ubGVuZ3RoXG4gICAgKSB7XG4gICAgICB0aGlzLnRhYmxlVG90YWxPcHRpb25MaXN0ID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZpc2libGVDb2xzID0gKHRoaXMudGFibGVDb2xzIHx8IFtdKS5maWx0ZXIoXG4gICAgICAoYykgPT4gYyAmJiBjLmlzU2hvdyAhPT0gZmFsc2UsXG4gICAgKTtcbiAgICAvLyBjb2x1bW5zTnVtYmVyIOWQq+W6j+WPt+WIl++8iOS4jiBkZXRhaWwtbGluZXMg5LiA6Ie077yJ77yM5pWw5o2u5qe95L2N5pWwID0gY29sdW1uc051bWJlciAtIDFcbiAgICBjb25zdCBjb25maWd1cmVkID0gTnVtYmVyKHRoaXMuY29sdW1uc051bWJlcik7XG4gICAgY29uc3QgY29sdW1uTnVtYmVyID1cbiAgICAgIGNvbmZpZ3VyZWQgPiAxXG4gICAgICAgID8gY29uZmlndXJlZCAtIDFcbiAgICAgICAgOiBjb25maWd1cmVkID09PSAxXG4gICAgICAgICAgPyAxXG4gICAgICAgICAgOiB2aXNpYmxlQ29scy5sZW5ndGg7XG4gICAgaWYgKCFjb2x1bW5OdW1iZXIgfHwgY29sdW1uTnVtYmVyIDwgMSkge1xuICAgICAgdGhpcy50YWJsZVRvdGFsT3B0aW9uTGlzdCA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRhYmxlVG90YWxPcHRpb25MaXN0ID0gbmV3IEFycmF5KGNvbHVtbk51bWJlcikuZmlsbChcIlwiKTtcbiAgICBjb25zdCBjb250ZW50ID1cbiAgICAgIHRoaXMudGFibGVEYXRhICYmIHRoaXMudGFibGVEYXRhLmNvbnRlbnQgPyB0aGlzLnRhYmxlRGF0YS5jb250ZW50IDogW107XG4gICAgdGhpcy50YWJsZVRvdGFsT3B0aW9uLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtID09IG51bGwgfHwgIWl0ZW0uaW5zZXJ0SW5kZXggfHwgaXRlbS5pbnNlcnRJbmRleCA8IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IHZhbHVlOiBhbnkgPSBpdGVtLmluc2VydFZhbHVlO1xuICAgICAgLy8g5pyq5LygIGluc2VydFZhbHVlIOaXtu+8muaMiSBpbnNlcnRJbmRleCDlr7nlupTlj6/op4HliJcgbmFtZSDoh6rliqjmsYLlkoxcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgIGNvbnN0IGNvbCA9IHZpc2libGVDb2xzW2l0ZW0uaW5zZXJ0SW5kZXggLSAxXTtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjb2wgJiYgdHlwZW9mIGNvbC5uYW1lID09PSBcInN0cmluZ1wiID8gY29sLm5hbWUgOiBudWxsO1xuICAgICAgICBpZiAoIWZpZWxkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBsZXQgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgY29udGVudC5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgICBjb25zdCByYXcgPSByb3cgPyByb3dbZmllbGRdIDogbnVsbDtcbiAgICAgICAgICBpZiAocmF3ID09IG51bGwgfHwgcmF3ID09PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG51bSA9IE51bWJlcihyYXcpO1xuICAgICAgICAgIGlmICghaXNOYU4obnVtKSkge1xuICAgICAgICAgICAgc3VtICs9IG51bTtcbiAgICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWhhc1ZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gc3VtO1xuICAgICAgfVxuICAgICAgY29uc3QgY29sQXRJbmRleCA9IHZpc2libGVDb2xzW2l0ZW0uaW5zZXJ0SW5kZXggLSAxXTtcbiAgICAgIHRoaXMudGFibGVUb3RhbE9wdGlvbkxpc3RbaXRlbS5pbnNlcnRJbmRleCAtIDFdID0ge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgYWxpZ246IGl0ZW0uYWxpZ24gfHwgKGNvbEF0SW5kZXggJiYgY29sQXRJbmRleC5hbGlnbikgfHwgXCJsZWZ0XCIsXG4gICAgICAgIHNob3dEZWNpbWFsOiBpdGVtLnNob3dEZWNpbWFsIHx8IGZhbHNlLFxuICAgICAgICBwcmVzZXJ2ZU51bWJlcjogaXRlbS5wcmVzZXJ2ZU51bWJlciAhPSBudWxsID8gaXRlbS5wcmVzZXJ2ZU51bWJlciA6IDIsXG4gICAgICAgIGlzSGlkZTogaXRlbS5pc0hpZGUgfHwgZmFsc2UsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUYWJsZVRvdGFsQ2VsbE1ldGEoY29sOiBIZFRhYmxlQ29sdW1uLCBjb2xJbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBpZiAoXG4gICAgICAhY29sIHx8XG4gICAgICAhdGhpcy50YWJsZVRvdGFsT3B0aW9uTGlzdCB8fFxuICAgICAgIXRoaXMudGFibGVUb3RhbE9wdGlvbkxpc3QubGVuZ3RoXG4gICAgKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgbGV0IHZpc2libGVJbmRleCA9IC0xO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGNvbEluZGV4OyBpKyspIHtcbiAgICAgIGNvbnN0IGMgPSB0aGlzLnRhYmxlQ29sc1tpXTtcbiAgICAgIGlmIChjICYmIGMuaXNTaG93ICE9PSBmYWxzZSkge1xuICAgICAgICB2aXNpYmxlSW5kZXgrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHZpc2libGVJbmRleCA8IDAgfHwgdmlzaWJsZUluZGV4ID49IHRoaXMudGFibGVUb3RhbE9wdGlvbkxpc3QubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWV0YSA9IHRoaXMudGFibGVUb3RhbE9wdGlvbkxpc3RbdmlzaWJsZUluZGV4XTtcbiAgICByZXR1cm4gbWV0YSAmJiB0eXBlb2YgbWV0YSA9PT0gXCJvYmplY3RcIiA/IG1ldGEgOiBudWxsO1xuICB9XG5cbiAgLyoqIOWQiOiuoeWNleWFg+agvOWxleekuuaWh+ahiO+8iOWvuem9kCBkZXRhaWwtbGluZXMg5bCP5pWw6KeE5YiZ77yJICovXG4gIGdldFRhYmxlVG90YWxDZWxsVmFsdWUoY29sOiBIZFRhYmxlQ29sdW1uLCBjb2xJbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXRUYWJsZVRvdGFsQ2VsbE1ldGEoY29sLCBjb2xJbmRleCk7XG4gICAgaWYgKCFtZXRhIHx8IG1ldGEuaXNIaWRlKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBtZXRhLnZhbHVlO1xuICAgIGlmICghKHZhbHVlIHx8IHZhbHVlID09PSAwKSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGNvbnN0IHByZXNlcnZlID1cbiAgICAgIG1ldGEucHJlc2VydmVOdW1iZXIgIT0gbnVsbCA/IE51bWJlcihtZXRhLnByZXNlcnZlTnVtYmVyKSA6IDI7XG4gICAgaWYgKHZhbHVlICUgMSA9PT0gMCAmJiAhbWV0YS5zaG93RGVjaW1hbCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBmYWN0b3IgPSBNYXRoLnBvdygxMCwgcHJlc2VydmUpO1xuICAgIHJldHVybiAoTWF0aC5yb3VuZChOdW1iZXIodmFsdWUpICogZmFjdG9yKSAvIGZhY3RvcikudG9GaXhlZChwcmVzZXJ2ZSk7XG4gIH1cblxuICBnZXRUYWJsZVRvdGFsQ2VsbEFsaWduKGNvbDogSGRUYWJsZUNvbHVtbiwgY29sSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0VGFibGVUb3RhbENlbGxNZXRhKGNvbCwgY29sSW5kZXgpO1xuICAgIGNvbnN0IGFsaWduID0gKG1ldGEgJiYgbWV0YS5hbGlnbikgfHwgKGNvbCAmJiBjb2wuYWxpZ24pIHx8IFwibGVmdFwiO1xuICAgIGlmIChhbGlnbiA9PT0gXCJyaWdodFwiIHx8IGFsaWduID09PSBcImNlbnRlclwiIHx8IGFsaWduID09PSBcImxlZnRcIikge1xuICAgICAgcmV0dXJuIGFsaWduO1xuICAgIH1cbiAgICByZXR1cm4gXCJsZWZ0XCI7XG4gIH1cblxuICAvKiog5bqV6YOo44CM5YWxIG4g5p2h44CN77ya6Z2e5YiG6aG1L+WJjeerr+WIhumhteeUqCBjb250ZW50Lmxlbmd0aO+8jOacjeWKoeerr+WIhumhteeUqCB0b3RhbEVsZW1lbnRzICovXG4gIGdldFRhYmxlVG90YWxDb3VudCgpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy50YWJsZURhdGEpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBpZiAoIXRoaXMucGFnaW5hdGlvbiB8fCB0aGlzLmZyb250UGFnaW5hdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMudGFibGVEYXRhLmNvbnRlbnQgPyB0aGlzLnRhYmxlRGF0YS5jb250ZW50Lmxlbmd0aCA6IDA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRhYmxlRGF0YS50b3RhbEVsZW1lbnRzICE9IG51bGxcbiAgICAgID8gdGhpcy50YWJsZURhdGEudG90YWxFbGVtZW50c1xuICAgICAgOiAwO1xuICB9XG5cbiAgcmVzZXRTdGF0dXMoKSB7XG4gICAgdGhpcy5pc0FsbERpc3BsYXlEYXRhQ2hlY2tlZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNJbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgLy8g5YWI5pi+5byP572uIGZhbHNl77yM6YG/5YWNIG56LWNoZWNrYm94IOWGhemDqOeKtuaAgeS4jiBtYXBPZkNoZWNrZWRJZCDkuI3lkIzmraXvvIjomZrmi5/mu5rliqjlpI3nlKjooYzml7bluLjop4HvvIlcbiAgICBPYmplY3Qua2V5cyh0aGlzLm1hcE9mQ2hlY2tMaXN0KS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIHRoaXMubWFwT2ZDaGVja2VkSWRba2V5XSA9IGZhbHNlO1xuICAgIH0pO1xuICAgIHRoaXMubGlzdE9mRGlzcGxheURhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gaXRlbVt0aGlzLnNlbGVjdEZpZWxkXTtcbiAgICAgIGlmIChrZXkgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLm1hcE9mQ2hlY2tlZElkW2tleV0gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm1hcE9mQ2hlY2tlZElkID0ge307XG4gICAgdGhpcy5tYXBPZkNoZWNrTGlzdCA9IHt9O1xuICAgIHRoaXMuc2VsZWN0RXZlbnQuZW1pdChbXSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiog5Y2V6YCJ77ya6YCJ5Lit5b2T5YmN6KGM5bm25riF5o6J5YW25a6D6KGM77yb5b+955WlIHJhZGlvIOWboOWIh+aNouiAjOWPkeWHuueahCBmYWxzZSAqL1xuICBvblJhZGlvU2VsZWN0KGNoZWNrZWQ6IGJvb2xlYW4sIGRhdGE6IGFueSk6IHZvaWQge1xuICAgIGlmICghY2hlY2tlZCB8fCAhZGF0YSkge1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmlzU2VsZWN0RGlzYWJsZWQoZGF0YSkpIHtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBkYXRhW3RoaXMuc2VsZWN0RmllbGRdO1xuICAgIHRoaXMubWFwT2ZDaGVja2VkSWQgPSB7fTtcbiAgICB0aGlzLm1hcE9mQ2hlY2tMaXN0ID0ge307XG4gICAgaWYgKGtleSAhPSBudWxsKSB7XG4gICAgICB0aGlzLm1hcE9mQ2hlY2tlZElkW2tleV0gPSB0cnVlO1xuICAgICAgdGhpcy5tYXBPZkNoZWNrTGlzdFtrZXldID0gZGF0YTtcbiAgICB9XG4gICAgdGhpcy5pc0FsbERpc3BsYXlEYXRhQ2hlY2tlZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNJbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuc2VsZWN0RXZlbnQpIHtcbiAgICAgIHRoaXMuc2VsZWN0RXZlbnQuZW1pdChrZXkgIT0gbnVsbCA/IFtkYXRhXSA6IFtdKTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICByZWZyZXNoU3RhdHVzKGV2ZW50OiBib29sZWFuID0gZmFsc2UsIGRhdGE6IGFueSA9IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RUeXBlID09PSBcInJhZGlvXCIpIHtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIHRoaXMub25SYWRpb1NlbGVjdChldmVudCwgZGF0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChkYXRhKSB7XG4gICAgICAvLyDnpoHnlKjooYzkuI3lhYHorrjli77pgInvvJvlj5bmtojli77pgInku43lhYHorrjvvIjkvovlpoLmlbDmja7lj5jmm7TliY3lt7Lli77pgInvvIlcbiAgICAgIGlmIChldmVudCAmJiB0aGlzLmlzU2VsZWN0RGlzYWJsZWQoZGF0YSkpIHtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubWFwT2ZDaGVja2VkSWRbZGF0YVt0aGlzLnNlbGVjdEZpZWxkXV0gPSBldmVudDtcbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICAhdGhpcy5tYXBPZkNoZWNrTGlzdFtkYXRhW3RoaXMuc2VsZWN0RmllbGRdXSAmJlxuICAgICAgICAgICh0aGlzLm1hcE9mQ2hlY2tMaXN0W2RhdGFbdGhpcy5zZWxlY3RGaWVsZF1dID0gZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1hcE9mQ2hlY2tMaXN0W2RhdGFbdGhpcy5zZWxlY3RGaWVsZF1dICYmXG4gICAgICAgICAgZGVsZXRlIHRoaXMubWFwT2ZDaGVja0xpc3RbZGF0YVt0aGlzLnNlbGVjdEZpZWxkXV07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGFibGVMaXN0ID0gdGhpcy5saXN0T2ZEaXNwbGF5RGF0YS5maWx0ZXIoXG4gICAgICAoaXRlbSkgPT4gIXRoaXMuaXNTZWxlY3REaXNhYmxlZChpdGVtKSxcbiAgICApO1xuICAgIHRoaXMuaXNBbGxEaXNwbGF5RGF0YUNoZWNrZWQgPVxuICAgICAgc2VsZWN0YWJsZUxpc3QubGVuZ3RoID4gMCAmJlxuICAgICAgc2VsZWN0YWJsZUxpc3QuZXZlcnkoXG4gICAgICAgIChpdGVtKSA9PiB0aGlzLm1hcE9mQ2hlY2tlZElkW2l0ZW1bdGhpcy5zZWxlY3RGaWVsZF1dLFxuICAgICAgKTtcbiAgICB0aGlzLmlzSW5kZXRlcm1pbmF0ZSA9XG4gICAgICBzZWxlY3RhYmxlTGlzdC5zb21lKFxuICAgICAgICAoaXRlbSkgPT4gdGhpcy5tYXBPZkNoZWNrZWRJZFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXSxcbiAgICAgICkgJiYgIXRoaXMuaXNBbGxEaXNwbGF5RGF0YUNoZWNrZWQ7XG4gICAgLy8g6Kem5Y+Rc2VsZWN05LqL5Lu2XG4gICAgaWYgKHRoaXMuc2VsZWN0RXZlbnQpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkTGlzdDogQXJyYXk8YW55PiA9IE9iamVjdC52YWx1ZXModGhpcy5tYXBPZkNoZWNrTGlzdCk7XG4gICAgICB0aGlzLnNlbGVjdEV2ZW50LmVtaXQoc2VsZWN0ZWRMaXN0KTtcbiAgICB9XG4gICAgLy8g5aaC5p6c5pWw5o2u5Li656m677yM5YiZ5riF56m65Yu+6YCJ5qCH6K+GXG4gICAgaWYgKHRoaXMudGFibGVEYXRhLmNvbnRlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmlzQWxsRGlzcGxheURhdGFDaGVja2VkID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgY2hlY2tBbGwodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RPZkRpc3BsYXlEYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIC8vIOWFqOmAiS/lj5bmtojlhajpgInlnYfot7Pov4fnpoHnlKjooYzvvIjnpoHnlKjooYzkv53mjIHljp/li77pgInnirbmgIHvvIlcbiAgICAgIGlmICh0aGlzLmlzU2VsZWN0RGlzYWJsZWQoaXRlbSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICF0aGlzLm1hcE9mQ2hlY2tMaXN0W2l0ZW1bdGhpcy5zZWxlY3RGaWVsZF1dICYmXG4gICAgICAgICAgKHRoaXMubWFwT2ZDaGVja0xpc3RbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0gPSBpdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWFwT2ZDaGVja0xpc3RbaXRlbVt0aGlzLnNlbGVjdEZpZWxkXV0gJiZcbiAgICAgICAgICBkZWxldGUgdGhpcy5tYXBPZkNoZWNrTGlzdFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5tYXBPZkNoZWNrZWRJZFtpdGVtW3RoaXMuc2VsZWN0RmllbGRdXSA9IHZhbHVlO1xuICAgIH0pO1xuICAgIHRoaXMucmVmcmVzaFN0YXR1cygpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIOW9k+WJjeihjOaYr+WQpuemgeeUqOWLvumAiSAqL1xuICBpc1NlbGVjdERpc2FibGVkKGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIHRoaXMuc2VsZWN0RGlzYWJsZWRGaWVsZCAmJlxuICAgICAgZGF0YSAmJlxuICAgICAgZGF0YVt0aGlzLnNlbGVjdERpc2FibGVkRmllbGRdID09PSB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIC8qKiDlvZPliY3ooYzmmK/lkKblpLHmlYggKi9cbiAgaXNJbnZhbGlkUm93KGRhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIHRoaXMucm93SW52YWxpZEZpZWxkICYmXG4gICAgICBkYXRhICYmXG4gICAgICBkYXRhW3RoaXMucm93SW52YWxpZEZpZWxkXSA9PT0gdHJ1ZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog5YiX5paH5a2X6aKc6Imy77yaY29sb3Ig5Li65Ye95pWw5pe25oyJ6KGM6K6h566X77yI55So5LqO5p+Q5LiA6KGM5p+Q5LiA5YiX5qCH57qi77yJ77yM5ZCm5YiZ5pW05YiX5ZCM6Imy44CCXG4gICAqL1xuICByZXNvbHZlQ2VsbENvbG9yKGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoIWNvbCB8fCBjb2wuY29sb3IgPT0gbnVsbCB8fCBjb2wuY29sb3IgPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbC5jb2xvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbC5jb2xvcihkYXRhKTtcbiAgICAgIHJldHVybiB2YWx1ZSB8fCBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY29sLmNvbG9yO1xuICB9XG5cbiAgLyoqIOWPr+eCueWHu+WNleWFg+agvOminOiJsu+8muepuuWAvOWbuuWumueBsO+8jOWQpuWImeaMieWIlyBjb2xvciAqL1xuICBnZXRMaW5rQ2VsbENvbG9yKGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55LCBpc0VtcHR5OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBpZiAoaXNFbXB0eSkge1xuICAgICAgcmV0dXJuIFwiIzJBMzYzNFwiO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlQ2VsbENvbG9yKGNvbCwgZGF0YSk7XG4gIH1cblxuICAvKiog5pmu6YCa5paH5pys5Y2V5YWD5qC86aKc6Imy77ya5aSx5pWI6KGM57uf5LiA54Gw77yM5ZCm5YiZ55So5YiX6YWN572uIGNvbG9yICovXG4gIGdldFBsYWluQ2VsbENvbG9yKGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5pc0ludmFsaWRSb3coZGF0YSkpIHtcbiAgICAgIHJldHVybiBcIiM4NjhBOUNcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZUNlbGxDb2xvcihjb2wsIGRhdGEpO1xuICB9XG5cbiAganVkZ2VDb2xFbXB0eShzdHI6IGFueSkge1xuICAgIGlmIChzdHIgfHwgc3RyID09PSAwKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCI856m6PlwiO1xuICAgIH1cbiAgfVxuXG4gIGdldFN0YXRlRmllbGQoY29sOiBIZFRhYmxlQ29sdW1uKTogc3RyaW5nIHtcbiAgICBpZiAoY29sLmlzU3RhdGUpIHtcbiAgICAgIHJldHVybiBjb2wubmFtZSBhcyBzdHJpbmc7XG4gICAgfVxuICAgIHJldHVybiBjb2wuc3RhdGVGaWVsZCB8fCBcInN0YXRlXCI7XG4gIH1cblxuICAvKiog5a2X5q615YC85ZCO5piv5ZCm5bGV56S656uW57q/6KGM5Y+3ICovXG4gIGhhc1Jvd05vKGNvbDogSGRUYWJsZUNvbHVtbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIGNvbCAmJlxuICAgICAgKGNvbC5yb3dObyA9PT0gdHJ1ZSB8fCAodHlwZW9mIGNvbC5yb3dObyA9PT0gXCJzdHJpbmdcIiAmJiBjb2wucm93Tm8pKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog6KGM5Y+35paH5qGI44CCcm93Tm8g5Li65a2X5q615ZCN5pe25Y+W6KGM5pWw5o2u77yb5Li6IHRydWUg5pe25oyJ5b2T5YmN6aG15bqP5Y+377yI6Leo6aG16L+e57ut77yM5LuOIDEg5byA5aeL77yJ44CCXG4gICAqL1xuICBnZXRSb3dOb1RleHQoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnksIGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5oYXNSb3dObyhjb2wpKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb2wucm93Tm8gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZGF0YSA/IGRhdGFbY29sLnJvd05vXSA6IG51bGw7XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCBwYWdlID1cbiAgICAgIE51bWJlcih0aGlzLnRhYmxlUGFnZUluZGV4KSA+IDAgPyBOdW1iZXIodGhpcy50YWJsZVBhZ2VJbmRleCkgOiAxO1xuICAgIGNvbnN0IHNpemUgPVxuICAgICAgTnVtYmVyKHRoaXMudGFibGVQYWdlU2l6ZSkgPiAwID8gTnVtYmVyKHRoaXMudGFibGVQYWdlU2l6ZSkgOiAwO1xuICAgIGNvbnN0IHJvd0luZGV4ID0gTnVtYmVyKGluZGV4KSA+PSAwID8gTnVtYmVyKGluZGV4KSA6IDA7XG4gICAgcmV0dXJuIFN0cmluZygocGFnZSAtIDEpICogc2l6ZSArIHJvd0luZGV4ICsgMSk7XG4gIH1cblxuICAvKiog6KGo5aS044CM6YWN6YCB5Y2V5Y+3IHwg6KGM44CN5ouG5oiQ55+t56uW57q/77yM6YG/5YWN5a2X56ymIHwg5ouJ5ruh6KGM6auYICovXG4gIGdldFRpdGxlUGFydHMoY29sOiBIZFRhYmxlQ29sdW1uKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaGFzUm93Tm8oY29sKSB8fFxuICAgICAgIWNvbCB8fFxuICAgICAgIWNvbC50aXRsZSB8fFxuICAgICAgU3RyaW5nKGNvbC50aXRsZSkuaW5kZXhPZihcInxcIikgPCAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmF3ID0gU3RyaW5nKGNvbC50aXRsZSkuc3BsaXQoXCJ8XCIpO1xuICAgIGlmIChyYXcubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBbcmF3WzBdLnRyaW0oKSwgcmF3LnNsaWNlKDEpLmpvaW4oXCJ8XCIpLnRyaW0oKV07XG4gIH1cblxuICAvKiog5piv5ZCm5pi+56S657yW6L6R56yU5Zu+5qCH77yI5pyJIGVkaXRUeXBlIOaXtui1sOihjOWGheaOp+S7tu+8jOS4jeWGjeaYvuekuueslO+8iSAqL1xuICBpc0VkaXRhYmxlKGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFjb2wgfHwgdGhpcy5oYXNJbmxpbmVFZGl0KGNvbCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbC5lZGl0YWJsZSA9PSBudWxsIHx8IGNvbC5lZGl0YWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb2wuZWRpdGFibGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuICEhY29sLmVkaXRhYmxlKGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gISFjb2wuZWRpdGFibGU7XG4gIH1cblxuICAvKiog54K55Ye757yW6L6R56yU77yM5Zue6LCD54i257uE5Lu25Lyg5YWl55qEIGVkaXQgKi9cbiAgb25FZGl0Q2xpY2soZXZlbnQ6IEV2ZW50LCBjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IHZvaWQge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLnRyaWdnZXJFdmVudChjb2wuZWRpdCB8fCBudWxsLCBkYXRhKTtcbiAgfVxuXG4gIC8qKiDliJfmmK/lkKbphY3nva7kuoblj6/nlKjnmoTooYzlhoXnvJbovpHvvIhuYW1lIOW/hemhu+aYryBzdHJpbmfvvIkgKi9cbiAgaGFzSW5saW5lRWRpdChjb2w6IEhkVGFibGVDb2x1bW4pOiBib29sZWFuIHtcbiAgICBpZiAoIWNvbCB8fCAhY29sLmVkaXRUeXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29sLm5hbWUgIT09IFwic3RyaW5nXCIgfHwgIWNvbC5uYW1lKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiW2hkLXRhYmxlXSBlZGl0VHlwZSDopoHmsYIgbmFtZSDkuLogc3RyaW5n77yM5YiX44CMXCIgK1xuICAgICAgICAgIChjb2wudGl0bGUgfHwgXCJcIikgK1xuICAgICAgICAgIFwi44CN5bey5Zue6YCA5Y+q6K+7XCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlzRWRpdERpc2FibGVkKGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFjb2wgfHwgY29sLmVkaXREaXNhYmxlZCA9PSBudWxsIHx8IGNvbC5lZGl0RGlzYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29sLmVkaXREaXNhYmxlZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gISFjb2wuZWRpdERpc2FibGVkKGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gISFjb2wuZWRpdERpc2FibGVkO1xuICB9XG5cbiAgZ2V0U2VsZWN0TGlzdChjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IEFycmF5PGFueT4ge1xuICAgIGlmICghY29sIHx8ICFjb2wuc2VsZWN0T3B0aW9uKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IG9wdCA9IGNvbC5zZWxlY3RPcHRpb247XG4gICAgaWYgKG9wdC5zZWxlY3RMaXN0TmFtZSAmJiBkYXRhKSB7XG4gICAgICBjb25zdCBsaXN0ID0gZGF0YVtvcHQuc2VsZWN0TGlzdE5hbWVdO1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkobGlzdCkgPyBsaXN0IDogW107XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9wdC5zZWxlY3RMaXN0KSA/IG9wdC5zZWxlY3RMaXN0IDogW107XG4gIH1cblxuICBnZXRTZWxlY3RPcHRpb25MYWJlbChjb2w6IEhkVGFibGVDb2x1bW4sIGl0ZW06IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5zZWxlY3RPcHRpb24gfHwgIWl0ZW0pIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBjb25zdCBvcHQgPSBjb2wuc2VsZWN0T3B0aW9uO1xuICAgIGNvbnN0IHZhbHVlID0gaXRlbVtvcHQudmFsdWVdO1xuICAgIGNvbnN0IGxhYmVsID0gaXRlbVtvcHQubGFiZWxdO1xuICAgIGlmIChvcHQuc2hvd0xhYmVsQW5kVmFsdWUgfHwgb3B0LmhkU2hvd0l0ZW1Db2RlKSB7XG4gICAgICByZXR1cm4gYFske3ZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWV9XSR7bGFiZWwgPT0gbnVsbCA/IFwiXCIgOiBsYWJlbH1gO1xuICAgIH1cbiAgICByZXR1cm4gbGFiZWwgPT0gbnVsbCA/IFwiXCIgOiBTdHJpbmcobGFiZWwpO1xuICB9XG5cbiAgZ2V0SW5wdXROdW1iZXJQcm9wKFxuICAgIGNvbDogSGRUYWJsZUNvbHVtbixcbiAgICBrZXk6IFwibWluXCIgfCBcIm1heFwiIHwgXCJzdGVwXCIgfCBcInByZWNpc2lvblwiLFxuICAgIGZhbGxiYWNrOiBudW1iZXIsXG4gICk6IG51bWJlciB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5pbnB1dE51bWJlcikge1xuICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgIH1cbiAgICBjb25zdCB2YWwgPSBjb2wuaW5wdXROdW1iZXJba2V5XTtcbiAgICByZXR1cm4gdmFsICE9IG51bGwgPyBOdW1iZXIodmFsKSA6IGZhbGxiYWNrO1xuICB9XG5cbiAgaXNEYXRlU2hvd1RpbWUoY29sOiBIZFRhYmxlQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKGNvbCAmJiBjb2wuZGF0ZU9wdGlvbiAmJiBjb2wuZGF0ZU9wdGlvbi5zaG93VGltZSk7XG4gIH1cblxuICBpc0RhdGVTaG93VG9kYXkoY29sOiBIZFRhYmxlQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5kYXRlT3B0aW9uIHx8IGNvbC5kYXRlT3B0aW9uLnNob3dUb2RheSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbC5kYXRlT3B0aW9uLnNob3dUb2RheSAhPT0gZmFsc2U7XG4gIH1cblxuICBnZXREYXRlRm9ybWF0KGNvbDogSGRUYWJsZUNvbHVtbiwgaXNSYW5nZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgaWYgKGNvbCAmJiBjb2wuZGF0ZU9wdGlvbiAmJiBjb2wuZGF0ZU9wdGlvbi5mb3JtYXQpIHtcbiAgICAgIHJldHVybiBjb2wuZGF0ZU9wdGlvbi5mb3JtYXQ7XG4gICAgfVxuICAgIGlmICghaXNSYW5nZSAmJiB0aGlzLmlzRGF0ZVNob3dUaW1lKGNvbCkpIHtcbiAgICAgIHJldHVybiBcInl5eXktTU0tZGQgSEg6bW06c3NcIjtcbiAgICB9XG4gICAgcmV0dXJuIFwieXl5eS1NTS1kZFwiO1xuICB9XG5cbiAgZ2V0RGlzYWJsZWREYXRlKGNvbDogSGRUYWJsZUNvbHVtbik6IChjdXJyZW50OiBEYXRlKSA9PiBib29sZWFuIHtcbiAgICBpZiAoY29sICYmIGNvbC5kYXRlT3B0aW9uICYmIGNvbC5kYXRlT3B0aW9uLmRpc2FibGVkRGF0ZSkge1xuICAgICAgcmV0dXJuIGNvbC5kYXRlT3B0aW9uLmRpc2FibGVkRGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICB9XG5cbiAgZ2V0UmFuZ2VQbGFjZWhvbGRlcihjb2w6IEhkVGFibGVDb2x1bW4pOiBBcnJheTxzdHJpbmc+IHtcbiAgICBjb25zdCBwbGFjZWhvbGRlciA9XG4gICAgICBjb2wgJiYgY29sLmRhdGVPcHRpb24gPyBjb2wuZGF0ZU9wdGlvbi5yYW5nZVBsYWNlaG9sZGVyIDogbnVsbDtcbiAgICBpZiAocGxhY2Vob2xkZXIgJiYgcGxhY2Vob2xkZXIubGVuZ3RoID49IDIpIHtcbiAgICAgIHJldHVybiBbcGxhY2Vob2xkZXJbMF0sIHBsYWNlaG9sZGVyWzFdXTtcbiAgICB9XG4gICAgcmV0dXJuIFtcIuW8gOWni+aXpeacn1wiLCBcIue7k+adn+aXpeacn1wiXTtcbiAgfVxuXG4gIC8qKiBJbnB1dCAvIElucHV0TnVtYmVyIC8g5pel5pyf5Y+Y5pu077ya5YWI6K6w5pen5YC85YaN5YaZ5Zue5bm26YCa55+l54i257uE5Lu2ICovXG4gIG9uQ2VsbENoYW5nZShjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNJbmxpbmVFZGl0KGNvbCkgfHwgIWRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IGNvbC5uYW1lIGFzIHN0cmluZztcbiAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gZGF0YVtuYW1lXTtcbiAgICBkYXRhW25hbWVdID0gdmFsdWU7XG4gICAgdGhpcy5jZWxsQ2hhbmdlLmVtaXQoe1xuICAgICAgbGluZTogZGF0YSxcbiAgICAgIGNvbCxcbiAgICAgIG5hbWUsXG4gICAgICB2YWx1ZSxcbiAgICAgIHByZXZpb3VzVmFsdWUsXG4gICAgfSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IOWxleW8gO+8muaciSBvbk9wZW5DaGFuZ2VFdmVudCDml7blsZXlvIDlhYjmuIXnqbrpgInpobnlho3lm57osIMgKG9wZW4sIGxpbmUp77yb5YWz6Zet5LiN5Zue6LCD5Lia5Yqh44CCXG4gICAqIOWbnuiwg+iLpSByZXR1cm4g5pWw57uEIC8gUHJvbWlzZSAvIE9ic2VydmFibGXvvIznlLHnu4Tku7blhpnlm54gb3B0aW9ucyDlubYgbWFya0ZvckNoZWNr44CCXG4gICAqL1xuICBvblNlbGVjdE9wZW5DaGFuZ2UoY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnksIG9wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIWNvbCB8fCAhY29sLm9uT3BlbkNoYW5nZUV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChvcGVuKSB7XG4gICAgICB0aGlzLmNsZWFyU2VsZWN0T3B0aW9uc09uT3Blbihjb2wsIGRhdGEpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICAgIGNvbnN0IGZuID0gY29sLm9uT3BlbkNoYW5nZUV2ZW50O1xuICAgIGNvbnN0IGRlYm91bmNlTXMgPVxuICAgICAgY29sLm9uT3BlbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lICE9IG51bGxcbiAgICAgICAgPyBjb2wub25PcGVuQ2hhbmdlRXZlbnREZWJvdW5jZVRpbWVcbiAgICAgICAgOiAwO1xuICAgIGlmICghZGVib3VuY2VNcykge1xuICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgdGhpcy5oYW5kbGVTZWxlY3RMb2FkZXJSZXN1bHQoY29sLCBkYXRhLCBmbihvcGVuLCBkYXRhKSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdE9wZW5DaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc2VsZWN0T3BlbkNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdE9wZW5DaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLnNlbGVjdE9wZW5DaGFuZ2VTdWJqZWN0XG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoZGVib3VuY2VNcykpXG4gICAgICAuc3Vic2NyaWJlKCh7IGZuOiBjYiwgb3BlbjogbywgbGluZSwgY29sOiBjIH0pID0+IHtcbiAgICAgICAgaWYgKG8pIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdExvYWRlclJlc3VsdChjLCBsaW5lLCBjYihvLCBsaW5lKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHRoaXMuc2VsZWN0T3BlbkNoYW5nZVN1YmplY3QubmV4dCh7IGZuLCBvcGVuLCBsaW5lOiBkYXRhLCBjb2wgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IOaQnOe0ou+8muaciSBvblNlYXJjaEV2ZW50IOaXtuWbnuiwgyAoa2V5d29yZCwgbGluZSnvvIzkuI3muIXnqbogb3B0aW9uc+OAglxuICAgKiDlm57osIPoi6UgcmV0dXJuIOaVsOe7hCAvIFByb21pc2UgLyBPYnNlcnZhYmxl77yM55Sx57uE5Lu25YaZ5ZueIG9wdGlvbnMg5bm2IG1hcmtGb3JDaGVja+OAglxuICAgKi9cbiAgb25TZWxlY3RTZWFyY2goY29sOiBIZFRhYmxlQ29sdW1uLCBkYXRhOiBhbnksIGtleXdvcmQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghY29sIHx8ICFjb2wub25TZWFyY2hFdmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmbiA9IGNvbC5vblNlYXJjaEV2ZW50O1xuICAgIGNvbnN0IGRlYm91bmNlTXMgPVxuICAgICAgY29sLm9uU2VhcmNoRXZlbnRFdmVudERlYm91bmNlVGltZSAhPSBudWxsXG4gICAgICAgID8gY29sLm9uU2VhcmNoRXZlbnRFdmVudERlYm91bmNlVGltZVxuICAgICAgICA6IDA7XG4gICAgaWYgKCFkZWJvdW5jZU1zKSB7XG4gICAgICB0aGlzLmhhbmRsZVNlbGVjdExvYWRlclJlc3VsdChjb2wsIGRhdGEsIGZuKGtleXdvcmQsIGRhdGEpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0U2VhcmNoU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdFNlYXJjaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdFNlYXJjaFN1YnNjcmlwdGlvbiA9IHRoaXMuc2VsZWN0U2VhcmNoU3ViamVjdFxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKGRlYm91bmNlTXMpKVxuICAgICAgLnN1YnNjcmliZSgoeyBmbjogY2IsIGtleXdvcmQ6IGt3LCBsaW5lLCBjb2w6IGMgfSkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdExvYWRlclJlc3VsdChjLCBsaW5lLCBjYihrdywgbGluZSkpO1xuICAgICAgfSk7XG4gICAgdGhpcy5zZWxlY3RTZWFyY2hTdWJqZWN0Lm5leHQoeyBmbiwga2V5d29yZCwgbGluZTogZGF0YSwgY29sIH0pO1xuICB9XG5cbiAgLyoqIOWxleW8gOaXtua4heepuuWIlyBzZWxlY3RMaXN0IOaIluihjOS4iiBzZWxlY3RMaXN0TmFtZe+8jOeUseS4muWKoeWbnuiwg+WGjeWGmeWFpSAqL1xuICBwcml2YXRlIGNsZWFyU2VsZWN0T3B0aW9uc09uT3Blbihjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IHZvaWQge1xuICAgIGlmICghY29sIHx8ICFjb2wuc2VsZWN0T3B0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG9wdCA9IGNvbC5zZWxlY3RPcHRpb247XG4gICAgaWYgKG9wdC5zZWxlY3RMaXN0ICE9IG51bGwpIHtcbiAgICAgIG9wdC5zZWxlY3RMaXN0ID0gW107XG4gICAgfVxuICAgIGlmIChvcHQuc2VsZWN0TGlzdE5hbWUgJiYgZGF0YSkge1xuICAgICAgZGF0YVtvcHQuc2VsZWN0TGlzdE5hbWVdID0gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWkhOeQhuWKoOi9veWbnuiwg+i/lOWbnuWAvO+8muaVsOe7hOebtOaOpeWGmeWbnu+8m1Byb21pc2UvT2JzZXJ2YWJsZSDlrozmiJDlkI7lhpnlm57vvJt2b2lkIOS7hSBtYXJrRm9yQ2hlY2vjgIJcbiAgICog5LyY5YWI5YaZIHNlbGVjdExpc3ROYW1l77yM5ZCm5YiZ5YaZ5YiX5LiKIHNlbGVjdExpc3TjgIJcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlU2VsZWN0TG9hZGVyUmVzdWx0KFxuICAgIGNvbDogSGRUYWJsZUNvbHVtbixcbiAgICBkYXRhOiBhbnksXG4gICAgcmVzdWx0OiBhbnksXG4gICk6IHZvaWQge1xuICAgIGlmIChyZXN1bHQgPT0gbnVsbCkge1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgIHRoaXMuYXBwbHlTZWxlY3RPcHRpb25zKGNvbCwgZGF0YSwgcmVzdWx0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZXN1bHQudGhlbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXN1bHQudGhlbihcbiAgICAgICAgKGxpc3Q6IGFueSkgPT4gdGhpcy5hcHBseVNlbGVjdE9wdGlvbnMoY29sLCBkYXRhLCBsaXN0KSxcbiAgICAgICAgKCkgPT4gdGhpcy5jZHIubWFya0ZvckNoZWNrKCksXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlc3VsdC5zdWJzY3JpYmUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0TG9hZGVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0TG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlbGVjdExvYWRlclN1YnNjcmlwdGlvbiA9IHJlc3VsdC5zdWJzY3JpYmUoXG4gICAgICAgIChsaXN0OiBhbnkpID0+IHRoaXMuYXBwbHlTZWxlY3RPcHRpb25zKGNvbCwgZGF0YSwgbGlzdCksXG4gICAgICAgICgpID0+IHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5U2VsZWN0T3B0aW9ucyhjb2w6IEhkVGFibGVDb2x1bW4sIGRhdGE6IGFueSwgbGlzdDogYW55KTogdm9pZCB7XG4gICAgaWYgKCFjb2wgfHwgIWNvbC5zZWxlY3RPcHRpb24gfHwgIUFycmF5LmlzQXJyYXkobGlzdCkpIHtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcHQgPSBjb2wuc2VsZWN0T3B0aW9uO1xuICAgIGlmIChvcHQuc2VsZWN0TGlzdE5hbWUgJiYgZGF0YSkge1xuICAgICAgZGF0YVtvcHQuc2VsZWN0TGlzdE5hbWVdID0gbGlzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0LnNlbGVjdExpc3QgPSBsaXN0O1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBTZWxlY3Qg5Y+Y5pu077ya5Y+M5YaZIHZhbHVlICsgbGFiZWzvvIzlubbluKYgcHJldmlvdXMqIC8gb3B0aW9uICovXG4gIG9uU2VsZWN0Q2hhbmdlKGNvbDogSGRUYWJsZUNvbHVtbiwgZGF0YTogYW55LCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc0lubGluZUVkaXQoY29sKSB8fCAhZGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gY29sLm5hbWUgYXMgc3RyaW5nO1xuICAgIGNvbnN0IG9wdCA9IGNvbC5zZWxlY3RPcHRpb247XG4gICAgY29uc3QgbGFiZWxGaWVsZCA9IG9wdCAmJiBvcHQubGFiZWwgPyBvcHQubGFiZWwgOiBudWxsO1xuICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBkYXRhW25hbWVdO1xuICAgIGNvbnN0IHByZXZpb3VzTGFiZWwgPSBsYWJlbEZpZWxkID8gZGF0YVtsYWJlbEZpZWxkXSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5nZXRTZWxlY3RMaXN0KGNvbCwgZGF0YSk7XG4gICAgY29uc3QgcHJldmlvdXNPcHRpb24gPVxuICAgICAgcHJldmlvdXNWYWx1ZSA9PSBudWxsIHx8ICFvcHRcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDogbGlzdC5maW5kKChpdGVtKSA9PiBpdGVtICYmIGl0ZW1bb3B0LnZhbHVlXSA9PT0gcHJldmlvdXNWYWx1ZSkgfHxcbiAgICAgICAgICBudWxsO1xuICAgIGNvbnN0IG9wdGlvbiA9XG4gICAgICB2YWx1ZSA9PSBudWxsIHx8ICFvcHRcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDogbGlzdC5maW5kKChpdGVtKSA9PiBpdGVtICYmIGl0ZW1bb3B0LnZhbHVlXSA9PT0gdmFsdWUpIHx8IG51bGw7XG5cbiAgICBkYXRhW25hbWVdID0gdmFsdWU7XG4gICAgbGV0IGxhYmVsOiBhbnkgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGxhYmVsRmllbGQpIHtcbiAgICAgIGxhYmVsID0gb3B0aW9uID8gb3B0aW9uW29wdC5sYWJlbF0gOiBudWxsO1xuICAgICAgZGF0YVtsYWJlbEZpZWxkXSA9IGxhYmVsO1xuICAgIH1cblxuICAgIHRoaXMuY2VsbENoYW5nZS5lbWl0KHtcbiAgICAgIGxpbmU6IGRhdGEsXG4gICAgICBjb2wsXG4gICAgICBuYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBwcmV2aW91c1ZhbHVlLFxuICAgICAgbGFiZWwsXG4gICAgICBwcmV2aW91c0xhYmVsLFxuICAgICAgb3B0aW9uLFxuICAgICAgcHJldmlvdXNPcHRpb24sXG4gICAgfSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiJdfQ==