mmhglobal-dynamicform 2.40.0 → 3.0.0-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -11
- package/fesm2022/mmhglobal-dynamicform.mjs +15336 -0
- package/fesm2022/mmhglobal-dynamicform.mjs.map +1 -0
- package/{mmhglobal-dynamicform.d.ts → index.d.ts} +5 -5
- package/lib/animations/component-animations.d.ts +3 -3
- package/lib/components/{buttonfieldbase.component.d.ts → base/buttonfieldbase.component.d.ts} +18 -26
- package/lib/components/{containerfieldbase.component.d.ts → base/containerfieldbase.component.d.ts} +20 -25
- package/lib/components/{datalistingfieldbase.component.d.ts → base/datalistingfieldbase.component.d.ts} +45 -51
- package/lib/components/{fieldbase.component.d.ts → base/fieldbase.component.d.ts} +49 -49
- package/lib/components/{inputfieldbase.component.d.ts → base/inputfieldbase.component.d.ts} +23 -27
- package/lib/{dropdown_buttons → components/button/dropdown_buttons}/dropdown_buttons.component.d.ts +15 -21
- package/lib/components/button/zbuttons/zbuttons.component.d.ts +19 -0
- package/lib/{zchip → components/button/zchip}/zchip.component.d.ts +22 -26
- package/lib/{zmfb → components/button/zmfb}/zmfb.component.d.ts +38 -43
- package/lib/components/button/zworkflowbuttons/zworkflowbuttons.component.d.ts +29 -0
- package/lib/{zchart → components/chart/zchart}/zchart.component.d.ts +73 -71
- package/lib/{zganttchart → components/chart/zganttchart}/zganttchart.component.d.ts +40 -40
- package/lib/{zgauge → components/chart/zgauge}/zgauge.component.d.ts +67 -63
- package/lib/{zprogressbar → components/chart/zprogressbar}/zprogressbar.component.d.ts +29 -30
- package/lib/{zreport → components/chart/zreport}/zreport.component.d.ts +47 -53
- package/lib/{zscheduler → components/chart/zscheduler}/zscheduler.component.d.ts +53 -52
- package/lib/{zscheduler → components/chart/zscheduler}/zscheduler.toolbar.component.d.ts +20 -20
- package/lib/{ztrendcard → components/chart/ztrendcard}/ztrendcard.component.d.ts +40 -36
- package/lib/components/container/kcard/kcard.component.d.ts +21 -0
- package/lib/{kscrollview → components/container/kscrollview}/kscrollview.component.d.ts +19 -20
- package/lib/{ksplitter → components/container/ksplitter}/ksplitter.component.d.ts +18 -19
- package/lib/{zcard → components/container/zcard}/zcard.component.d.ts +12 -17
- package/lib/components/container/zdiv/zdiv.component.d.ts +12 -0
- package/lib/{zdiv → components/container/zdiv}/zdiv.pipe.d.ts +7 -7
- package/lib/{zloop → components/container/zloop}/zloop.component.d.ts +21 -24
- package/lib/{ztab → components/container/ztab}/ztab.component.d.ts +34 -38
- package/lib/{ztab → components/container/ztab}/ztab.pipe.d.ts +7 -7
- package/lib/{zudf → components/container/zudf}/zudf.component.d.ts +208 -212
- package/lib/{virtual-scroll → components/data-listing/virtual-scroll}/virtual-scroll.component.d.ts +40 -45
- package/lib/{zgrid → components/data-listing/zgrid}/container/zgrid-container.component.d.ts +27 -31
- package/lib/{zgrid → components/data-listing/zgrid}/date-range-cell-filter.component.d.ts +20 -19
- package/lib/{zgrid → components/data-listing/zgrid}/zgrid.binding.directive.d.ts +174 -168
- package/lib/{zgrid → components/data-listing/zgrid}/zgrid.component.d.ts +187 -186
- package/lib/{zgrid → components/data-listing/zgrid}/zgrid.popup.anchor-target.directive.d.ts +8 -8
- package/lib/{zgrid → components/data-listing/zgrid}/zgrid.service.d.ts +27 -27
- package/lib/{ztree → components/data-listing/ztree}/ztree.component.d.ts +77 -78
- package/lib/{ztreelist → components/data-listing/ztreelist}/ztreelist.component.d.ts +100 -107
- package/lib/{sfdatetimepicker → components/input/sfdatetimepicker}/sfdatetimepicker.component.d.ts +26 -31
- package/lib/{sfquerybuilder → components/input/sfquerybuilder}/sfquerybuilder.component.d.ts +71 -73
- package/lib/{zcheckbox → components/input/zcheckbox}/zcheckbox.component.d.ts +18 -20
- package/lib/components/input/zcodeeditor/zcodeeditor.component.d.ts +43 -0
- package/lib/components/input/zcodeeditor/zcodeeditor.service.d.ts +32 -0
- package/lib/{zcolorpicker → components/input/zcolorpicker}/zcolorpicker.component.d.ts +19 -25
- package/lib/{zdatetime → components/input/zdatetime}/dateIonicFormatParser.pipe.d.ts +10 -10
- package/lib/{zdatetime → components/input/zdatetime}/dateIonicMinMaxDate.pipe.d.ts +7 -7
- package/lib/{zdatetime → components/input/zdatetime}/dateKendoFormatParser.pipe.d.ts +10 -10
- package/lib/{zdatetime → components/input/zdatetime}/dateParser.pipe.d.ts +11 -11
- package/lib/{zdatetime → components/input/zdatetime}/zdatetime.component.d.ts +32 -32
- package/lib/{zimg → components/input/zimg}/zimg.component.d.ts +16 -20
- package/lib/{zinput-container → components/input/zinput-container}/zinput-container.component.d.ts +31 -38
- package/lib/{zinput-container → components/input/zinput-container}/zinput-container.pipe.d.ts +25 -25
- package/lib/{zlabel → components/input/zlabel}/zlabel.component.d.ts +20 -26
- package/lib/{znumeric → components/input/znumeric}/znumeric.component.d.ts +29 -31
- package/lib/{znumeric → components/input/znumeric}/znumeric.component.pipe.d.ts +10 -10
- package/lib/{zpostselectinput → components/input/zpostselectinput}/zpostselectinput.component.d.ts +48 -65
- package/lib/{zselectmultiple → components/input/zselectmultiple}/zselectmultiple.component.d.ts +105 -123
- package/lib/{zselectmultiple → components/input/zselectmultiple}/zselectmultiple.directive.d.ts +12 -12
- package/lib/{zselectmultiple → components/input/zselectmultiple}/zselectmultiple.pipe.d.ts +11 -11
- package/lib/{ztext → components/input/ztext}/ztext.component.d.ts +33 -33
- package/lib/{ztextarea → components/input/ztextarea}/ztextarea.component.d.ts +21 -25
- package/lib/{ztexteditor → components/input/ztexteditor}/ztexteditor.component.d.ts +44 -42
- package/lib/{zupload → components/input/zupload}/zupload.component.d.ts +45 -50
- package/lib/{embed-components → components/menu}/context-menu/context-menu.component.d.ts +24 -28
- package/lib/{kmenu → components/menu/kmenu}/kmenu.component.d.ts +13 -14
- package/lib/components/others/zform/zform.component.d.ts +30 -0
- package/lib/components/others/zformcontrol/zformcontrol.component.d.ts +21 -0
- package/lib/components/others/zformcontrol/zformcontrol.service.d.ts +12 -0
- package/lib/components/others/zmodal/zmodal-component-helper.service.d.ts +15 -0
- package/lib/components/others/zmodal/zmodal.component.d.ts +24 -0
- package/lib/components/others/zmodal/zmodal.service.d.ts +25 -0
- package/lib/components/others/zunknown/zunknown.component.d.ts +10 -0
- package/lib/components/utility/e1-root/e1-root.component.d.ts +20 -0
- package/lib/components/utility/input-error-message/input-error-message.component.d.ts +14 -0
- package/lib/{embed-components → components/utility}/input-field-addons/input-field-addons.component.d.ts +18 -23
- package/lib/{embed-components → components/utility}/page-loader/page-loader.component.d.ts +8 -8
- package/lib/{embed-components → components/utility}/processing-record-loader/processing-record-loader.component.d.ts +8 -8
- package/lib/{embed-components → components/utility}/spinner/spinner.component.d.ts +12 -14
- package/lib/components/utility/uiappmenucontent/uiappmenucontent.component.d.ts +17 -0
- package/lib/{uibulletin → components/utility/uibulletin}/uibulletin.component.d.ts +31 -36
- package/lib/{uicontainer → components/utility/uicontainer}/uicontainer.component.d.ts +16 -19
- package/lib/components/utility/uicontent/uicontent.component.d.ts +21 -0
- package/lib/components/utility/uiheader/uiheader.component.d.ts +40 -0
- package/lib/{uipage → components/utility/uipage}/uipage.component.d.ts +18 -23
- package/lib/constants/constant.d.ts +3 -3
- package/lib/directives/elementcontainer.directive.d.ts +8 -8
- package/lib/interfaces/modal.interface.d.ts +4 -0
- package/lib/pipe/htmlSanitize.pipe.d.ts +10 -10
- package/lib/pipe/panel-area.pipe.d.ts +7 -7
- package/lib/services/main.service.d.ts +136 -142
- package/lib/services/zcomponent.debug.service.d.ts +289 -68
- package/lib/services/zcomponent.service.d.ts +31 -44
- package/package.json +6 -13
- package/public-api.d.ts +93 -100
- package/styles/all.scss +643 -0
- package/styles/component.scss +0 -0
- package/styles/notificationkit.scss +53 -0
- package/esm2020/lib/animations/component-animations.mjs +0 -39
- package/esm2020/lib/components/buttonfieldbase.component.mjs +0 -80
- package/esm2020/lib/components/containerfieldbase.component.mjs +0 -50
- package/esm2020/lib/components/datalistingfieldbase.component.mjs +0 -277
- package/esm2020/lib/components/fieldbase.component.mjs +0 -178
- package/esm2020/lib/components/inputfieldbase.component.mjs +0 -202
- package/esm2020/lib/constants/constant.mjs +0 -4
- package/esm2020/lib/directives/elementcontainer.directive.mjs +0 -16
- package/esm2020/lib/directives/fieldelement.directive.mjs +0 -16
- package/esm2020/lib/directives/scrollbar.theme.directive.mjs +0 -45
- package/esm2020/lib/dropdown_buttons/dropdown_buttons.component.mjs +0 -109
- package/esm2020/lib/embed-components/context-menu/context-menu.component.mjs +0 -113
- package/esm2020/lib/embed-components/input-field-addons/input-field-addons.component.mjs +0 -93
- package/esm2020/lib/embed-components/page-loader/page-loader.component.mjs +0 -14
- package/esm2020/lib/embed-components/processing-record-loader/processing-record-loader.component.mjs +0 -14
- package/esm2020/lib/embed-components/spinner/spinner.component.mjs +0 -27
- package/esm2020/lib/ficon/ficon.component.mjs +0 -53
- package/esm2020/lib/input-error-message/input-error-message.component.mjs +0 -53
- package/esm2020/lib/kcard/kcard.component.mjs +0 -90
- package/esm2020/lib/kmenu/kmenu.component.mjs +0 -46
- package/esm2020/lib/kscrollview/kscrollview.component.mjs +0 -77
- package/esm2020/lib/ksplitter/ksplitter.component.mjs +0 -67
- package/esm2020/lib/mmhglobal-dynamicform.module.mjs +0 -657
- package/esm2020/lib/pipe/htmlSanitize.pipe.mjs +0 -18
- package/esm2020/lib/pipe/panel-area.pipe.mjs +0 -28
- package/esm2020/lib/services/main.service.mjs +0 -1307
- package/esm2020/lib/services/zcomponent.debug.service.mjs +0 -742
- package/esm2020/lib/services/zcomponent.service.mjs +0 -300
- package/esm2020/lib/sfdatetimepicker/sfdatetimepicker.component.mjs +0 -108
- package/esm2020/lib/sfquerybuilder/sfquerybuilder.component.mjs +0 -501
- package/esm2020/lib/uiactionbutton/uiactionbutton.component.mjs +0 -229
- package/esm2020/lib/uiappmenucontent/uiappmenucontent.component.mjs +0 -55
- package/esm2020/lib/uibulletin/uibulletin.component.mjs +0 -96
- package/esm2020/lib/uicontainer/uicontainer.component.mjs +0 -41
- package/esm2020/lib/uicontent/uicontent.component.mjs +0 -63
- package/esm2020/lib/uiheader/uiheader.component.mjs +0 -116
- package/esm2020/lib/uiheader/uiheader.service.mjs +0 -27
- package/esm2020/lib/uimenubutton/uimenubutton.component.mjs +0 -36
- package/esm2020/lib/uimenucontent/uimenucontent.component.mjs +0 -38
- package/esm2020/lib/uipage/uipage.component.mjs +0 -160
- package/esm2020/lib/uivalidationmessage/uivalidationmessage.component.mjs +0 -40
- package/esm2020/lib/virtual-scroll/virtual-scroll.component.mjs +0 -249
- package/esm2020/lib/zbullet/zbullet.component.mjs +0 -77
- package/esm2020/lib/zbuttons/zbuttons.component.mjs +0 -151
- package/esm2020/lib/zcard/zcard.component.mjs +0 -36
- package/esm2020/lib/zchart/zchart.component.mjs +0 -222
- package/esm2020/lib/zcheckbox/zcheckbox.component.mjs +0 -42
- package/esm2020/lib/zchip/zchip.component.mjs +0 -119
- package/esm2020/lib/zcodeeditor/zcodeeditor.component.mjs +0 -169
- package/esm2020/lib/zcodeeditor/zcodeeditor.pipe.mjs +0 -60
- package/esm2020/lib/zcolorpicker/zcolorpicker.component.mjs +0 -47
- package/esm2020/lib/zdaterange/zdaterange.component.mjs +0 -72
- package/esm2020/lib/zdatetime/dateIonicFormatParser.pipe.mjs +0 -40
- package/esm2020/lib/zdatetime/dateIonicMinMaxDate.pipe.mjs +0 -22
- package/esm2020/lib/zdatetime/dateKendoFormatParser.pipe.mjs +0 -41
- package/esm2020/lib/zdatetime/dateParser.pipe.mjs +0 -36
- package/esm2020/lib/zdatetime/zdatetime.component.mjs +0 -134
- package/esm2020/lib/zdiv/zdiv.component.mjs +0 -79
- package/esm2020/lib/zdiv/zdiv.pipe.mjs +0 -31
- package/esm2020/lib/zform/zform.component.mjs +0 -188
- package/esm2020/lib/zformcontrol/zformcontrol.component.mjs +0 -51
- package/esm2020/lib/zganttchart/zganttchart.component.mjs +0 -160
- package/esm2020/lib/zgauge/zgauge.component.mjs +0 -122
- package/esm2020/lib/zgrid/container/zgrid-container.component.mjs +0 -107
- package/esm2020/lib/zgrid/date-range-cell-filter.component.mjs +0 -146
- package/esm2020/lib/zgrid/zgrid.binding.directive.mjs +0 -881
- package/esm2020/lib/zgrid/zgrid.component.mjs +0 -1131
- package/esm2020/lib/zgrid/zgrid.popup.anchor-target.directive.mjs +0 -17
- package/esm2020/lib/zgrid/zgrid.service.mjs +0 -113
- package/esm2020/lib/zimg/zimg.component.mjs +0 -61
- package/esm2020/lib/zinput-container/zinput-container.component.mjs +0 -91
- package/esm2020/lib/zinput-container/zinput-container.pipe.mjs +0 -132
- package/esm2020/lib/zlabel/zlabel.component.mjs +0 -52
- package/esm2020/lib/zloop/zloop.component.mjs +0 -123
- package/esm2020/lib/zmfb/zmfb.component.mjs +0 -217
- package/esm2020/lib/zmodal/zmodal-mobile.component.mjs +0 -124
- package/esm2020/lib/zmodal/zmodal.component.mjs +0 -129
- package/esm2020/lib/znumeric/znumeric.component.mjs +0 -110
- package/esm2020/lib/znumeric/znumeric.component.pipe.mjs +0 -19
- package/esm2020/lib/zpostselectinput/zpostselectinput.component.mjs +0 -315
- package/esm2020/lib/zprogressbar/zprogressbar.component.mjs +0 -61
- package/esm2020/lib/zradiobutton/zradiobutton.component.mjs +0 -106
- package/esm2020/lib/zreport/zreport.component.mjs +0 -184
- package/esm2020/lib/zscheduler/zscheduler.component.mjs +0 -271
- package/esm2020/lib/zscheduler/zscheduler.toolbar.component.mjs +0 -150
- package/esm2020/lib/zselectmultiple/zselectmultiple.component.mjs +0 -689
- package/esm2020/lib/zselectmultiple/zselectmultiple.directive.mjs +0 -35
- package/esm2020/lib/zselectmultiple/zselectmultiple.pipe.mjs +0 -29
- package/esm2020/lib/ztab/ztab.component.mjs +0 -211
- package/esm2020/lib/ztab/ztab.pipe.mjs +0 -28
- package/esm2020/lib/ztext/ztext.component.mjs +0 -167
- package/esm2020/lib/ztextarea/ztextarea.component.mjs +0 -66
- package/esm2020/lib/ztexteditor/ztexteditor.component.mjs +0 -135
- package/esm2020/lib/ztree/ztree.component.mjs +0 -539
- package/esm2020/lib/ztreelist/ztreelist.component.mjs +0 -546
- package/esm2020/lib/ztrendcard/ztrendcard.component.mjs +0 -106
- package/esm2020/lib/zudf/zudf.component.mjs +0 -1016
- package/esm2020/lib/zunknown/zunknown.component.mjs +0 -20
- package/esm2020/lib/zupload/zupload.component.mjs +0 -403
- package/esm2020/lib/zworkflowbuttons/zworkflowbuttons.component.mjs +0 -244
- package/esm2020/mmhglobal-dynamicform.mjs +0 -5
- package/esm2020/public-api.mjs +0 -107
- package/fesm2015/mmhglobal-dynamicform.mjs +0 -16119
- package/fesm2015/mmhglobal-dynamicform.mjs.map +0 -1
- package/fesm2020/mmhglobal-dynamicform.mjs +0 -16079
- package/fesm2020/mmhglobal-dynamicform.mjs.map +0 -1
- package/lib/directives/fieldelement.directive.d.ts +0 -8
- package/lib/directives/scrollbar.theme.directive.d.ts +0 -10
- package/lib/ficon/ficon.component.d.ts +0 -34
- package/lib/input-error-message/input-error-message.component.d.ts +0 -19
- package/lib/kcard/kcard.component.d.ts +0 -25
- package/lib/mmhglobal-dynamicform.module.d.ts +0 -133
- package/lib/uiactionbutton/uiactionbutton.component.d.ts +0 -39
- package/lib/uiappmenucontent/uiappmenucontent.component.d.ts +0 -27
- package/lib/uicontent/uicontent.component.d.ts +0 -29
- package/lib/uiheader/uiheader.component.d.ts +0 -39
- package/lib/uiheader/uiheader.service.d.ts +0 -11
- package/lib/uimenubutton/uimenubutton.component.d.ts +0 -20
- package/lib/uimenucontent/uimenucontent.component.d.ts +0 -24
- package/lib/uivalidationmessage/uivalidationmessage.component.d.ts +0 -21
- package/lib/zbullet/zbullet.component.d.ts +0 -27
- package/lib/zbuttons/zbuttons.component.d.ts +0 -25
- package/lib/zcodeeditor/zcodeeditor.component.d.ts +0 -43
- package/lib/zcodeeditor/zcodeeditor.pipe.d.ts +0 -12
- package/lib/zdaterange/zdaterange.component.d.ts +0 -29
- package/lib/zdiv/zdiv.component.d.ts +0 -22
- package/lib/zform/zform.component.d.ts +0 -38
- package/lib/zformcontrol/zformcontrol.component.d.ts +0 -25
- package/lib/zmodal/zmodal-mobile.component.d.ts +0 -38
- package/lib/zmodal/zmodal.component.d.ts +0 -44
- package/lib/zradiobutton/zradiobutton.component.d.ts +0 -34
- package/lib/zunknown/zunknown.component.d.ts +0 -17
- package/lib/zworkflowbuttons/zworkflowbuttons.component.d.ts +0 -32
|
@@ -1,539 +0,0 @@
|
|
|
1
|
-
/********** Angular **********/
|
|
2
|
-
import { Component, ViewChild, ViewChildren } from "@angular/core";
|
|
3
|
-
/********** Component & Service **********/
|
|
4
|
-
import { DataListingFieldBase } from "../components/datalistingfieldbase.component";
|
|
5
|
-
import { ZComponentHelper } from "mmhglobal-zcore";
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "../services/zcomponent.service";
|
|
8
|
-
import * as i2 from "@progress/kendo-angular-treeview";
|
|
9
|
-
import * as i3 from "@ionic/angular";
|
|
10
|
-
import * as i4 from "@fortawesome/angular-fontawesome";
|
|
11
|
-
import * as i5 from "@progress/kendo-angular-inputs";
|
|
12
|
-
import * as i6 from "../embed-components/context-menu/context-menu.component";
|
|
13
|
-
import * as i7 from "@angular/common";
|
|
14
|
-
import * as i8 from "@angular/flex-layout/extended";
|
|
15
|
-
import * as i9 from "@angular/forms";
|
|
16
|
-
import * as i10 from "../pipe/htmlSanitize.pipe";
|
|
17
|
-
export class ZtreeComponent extends DataListingFieldBase {
|
|
18
|
-
constructor(componentService) {
|
|
19
|
-
super(componentService);
|
|
20
|
-
this.componentService = componentService;
|
|
21
|
-
this.items = [];
|
|
22
|
-
this.originalItems = [];
|
|
23
|
-
this.isNodeDrop = false;
|
|
24
|
-
this.state = { expandedkeys: [] };
|
|
25
|
-
this.itemIndex = [];
|
|
26
|
-
this.selectedKeys = [];
|
|
27
|
-
this.checkedKeys = [];
|
|
28
|
-
this.disabledCheckBoxKeys = [];
|
|
29
|
-
this.selection = { mode: "single" };
|
|
30
|
-
this.nodes = [];
|
|
31
|
-
this.allNodesWitoutHierachy = [];
|
|
32
|
-
this.clickActName = null;
|
|
33
|
-
//public setRowHeightDouble(value: boolean = true) {
|
|
34
|
-
// console.warn('Deprecated - no londer need to set the height');
|
|
35
|
-
// // this.data.doubleHeight = value;
|
|
36
|
-
//}
|
|
37
|
-
//#region Expand & Collapse
|
|
38
|
-
this.isExpanded = (dataItem, index) => {
|
|
39
|
-
// console.log(index);
|
|
40
|
-
return this.state.expandedkeys.indexOf(index) > -1;
|
|
41
|
-
// return true;
|
|
42
|
-
};
|
|
43
|
-
this.expandNode = (field, value, setAsSelected) => {
|
|
44
|
-
this.itemIndex = [];
|
|
45
|
-
this.getItems();
|
|
46
|
-
this.searchNodeIndex(this.nodes, value, '', field);
|
|
47
|
-
const index = this.itemIndex;
|
|
48
|
-
if (setAsSelected) {
|
|
49
|
-
this.selectedKeys = index;
|
|
50
|
-
}
|
|
51
|
-
const indexArr = [];
|
|
52
|
-
index.forEach((i) => {
|
|
53
|
-
const arr = i.split('_');
|
|
54
|
-
let indexs = "";
|
|
55
|
-
arr.forEach((x) => {
|
|
56
|
-
indexs = indexs.concat("_").concat(x);
|
|
57
|
-
indexArr.push(indexs.substring(1));
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
this.state.expandedkeys = this.state.expandedkeys.concat(indexArr);
|
|
61
|
-
};
|
|
62
|
-
this.collapseNode = (field, value, collapseParent) => {
|
|
63
|
-
this.itemIndex = [];
|
|
64
|
-
this.getItems();
|
|
65
|
-
this.searchNodeIndex(this.nodes, value, '', field);
|
|
66
|
-
const index = this.itemIndex;
|
|
67
|
-
let indexArr = [];
|
|
68
|
-
if (collapseParent) {
|
|
69
|
-
index.forEach((i) => {
|
|
70
|
-
const arr = i.split('_');
|
|
71
|
-
let indexs = "";
|
|
72
|
-
arr.forEach((x) => {
|
|
73
|
-
indexs = indexs.concat("_").concat(x);
|
|
74
|
-
indexArr.push(indexs.substring(1));
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
indexArr = index;
|
|
80
|
-
}
|
|
81
|
-
this.state.expandedkeys = this.state.expandedkeys.filter(v => {
|
|
82
|
-
return !indexArr.includes(v);
|
|
83
|
-
});
|
|
84
|
-
};
|
|
85
|
-
this.expandAll = () => {
|
|
86
|
-
this.getItems();
|
|
87
|
-
if (this.nodes) {
|
|
88
|
-
this.expandAllNode(this.nodes, '');
|
|
89
|
-
}
|
|
90
|
-
};
|
|
91
|
-
this.collapseAll = () => {
|
|
92
|
-
this.state.expandedkeys = [];
|
|
93
|
-
};
|
|
94
|
-
// Custom logic handling Indeterminate state when custom data item property is persisted
|
|
95
|
-
this.isChecked = (dataItem, index) => {
|
|
96
|
-
if (this.data.TreeViewCheckboxConfiguration) {
|
|
97
|
-
if (this.containsItem(dataItem)) {
|
|
98
|
-
return "checked";
|
|
99
|
-
}
|
|
100
|
-
if (this.isIndeterminate(dataItem.Value)) {
|
|
101
|
-
return "indeterminate";
|
|
102
|
-
}
|
|
103
|
-
return "none";
|
|
104
|
-
}
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
ngOnInit() {
|
|
108
|
-
super.initComponent().subscribe(() => {
|
|
109
|
-
this.allNodesWitoutHierachy = [];
|
|
110
|
-
this.getItems();
|
|
111
|
-
this.populateAllNodesWitoutHierachy(this.nodes);
|
|
112
|
-
this.initSetSelectedValues();
|
|
113
|
-
this.initNodeCheckbox();
|
|
114
|
-
this.data.SelectOptions = this.data.SelectOptions || 'Id';
|
|
115
|
-
this.selection.mode = this.data.Multiple ? "multiple" : "single";
|
|
116
|
-
const isExpandAllNodes = ZComponentHelper.getGroupValue(this.data.TreeviewExpandAll, this.group);
|
|
117
|
-
if (isExpandAllNodes) {
|
|
118
|
-
this.expandAll();
|
|
119
|
-
}
|
|
120
|
-
this.data.isHideAllAddNode = this.data.isHideAllAddNode ?? ZComponentHelper.getGroupValue(this.data.isHideAllAddNode, this.group);
|
|
121
|
-
this.data.isHideAllRemoveNode = this.data.isHideAllRemoveNode ?? ZComponentHelper.getGroupValue(this.data.isHideAllRemoveNode, this.group);
|
|
122
|
-
this.setDefaultExpandable();
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
ngAfterViewInit() {
|
|
126
|
-
ZComponentHelper.registerComponent(this);
|
|
127
|
-
this.componentService.decrementComponentCounterForField(this.data);
|
|
128
|
-
}
|
|
129
|
-
populateAllNodesWitoutHierachy(nodes) {
|
|
130
|
-
if (nodes && Array.isArray(nodes)) {
|
|
131
|
-
for (const node of nodes) {
|
|
132
|
-
if (!this.allNodesWitoutHierachy.some(x => x.Id == node.Id)) {
|
|
133
|
-
this.allNodesWitoutHierachy.push(node);
|
|
134
|
-
if (Array.isArray(node.Value)) {
|
|
135
|
-
this.populateAllNodesWitoutHierachy(node.Value);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
getItems() {
|
|
142
|
-
const fieldValue = this.data.Value;
|
|
143
|
-
if (fieldValue) {
|
|
144
|
-
this.nodes = ZComponentHelper.getGroupEvalValue.call(this, this.data.Value);
|
|
145
|
-
if (this.data.Type == "ztree") {
|
|
146
|
-
this.populateAllNodesWitoutHierachy(this.nodes);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
console.warn('ztree field Value is not set correctly. ', fieldValue);
|
|
151
|
-
this.nodes = [];
|
|
152
|
-
}
|
|
153
|
-
return this.nodes;
|
|
154
|
-
}
|
|
155
|
-
getTemplate(dataItem, data, group) {
|
|
156
|
-
if (data.ItemTemplate) {
|
|
157
|
-
const getTemplateFunc = ZComponentHelper.getGroupEvalValue.call(this, data.ItemTemplate);
|
|
158
|
-
if (getTemplateFunc) {
|
|
159
|
-
return getTemplateFunc({
|
|
160
|
-
dataItem,
|
|
161
|
-
data,
|
|
162
|
-
group
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
console.warn("The (" + data.ItemTemplate + ") is not defined correctly. Value contains: ", getTemplateFunc);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
return Object.values(dataItem)
|
|
170
|
-
.filter(data => typeof data === "string")
|
|
171
|
-
.join(", ");
|
|
172
|
-
}
|
|
173
|
-
convertToTreeItems(dataSet) {
|
|
174
|
-
console.warn("This method is to be deprecated. Please use ZComponentHelper.convertToTreeItems()");
|
|
175
|
-
const toTreeItems = [];
|
|
176
|
-
const treeIndex = {};
|
|
177
|
-
const pendingItems = [];
|
|
178
|
-
dataSet.forEach((d) => {
|
|
179
|
-
if (!d.ParentId) {
|
|
180
|
-
toTreeItems.push(d);
|
|
181
|
-
treeIndex[d.Id] = d;
|
|
182
|
-
}
|
|
183
|
-
else {
|
|
184
|
-
if (treeIndex[d.ParentId]) {
|
|
185
|
-
const parentItem = treeIndex[d.ParentId];
|
|
186
|
-
if (!parentItem.Value) {
|
|
187
|
-
parentItem.Value = [];
|
|
188
|
-
}
|
|
189
|
-
parentItem.Value.push(d);
|
|
190
|
-
treeIndex[d.Id] = d;
|
|
191
|
-
}
|
|
192
|
-
else {
|
|
193
|
-
pendingItems.push(d);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
});
|
|
197
|
-
if (pendingItems.length > 0) {
|
|
198
|
-
pendingItems.forEach((d) => {
|
|
199
|
-
if (treeIndex[d.ParentId]) {
|
|
200
|
-
const parentItem = treeIndex[d.ParentId];
|
|
201
|
-
parentItem.Value.push(d);
|
|
202
|
-
treeIndex[d.Id] = d;
|
|
203
|
-
}
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
return toTreeItems;
|
|
207
|
-
}
|
|
208
|
-
onSelectionChange(event) {
|
|
209
|
-
let targetName;
|
|
210
|
-
if (this.clickActName) {
|
|
211
|
-
switch (this.clickActName) {
|
|
212
|
-
case 'AddNode':
|
|
213
|
-
targetName = this.data.OnAddNode;
|
|
214
|
-
break;
|
|
215
|
-
case 'RemoveNode':
|
|
216
|
-
targetName = this.data.OnRemoveNode;
|
|
217
|
-
break;
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
if (!targetName) {
|
|
221
|
-
targetName = this.data.OnItemClick;
|
|
222
|
-
}
|
|
223
|
-
this.clickActName = null;
|
|
224
|
-
this.group.subject.next({
|
|
225
|
-
type: "ztree_onSelectionChange",
|
|
226
|
-
target: targetName,
|
|
227
|
-
data: event.dataItem,
|
|
228
|
-
event: event.index
|
|
229
|
-
});
|
|
230
|
-
}
|
|
231
|
-
onNodeClick(event) {
|
|
232
|
-
// Right click handler
|
|
233
|
-
if (event.type === "contextmenu") {
|
|
234
|
-
this.dataItemContextMenu.showContextMenuManually(event, event.item);
|
|
235
|
-
return;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
getSelectedValues() {
|
|
239
|
-
if (this.allNodesWitoutHierachy && this.selectedKeys && this.allNodesWitoutHierachy.length > 0 && this.selectedKeys.length > 0) {
|
|
240
|
-
return this.allNodesWitoutHierachy.filter(x => this.selectedKeys.includes(x[this.data.SelectOptions]));
|
|
241
|
-
}
|
|
242
|
-
return [];
|
|
243
|
-
}
|
|
244
|
-
setSelectedValues(data) {
|
|
245
|
-
if (data) {
|
|
246
|
-
this.selectedKeys = Array.isArray(data) ? data : [data];
|
|
247
|
-
}
|
|
248
|
-
else {
|
|
249
|
-
this.selectedKeys = [];
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
initSetSelectedValues() {
|
|
253
|
-
if (this.data.SelectedValues) {
|
|
254
|
-
const selectedNodes = ZComponentHelper.getGroupEvalValue.call(this, this.data.SelectedValues);
|
|
255
|
-
this.setSelectedValues(selectedNodes);
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
searchNodeIndex(node, value, key, field) {
|
|
259
|
-
if (key) {
|
|
260
|
-
key = key + '_';
|
|
261
|
-
}
|
|
262
|
-
node.forEach((d, i) => {
|
|
263
|
-
if (d[field] === Number(value) || d[field] === value) {
|
|
264
|
-
this.itemIndex = this.itemIndex.concat(key + '' + i);
|
|
265
|
-
}
|
|
266
|
-
if (Array.isArray(d.Value)) {
|
|
267
|
-
const k = key + '' + i;
|
|
268
|
-
this.searchNodeIndex(d.Value, value, k, field);
|
|
269
|
-
}
|
|
270
|
-
});
|
|
271
|
-
}
|
|
272
|
-
expandAllNode(node, key) {
|
|
273
|
-
if (key) {
|
|
274
|
-
key = key + '_';
|
|
275
|
-
}
|
|
276
|
-
node.forEach((d, i) => {
|
|
277
|
-
if (Array.isArray(d.Value)) {
|
|
278
|
-
const k = key + '' + i;
|
|
279
|
-
this.state.expandedkeys = this.state.expandedkeys.concat(k);
|
|
280
|
-
this.expandAllNode(d.Value, k);
|
|
281
|
-
}
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
handleCollapse(node) {
|
|
285
|
-
this.state.expandedkeys = this.state.expandedkeys.filter(k => k !== node.index);
|
|
286
|
-
}
|
|
287
|
-
handleExpand(node) {
|
|
288
|
-
this.state.expandedkeys = this.state.expandedkeys.concat(node.index);
|
|
289
|
-
}
|
|
290
|
-
setDefaultExpandable() {
|
|
291
|
-
const expandedDataIds = this.data.TreeListInitiallyExpandedDataIds;
|
|
292
|
-
if (expandedDataIds) {
|
|
293
|
-
const idList = typeof expandedDataIds === 'string'
|
|
294
|
-
? ZComponentHelper.getGroupValue(expandedDataIds, this.group)
|
|
295
|
-
: expandedDataIds;
|
|
296
|
-
if (Array.isArray(idList)) {
|
|
297
|
-
this.state.expandedkeys = idList;
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
//#endregion
|
|
302
|
-
//#region Node Handling
|
|
303
|
-
onEditNode(event) {
|
|
304
|
-
if (this.data.OnEditNode) {
|
|
305
|
-
const func = ZComponentHelper.getGroupEvalValue.call(this, this.data.OnEditNode);
|
|
306
|
-
if (typeof func === 'function') {
|
|
307
|
-
const callFunc = func.bind(this.group.ctrlScope);
|
|
308
|
-
callFunc(event);
|
|
309
|
-
}
|
|
310
|
-
return;
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
onAddNode(event, dataItem, data, group) {
|
|
314
|
-
this.clickActName = 'AddNode';
|
|
315
|
-
// event.stopPropagation();
|
|
316
|
-
// if (this.data.OnAddNode) {
|
|
317
|
-
// const func = ZComponentHelper.getGroupEvalValue.call(this, this.data.OnAddNode);
|
|
318
|
-
// if (typeof func === 'function') {
|
|
319
|
-
// const callFunc = func.bind(this.group.ctrlScope);
|
|
320
|
-
// callFunc(dataItem, data, group, event.index);
|
|
321
|
-
// }
|
|
322
|
-
// return;
|
|
323
|
-
// }
|
|
324
|
-
}
|
|
325
|
-
onRemoveNode(event, dataItem, data, group) {
|
|
326
|
-
this.clickActName = 'RemoveNode';
|
|
327
|
-
}
|
|
328
|
-
handleNodeDrop(event) {
|
|
329
|
-
if (this.data.Draggable === false) {
|
|
330
|
-
event.setValid(false);
|
|
331
|
-
return;
|
|
332
|
-
}
|
|
333
|
-
this.isNodeDrop = true;
|
|
334
|
-
const dropHandler = ZComponentHelper.getGroupEvalValue.call(this, this.data.OnDrop);
|
|
335
|
-
if (typeof dropHandler === "function") {
|
|
336
|
-
const callFunc = dropHandler.bind(this);
|
|
337
|
-
callFunc(event);
|
|
338
|
-
}
|
|
339
|
-
// prevent drop if attempting to add to file
|
|
340
|
-
// if (isFile(event.destinationItem.item.dataItem.text) && event.dropPosition === DropPosition.Over) {
|
|
341
|
-
// event.setValid(false);
|
|
342
|
-
// }
|
|
343
|
-
}
|
|
344
|
-
handleNodeDragEnd(event) {
|
|
345
|
-
if (!this.isNodeDrop) {
|
|
346
|
-
return;
|
|
347
|
-
}
|
|
348
|
-
this.isNodeDrop = false;
|
|
349
|
-
this.getItems();
|
|
350
|
-
// console.log('Items: ', this.items);
|
|
351
|
-
const target = [];
|
|
352
|
-
this.updateChangeToDataSet(this.nodes, target);
|
|
353
|
-
// this.dataSet = target;
|
|
354
|
-
ZComponentHelper.setModelValue(this.data.Value, target, this.group);
|
|
355
|
-
this.group.subject.next({
|
|
356
|
-
type: "ztree-onTreeNodeDragEnd",
|
|
357
|
-
target: this.data.OnChange,
|
|
358
|
-
data: target
|
|
359
|
-
});
|
|
360
|
-
}
|
|
361
|
-
updateChangeToDataSet(source, target) {
|
|
362
|
-
source.forEach(d => {
|
|
363
|
-
if (Array.isArray(d.Value)) {
|
|
364
|
-
const t = JSON.parse(JSON.stringify(d));
|
|
365
|
-
t.Value = [];
|
|
366
|
-
target.push(t);
|
|
367
|
-
this.updateChangeToDataSet(d.Value, t.Value);
|
|
368
|
-
}
|
|
369
|
-
else {
|
|
370
|
-
const t = Object.assign({}, d);
|
|
371
|
-
t.Value = t._DataValue;
|
|
372
|
-
delete t._DataValue;
|
|
373
|
-
target.push(t);
|
|
374
|
-
}
|
|
375
|
-
});
|
|
376
|
-
}
|
|
377
|
-
hideAddNode(isHidden = true) {
|
|
378
|
-
this.data.isHideAllAddNode = isHidden;
|
|
379
|
-
}
|
|
380
|
-
hideRemoveNode(isHidden = true) {
|
|
381
|
-
this.data.isHideAllRemoveNode = isHidden;
|
|
382
|
-
}
|
|
383
|
-
//#endregion
|
|
384
|
-
//#region Search feature - filterable: true
|
|
385
|
-
clearFilter() {
|
|
386
|
-
this.items = [];
|
|
387
|
-
this.originalItems = [];
|
|
388
|
-
}
|
|
389
|
-
handleFilter(value) {
|
|
390
|
-
if (this.items.length === 0) {
|
|
391
|
-
this.items = ZComponentHelper.getGroupEvalValue.call(this, this.data.Value);
|
|
392
|
-
}
|
|
393
|
-
if (this.items.length !== 0) {
|
|
394
|
-
if (this.originalItems.length === 0) {
|
|
395
|
-
this.originalItems = ZComponentHelper.deepClone(this.items);
|
|
396
|
-
}
|
|
397
|
-
else
|
|
398
|
-
this.items = ZComponentHelper.deepClone(this.originalItems);
|
|
399
|
-
}
|
|
400
|
-
const gridValue = this.filterPrefix(this.data.Value);
|
|
401
|
-
this.group[gridValue] = this.search(this.items, value);
|
|
402
|
-
if (ZComponentHelper.isNullUndefinedEmpty(value)) {
|
|
403
|
-
this.clearFilter();
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
filterPrefix(valueName) {
|
|
407
|
-
if (valueName.startsWith('zData.')) {
|
|
408
|
-
return valueName.slice(6);
|
|
409
|
-
}
|
|
410
|
-
if (valueName.startsWith('group.zData.')) {
|
|
411
|
-
return valueName.slice(12);
|
|
412
|
-
}
|
|
413
|
-
if (valueName.startsWith('group.')) {
|
|
414
|
-
return valueName.slice(6);
|
|
415
|
-
}
|
|
416
|
-
if (valueName) {
|
|
417
|
-
return valueName;
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
search(items, term) {
|
|
421
|
-
return items.reduce((acc, item) => {
|
|
422
|
-
if (this.contains(item.Name, term)) {
|
|
423
|
-
acc.push(item);
|
|
424
|
-
}
|
|
425
|
-
else if (item.Value && item.Value.length > 0) {
|
|
426
|
-
const newItems = this.search(item.Value, term);
|
|
427
|
-
if (newItems.length > 0) {
|
|
428
|
-
var filterItem = item;
|
|
429
|
-
filterItem.Value = newItems;
|
|
430
|
-
acc.push(filterItem);
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
return acc;
|
|
434
|
-
}, []);
|
|
435
|
-
}
|
|
436
|
-
contains(text, term) {
|
|
437
|
-
return text.toLowerCase().indexOf((term || "").toLowerCase()) >= 0;
|
|
438
|
-
}
|
|
439
|
-
//#endregion
|
|
440
|
-
//#region Checkbox
|
|
441
|
-
initNodeCheckbox() {
|
|
442
|
-
if (!!this.data.TreeViewCheckboxConfiguration) {
|
|
443
|
-
const checkboxConfiguration = this.getCheckboxConfiguration();
|
|
444
|
-
if (checkboxConfiguration.SelectedValues) {
|
|
445
|
-
const checkedNodes = ZComponentHelper.getGroupEvalValue.call(this, checkboxConfiguration.SelectedValues);
|
|
446
|
-
this.setCheckedValues(checkedNodes);
|
|
447
|
-
}
|
|
448
|
-
if (checkboxConfiguration.DisabledValues) {
|
|
449
|
-
const disabledNodes = ZComponentHelper.getGroupEvalValue.call(this, checkboxConfiguration.DisabledValues);
|
|
450
|
-
this.setDisabledCheckBox(disabledNodes);
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
getCheckboxConfiguration() {
|
|
455
|
-
let checkboxConfiguration;
|
|
456
|
-
if (typeof this.data.TreeViewCheckboxConfiguration === 'string') {
|
|
457
|
-
// If CheckboxConfiguration is a string, retrieve the configuration from group
|
|
458
|
-
checkboxConfiguration = ZComponentHelper.getGroupValue(this.data.TreeViewCheckboxConfiguration, this.group);
|
|
459
|
-
}
|
|
460
|
-
else {
|
|
461
|
-
// If CheckboxConfiguration is an object, use it directly
|
|
462
|
-
checkboxConfiguration = this.data.TreeViewCheckboxConfiguration;
|
|
463
|
-
}
|
|
464
|
-
return checkboxConfiguration;
|
|
465
|
-
}
|
|
466
|
-
setValues(data, targetVariable, defaultValue = []) {
|
|
467
|
-
this[targetVariable] = data ? (Array.isArray(data) ? data : [data]) : defaultValue;
|
|
468
|
-
}
|
|
469
|
-
setCheckedValues(data) {
|
|
470
|
-
this.setValues(data, 'checkedKeys');
|
|
471
|
-
}
|
|
472
|
-
setDisabledCheckBox(data) {
|
|
473
|
-
this.setValues(data, 'disabledCheckBoxKeys');
|
|
474
|
-
}
|
|
475
|
-
get checkableSettings() {
|
|
476
|
-
if (!!this.data.TreeViewCheckboxConfiguration) {
|
|
477
|
-
const checkboxConfiguration = this.getCheckboxConfiguration();
|
|
478
|
-
const checkableSettings = {
|
|
479
|
-
enabled: true,
|
|
480
|
-
checkParents: !checkboxConfiguration.DisableParentAutoSelectOnAllChildren,
|
|
481
|
-
checkChildren: !checkboxConfiguration.DisableParentSelectsAllChildren,
|
|
482
|
-
checkDisabledChildren: checkboxConfiguration.EnableDisabledChildrenSelection,
|
|
483
|
-
mode: checkboxConfiguration.SelectMultiple ? 'multiple' : 'single',
|
|
484
|
-
checkOnClick: checkboxConfiguration.ToggleCheckboxOnNodeClick,
|
|
485
|
-
};
|
|
486
|
-
return checkableSettings;
|
|
487
|
-
}
|
|
488
|
-
return {
|
|
489
|
-
enabled: false,
|
|
490
|
-
};
|
|
491
|
-
}
|
|
492
|
-
onCheckedChange(event) {
|
|
493
|
-
if (!!this.data.TreeViewCheckboxConfiguration) {
|
|
494
|
-
const checkboxConfiguration = this.getCheckboxConfiguration();
|
|
495
|
-
const targetName = checkboxConfiguration.OnChange;
|
|
496
|
-
const isChecked = this.checkedKeys.indexOf(event.item.dataItem.Id) > -1;
|
|
497
|
-
this.group.subject.next({
|
|
498
|
-
type: "ztree_OnCheckboxChange",
|
|
499
|
-
target: targetName,
|
|
500
|
-
event,
|
|
501
|
-
data: { checkedValue: isChecked, selectedItem: event.item.dataItem, field: this.data, comp: this }
|
|
502
|
-
});
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
getCheckedValues() {
|
|
506
|
-
if (this.allNodesWitoutHierachy && this.checkedKeys && this.allNodesWitoutHierachy.length > 0 && this.checkedKeys.length > 0) {
|
|
507
|
-
const selectOptionsKey = this.data.SelectOptions;
|
|
508
|
-
return this.allNodesWitoutHierachy.filter(node => this.checkedKeys.includes(node[selectOptionsKey]));
|
|
509
|
-
}
|
|
510
|
-
return [];
|
|
511
|
-
}
|
|
512
|
-
containsItem(item) {
|
|
513
|
-
return this.checkedKeys.indexOf(item[this.data.SelectOptions]) > -1;
|
|
514
|
-
}
|
|
515
|
-
isIndeterminate(items = []) {
|
|
516
|
-
let idx = 0;
|
|
517
|
-
let item;
|
|
518
|
-
while ((item = items[idx])) {
|
|
519
|
-
if (this.isIndeterminate(item.Value) || this.containsItem(item)) {
|
|
520
|
-
return true;
|
|
521
|
-
}
|
|
522
|
-
idx += 1;
|
|
523
|
-
}
|
|
524
|
-
return false;
|
|
525
|
-
}
|
|
526
|
-
}
|
|
527
|
-
ZtreeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZtreeComponent, deps: [{ token: i1.ZComponentService }], target: i0.ɵɵFactoryTarget.Component });
|
|
528
|
-
ZtreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: ZtreeComponent, selector: "app-ztree", viewQueries: [{ propertyName: "nodetemplate", first: true, predicate: ["nodetemplate"], descendants: true, static: true }, { propertyName: "zinput_textboxList", predicate: ["zinput_textbox"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div style=\"width:100%\" [style]=\"componentProperties.style.style\" class=\"e1tag-style\"\r\n *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\">\r\n <kendo-treeview [nodes]=\"getItems()\"\r\n kendoTreeViewExpandable\r\n [kendoTreeViewSelectable]=\"selection\"\r\n kendoTreeViewDragAndDrop\r\n kendoTreeViewDragAndDropEditing\r\n [isExpanded]=\"isExpanded\"\r\n (collapse)=\"handleCollapse($event)\"\r\n (expand)=\"handleExpand($event)\"\r\n (nodeDrop)=\"handleNodeDrop($event)\"\r\n (nodeDragEnd)=\"handleNodeDragEnd($event)\"\r\n (selectionChange)=\"onSelectionChange($event)\"\r\n [(selectedKeys)]=\"selectedKeys\"\r\n kendoTreeViewHierarchyBinding\r\n childrenField=\"Value\"\r\n textField=\"Name\"\r\n [selectBy]=\"data.SelectOptions\"\r\n [filterable]=\"data.Filterable\"\r\n (filterChange)=\"handleFilter($event)\"\r\n [style]=\"componentProperties.style.style1\"\r\n class=\"e1tag-style1\"\r\n [ngClass]=\"data.Class\"\r\n [kendoTreeViewCheckable]=\"checkableSettings\"\r\n [checkBy]=\"data.SelectOptions\"\r\n [(checkedKeys)]=\"checkedKeys\"\r\n (checkedChange)=\"onCheckedChange($event)\"\r\n [kendoTreeViewDisable]=\"data.SelectOptions\"\r\n [isChecked]=\"isChecked\"\r\n [(disabledKeys)]=\"disabledCheckBoxKeys\"\r\n [disableParentNodesOnly]=\"data.DisableParentNodesOnly\"\r\n [expandDisabledNodes]=\"data.ExpandDisabledNodes\"\r\n (nodeClick)=\"onNodeClick($event)\">\r\n <ng-template kendoTreeViewNodeTemplate let-dataItem #nodetemplate>\r\n <div class=\"tree-content-container\">\r\n <ion-button *ngIf=\"!!data.OnAddNode && !data.isHideAllAddNode\"\r\n (click)=\"onAddNode($event, dataItem, data, group)\"\r\n style=\"zoom: 0.6; margin: 0 0 0 2px;\"\r\n mat-raised-button\r\n color=\"primary\"\r\n size=\"medium\"\r\n [hidden]=\"!!dataItem.OnAddNodeVisible\"\r\n [style]=\"componentProperties.style.style2\"\r\n class=\"e1tag-style2\">\r\n <fa-icon [icon]=\"'plus'\"></fa-icon>\r\n </ion-button>\r\n <ion-button *ngIf=\"!!data.OnRemoveNode && !data.isHideAllRemoveNode\"\r\n (click)=\"onRemoveNode($event, dataItem, data, group)\"\r\n style=\"zoom: 0.6; margin: 0 0 0 10px;\"\r\n color=\"danger\"\r\n mat-raised-button\r\n size=\"medium\"\r\n [hidden]=\"!!dataItem.OnRemoveNodeVisible\"\r\n [style]=\"componentProperties.style.style3\"\r\n class=\"e1tag-style3\">\r\n <fa-icon [icon]=\"'minus'\"></fa-icon>\r\n </ion-button>\r\n <span class=\"btn-seperator e1tag-style7\" [style]=\"componentProperties.style.style7\"></span>\r\n <span *ngFor=\"let icon of dataItem.IconList\">\r\n <fa-icon class=\"e1tag-style5 left-icon\" [icon]=\"icon\" [style]=\"componentProperties.style.style5\"></fa-icon>\r\n </span>\r\n <ion-label [style]=\"componentProperties.style.style4\" class=\"e1tag-style4\" [ngClass]=\"dataItem.class\" *ngIf=\"!dataItem.z_inputType\">\r\n <div [style]=\"componentProperties.style.style6\" class=\"e1tag-style6\" [innerHTML]=\"getTemplate(dataItem, data, group) | htmlSanitize\"></div>\r\n </ion-label>\r\n <div [style]=\"componentProperties.style.style4\" class=\"e1tag-style4\" [ngClass]=\"dataItem.class\" *ngIf=\"!!dataItem.z_inputType\">\r\n <kendo-textbox\r\n #zinput_textbox\r\n *ngIf=\"dataItem.z_inputType == 'text'\"\r\n class=\"input-field e1tag-style8\"\r\n [id]=\"data.Name + '_' + dataItem.z_inputType + '_' + dataItem.Id\"\r\n [style]=\"componentProperties.style.style8\"\r\n [(ngModel)]=\"dataItem.z_inputValue\">\r\n </kendo-textbox>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </kendo-treeview>\r\n <app-context-menu [data]=\"data\" [group]=\"group\" [form]=\"form\" #dataitemcontextmenu></app-context-menu>\r\n</div>\r\n", styles: [":host ::ng-deep .k-treeview .k-treeview-leaf{width:100%;margin:5px;padding:9px 20px 9px 8px;border-radius:2px;background:rgba(var(--ion-color-primary-rgb),.15);color:var(--ion-color-primary-shade);border:1px solid rgba(var(--ion-color-primary-rgb),1);font-size:13px;cursor:pointer}:host ::ng-deep .k-treeview .k-treeview-leaf.k-selected,:host ::ng-deep .k-treeview .k-treeview-leaf.k-state-selected{width:100%;margin:5px;padding:9px 20px 9px 8px;border-radius:2px;background:rgba(var(--ion-color-primary-rgb),.5);font-size:13px;cursor:pointer}:host ::ng-deep .k-treeview .k-treeview-leaf:hover,:host ::ng-deep .k-treeview .k-treeview-leaf.k-hover .k-treeview-leaf.k-state-hover{width:100%;margin:5px;padding:9px 20px 9px 8px;border-radius:2px;background:rgba(var(--ion-color-primary-rgb),.1);font-size:13px;cursor:pointer}:host ::ng-deep .k-treeview .tree-content-container{display:flex;align-items:center;justify-content:center}:host ::ng-deep .k-treeview .btn-seperator{width:10px;display:inline-block}.left-icon{margin-right:8px}\n"], components: [{ type: i2.TreeViewComponent, selector: "kendo-treeview", inputs: ["filterInputPlaceholder", "expandDisabledNodes", "animate", "nodeTemplate", "loadMoreButtonTemplate", "trackBy", "nodes", "textField", "hasChildren", "isChecked", "isDisabled", "isExpanded", "isSelected", "isVisible", "navigable", "children", "loadOnDemand", "filterable", "filter", "size", "disableParentNodesOnly"], outputs: ["childrenLoaded", "blur", "focus", "expand", "collapse", "nodeDragStart", "nodeDrag", "filterStateChange", "nodeDrop", "nodeDragEnd", "addItem", "removeItem", "checkedChange", "selectionChange", "filterChange", "nodeClick", "nodeDblClick"], exportAs: ["kendoTreeView"] }, { type: i3.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { type: i4.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i3.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { type: i5.TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "errorIcon", "clearButtonIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { type: i6.ContextMenuComponent, selector: "app-context-menu", inputs: ["target", "selectedData"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.ExpandDirective, selector: "[kendoTreeViewExpandable]", inputs: ["isExpanded", "expandBy", "expandOnFilter", "expandedKeys"], outputs: ["expandedKeysChange"] }, { type: i2.DragAndDropDirective, selector: "[kendoTreeViewDragAndDrop]", inputs: ["allowCopy", "dropZoneTreeViews", "startDragAfter", "autoScroll"] }, { type: i2.DragAndDropEditingDirective, selector: "[kendoTreeViewDragAndDropEditing]", inputs: ["editService"] }, { type: i2.HierarchyBindingDirective, selector: "[kendoTreeViewHierarchyBinding]", inputs: ["childrenField", "nodes", "isVisible", "loadOnDemand"] }, { type: i2.SelectDirective, selector: "[kendoTreeViewSelectable]", inputs: ["isSelected", "selectBy", "kendoTreeViewSelectable", "selectedKeys"], outputs: ["selectedKeysChange"] }, { type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i8.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i2.CheckDirective, selector: "[kendoTreeViewCheckable]", inputs: ["isChecked", "checkBy", "checkedKeys", "kendoTreeViewCheckable"], outputs: ["checkedKeysChange"] }, { type: i2.DisableDirective, selector: "[kendoTreeViewDisable]", inputs: ["isDisabled", "kendoTreeViewDisable", "disabledKeys"] }, { type: i2.NodeTemplateDirective, selector: "[kendoTreeViewNodeTemplate]" }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "htmlSanitize": i10.HtmlSanitizePipe } });
|
|
529
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZtreeComponent, decorators: [{
|
|
530
|
-
type: Component,
|
|
531
|
-
args: [{ selector: "app-ztree", template: "<div style=\"width:100%\" [style]=\"componentProperties.style.style\" class=\"e1tag-style\"\r\n *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\">\r\n <kendo-treeview [nodes]=\"getItems()\"\r\n kendoTreeViewExpandable\r\n [kendoTreeViewSelectable]=\"selection\"\r\n kendoTreeViewDragAndDrop\r\n kendoTreeViewDragAndDropEditing\r\n [isExpanded]=\"isExpanded\"\r\n (collapse)=\"handleCollapse($event)\"\r\n (expand)=\"handleExpand($event)\"\r\n (nodeDrop)=\"handleNodeDrop($event)\"\r\n (nodeDragEnd)=\"handleNodeDragEnd($event)\"\r\n (selectionChange)=\"onSelectionChange($event)\"\r\n [(selectedKeys)]=\"selectedKeys\"\r\n kendoTreeViewHierarchyBinding\r\n childrenField=\"Value\"\r\n textField=\"Name\"\r\n [selectBy]=\"data.SelectOptions\"\r\n [filterable]=\"data.Filterable\"\r\n (filterChange)=\"handleFilter($event)\"\r\n [style]=\"componentProperties.style.style1\"\r\n class=\"e1tag-style1\"\r\n [ngClass]=\"data.Class\"\r\n [kendoTreeViewCheckable]=\"checkableSettings\"\r\n [checkBy]=\"data.SelectOptions\"\r\n [(checkedKeys)]=\"checkedKeys\"\r\n (checkedChange)=\"onCheckedChange($event)\"\r\n [kendoTreeViewDisable]=\"data.SelectOptions\"\r\n [isChecked]=\"isChecked\"\r\n [(disabledKeys)]=\"disabledCheckBoxKeys\"\r\n [disableParentNodesOnly]=\"data.DisableParentNodesOnly\"\r\n [expandDisabledNodes]=\"data.ExpandDisabledNodes\"\r\n (nodeClick)=\"onNodeClick($event)\">\r\n <ng-template kendoTreeViewNodeTemplate let-dataItem #nodetemplate>\r\n <div class=\"tree-content-container\">\r\n <ion-button *ngIf=\"!!data.OnAddNode && !data.isHideAllAddNode\"\r\n (click)=\"onAddNode($event, dataItem, data, group)\"\r\n style=\"zoom: 0.6; margin: 0 0 0 2px;\"\r\n mat-raised-button\r\n color=\"primary\"\r\n size=\"medium\"\r\n [hidden]=\"!!dataItem.OnAddNodeVisible\"\r\n [style]=\"componentProperties.style.style2\"\r\n class=\"e1tag-style2\">\r\n <fa-icon [icon]=\"'plus'\"></fa-icon>\r\n </ion-button>\r\n <ion-button *ngIf=\"!!data.OnRemoveNode && !data.isHideAllRemoveNode\"\r\n (click)=\"onRemoveNode($event, dataItem, data, group)\"\r\n style=\"zoom: 0.6; margin: 0 0 0 10px;\"\r\n color=\"danger\"\r\n mat-raised-button\r\n size=\"medium\"\r\n [hidden]=\"!!dataItem.OnRemoveNodeVisible\"\r\n [style]=\"componentProperties.style.style3\"\r\n class=\"e1tag-style3\">\r\n <fa-icon [icon]=\"'minus'\"></fa-icon>\r\n </ion-button>\r\n <span class=\"btn-seperator e1tag-style7\" [style]=\"componentProperties.style.style7\"></span>\r\n <span *ngFor=\"let icon of dataItem.IconList\">\r\n <fa-icon class=\"e1tag-style5 left-icon\" [icon]=\"icon\" [style]=\"componentProperties.style.style5\"></fa-icon>\r\n </span>\r\n <ion-label [style]=\"componentProperties.style.style4\" class=\"e1tag-style4\" [ngClass]=\"dataItem.class\" *ngIf=\"!dataItem.z_inputType\">\r\n <div [style]=\"componentProperties.style.style6\" class=\"e1tag-style6\" [innerHTML]=\"getTemplate(dataItem, data, group) | htmlSanitize\"></div>\r\n </ion-label>\r\n <div [style]=\"componentProperties.style.style4\" class=\"e1tag-style4\" [ngClass]=\"dataItem.class\" *ngIf=\"!!dataItem.z_inputType\">\r\n <kendo-textbox\r\n #zinput_textbox\r\n *ngIf=\"dataItem.z_inputType == 'text'\"\r\n class=\"input-field e1tag-style8\"\r\n [id]=\"data.Name + '_' + dataItem.z_inputType + '_' + dataItem.Id\"\r\n [style]=\"componentProperties.style.style8\"\r\n [(ngModel)]=\"dataItem.z_inputValue\">\r\n </kendo-textbox>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </kendo-treeview>\r\n <app-context-menu [data]=\"data\" [group]=\"group\" [form]=\"form\" #dataitemcontextmenu></app-context-menu>\r\n</div>\r\n", styles: [":host ::ng-deep .k-treeview .k-treeview-leaf{width:100%;margin:5px;padding:9px 20px 9px 8px;border-radius:2px;background:rgba(var(--ion-color-primary-rgb),.15);color:var(--ion-color-primary-shade);border:1px solid rgba(var(--ion-color-primary-rgb),1);font-size:13px;cursor:pointer}:host ::ng-deep .k-treeview .k-treeview-leaf.k-selected,:host ::ng-deep .k-treeview .k-treeview-leaf.k-state-selected{width:100%;margin:5px;padding:9px 20px 9px 8px;border-radius:2px;background:rgba(var(--ion-color-primary-rgb),.5);font-size:13px;cursor:pointer}:host ::ng-deep .k-treeview .k-treeview-leaf:hover,:host ::ng-deep .k-treeview .k-treeview-leaf.k-hover .k-treeview-leaf.k-state-hover{width:100%;margin:5px;padding:9px 20px 9px 8px;border-radius:2px;background:rgba(var(--ion-color-primary-rgb),.1);font-size:13px;cursor:pointer}:host ::ng-deep .k-treeview .tree-content-container{display:flex;align-items:center;justify-content:center}:host ::ng-deep .k-treeview .btn-seperator{width:10px;display:inline-block}.left-icon{margin-right:8px}\n"] }]
|
|
532
|
-
}], ctorParameters: function () { return [{ type: i1.ZComponentService }]; }, propDecorators: { nodetemplate: [{
|
|
533
|
-
type: ViewChild,
|
|
534
|
-
args: ["nodetemplate", { static: true }]
|
|
535
|
-
}], zinput_textboxList: [{
|
|
536
|
-
type: ViewChildren,
|
|
537
|
-
args: ["zinput_textbox"]
|
|
538
|
-
}] } });
|
|
539
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienRyZWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenRyZWUvenRyZWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenRyZWUvenRyZWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUE2QixZQUFZLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFPakgsMkNBQTJDO0FBQzNDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBRXBGLE9BQU8sRUFBNkMsZ0JBQWdCLEVBQThELE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7Ozs7OztBQVUxSixNQUFNLE9BQU8sY0FBZSxTQUFRLG9CQUFvQjtJQWlCdEQsWUFDUyxnQkFBbUM7UUFFMUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFGaEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFtQjtRQWQ1QyxVQUFLLEdBQWUsRUFBRSxDQUFDO1FBQ3ZCLGtCQUFhLEdBQWUsRUFBRSxDQUFDO1FBQy9CLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDWixVQUFLLEdBQUcsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDN0IsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNmLGlCQUFZLEdBQVUsRUFBRSxDQUFDO1FBQ3pCLGdCQUFXLEdBQVUsRUFBRSxDQUFDO1FBQ3hCLHlCQUFvQixHQUFVLEVBQUUsQ0FBQztRQUNqQyxjQUFTLEdBQXVCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO1FBQ25ELFVBQUssR0FBRyxFQUFFLENBQUM7UUFDViwyQkFBc0IsR0FBRyxFQUFFLENBQUM7UUFDNUIs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SUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRU8sZUFBZSxDQUFDLFFBQWUsRUFBRTtRQUN2QyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDWixJQUFJLElBQUksQ0FBQztRQUVULE9BQU8sQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDMUIsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMvRCxPQUFPLElBQUksQ0FBQzthQUNiO1lBRUQsR0FBRyxJQUFJLENBQUMsQ0FBQztTQUNWO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOzsyR0FubEJVLGNBQWM7K0ZBQWQsY0FBYyw4UkNyQjNCLGduSkErRUE7MkZEMURhLGNBQWM7a0JBTjFCLFNBQVM7K0JBQ0UsV0FBVzt3R0FNd0IsWUFBWTtzQkFBeEQsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNKLGtCQUFrQjtzQkFBeEQsWUFBWTt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKiBBbmd1bGFyICoqKioqKioqKiovXHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQsIFZpZXdDaGlsZHJlbiwgUXVlcnlMaXN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8qKioqKioqKioqIElvbmljICoqKioqKioqKiovXHJcblxyXG4vKioqKioqKioqKiBQbHVnaW4gKioqKioqKioqKi9cclxuaW1wb3J0IHsgVHJlZUl0ZW1Ecm9wRXZlbnQsIFRyZWVJdGVtRHJhZ0V2ZW50LCBTZWxlY3RhYmxlU2V0dGluZ3MsIENoZWNrYWJsZVNldHRpbmdzLCBDaGVja2VkU3RhdGUgfSBmcm9tIFwiQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItdHJlZXZpZXdcIjtcclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuaW1wb3J0IHsgRGF0YUxpc3RpbmdGaWVsZEJhc2UgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9kYXRhbGlzdGluZ2ZpZWxkYmFzZS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgWkNvbXBvbmVudFNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvemNvbXBvbmVudC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFRyZWVWaWV3Q2hlY2tib3hDb25maWd1cmF0aW9uLCBaQ29tcG9uZW50LCBaQ29tcG9uZW50SGVscGVyLCBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIFpGaWVsZCwgWkdyb3VwLCBaVHJlZVRlbXBsYXRlUGFyYW1zIH0gZnJvbSBcIm1taGdsb2JhbC16Y29yZVwiO1xyXG5pbXBvcnQgeyBUZXh0Qm94Q29tcG9uZW50IH0gZnJvbSBcIkBwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWlucHV0c1wiO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImFwcC16dHJlZVwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4venRyZWUuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybHM6IFtcIi4venRyZWUuY29tcG9uZW50LnNjc3NcIl1cclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBadHJlZUNvbXBvbmVudCBleHRlbmRzIERhdGFMaXN0aW5nRmllbGRCYXNlIGltcGxlbWVudHMgWkNvbXBvbmVudCwgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcclxuICBAVmlld0NoaWxkKFwibm9kZXRlbXBsYXRlXCIsIHsgc3RhdGljOiB0cnVlIH0pIG5vZGV0ZW1wbGF0ZTogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkcmVuKFwiemlucHV0X3RleHRib3hcIikgcHVibGljIHppbnB1dF90ZXh0Ym94TGlzdDogUXVlcnlMaXN0PFRleHRCb3hDb21wb25lbnQ+O1xyXG5cclxuICBpdGVtczogQXJyYXk8YW55PiA9IFtdO1xyXG4gIG9yaWdpbmFsSXRlbXM6IEFycmF5PGFueT4gPSBbXTtcclxuICBpc05vZGVEcm9wID0gZmFsc2U7XHJcbiAgcHVibGljIHN0YXRlID0geyBleHBhbmRlZGtleXM6IFtdIH07XHJcbiAgcHVibGljIGl0ZW1JbmRleCA9IFtdO1xyXG4gIHB1YmxpYyBzZWxlY3RlZEtleXM6IGFueVtdID0gW107XHJcbiAgcHVibGljIGNoZWNrZWRLZXlzOiBhbnlbXSA9IFtdO1xyXG4gIHB1YmxpYyBkaXNhYmxlZENoZWNrQm94S2V5czogYW55W10gPSBbXTtcclxuICBwdWJsaWMgc2VsZWN0aW9uOiBTZWxlY3RhYmxlU2V0dGluZ3MgPSB7IG1vZGU6IFwic2luZ2xlXCIgfTtcclxuICBwdWJsaWMgbm9kZXMgPSBbXTtcclxuICBwcml2YXRlIGFsbE5vZGVzV2l0b3V0SGllcmFjaHkgPSBbXTtcclxuICBwcml2YXRlIGNsaWNrQWN0TmFtZSA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGNvbXBvbmVudFNlcnZpY2U6IFpDb21wb25lbnRTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBzdXBlcihjb21wb25lbnRTZXJ2aWNlKVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBzdXBlci5pbml0Q29tcG9uZW50KCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5hbGxOb2Rlc1dpdG91dEhpZXJhY2h5ID0gW107XHJcbiAgICAgIHRoaXMuZ2V0SXRlbXMoKTtcclxuICAgICAgdGhpcy5wb3B1bGF0ZUFsbE5vZGVzV2l0b3V0SGllcmFjaHkodGhpcy5ub2Rlcyk7XHJcbiAgICAgIHRoaXMuaW5pdFNldFNlbGVjdGVkVmFsdWVzKCk7XHJcbiAgICAgIHRoaXMuaW5pdE5vZGVDaGVja2JveCgpO1xyXG4gICAgICB0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucyA9IHRoaXMuZGF0YS5TZWxlY3RPcHRpb25zIHx8ICdJZCc7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uLm1vZGUgPSB0aGlzLmRhdGEuTXVsdGlwbGUgPyBcIm11bHRpcGxlXCIgOiBcInNpbmdsZVwiO1xyXG5cclxuICAgICAgY29uc3QgaXNFeHBhbmRBbGxOb2RlcyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZSh0aGlzLmRhdGEuVHJlZXZpZXdFeHBhbmRBbGwgYXMgYW55LCB0aGlzLmdyb3VwKTtcclxuICAgICAgaWYgKGlzRXhwYW5kQWxsTm9kZXMpIHtcclxuICAgICAgICB0aGlzLmV4cGFuZEFsbCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmRhdGEuaXNIaWRlQWxsQWRkTm9kZSA9IHRoaXMuZGF0YS5pc0hpZGVBbGxBZGROb2RlID8/IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZSh0aGlzLmRhdGEuaXNIaWRlQWxsQWRkTm9kZSBhcyBhbnksIHRoaXMuZ3JvdXApO1xyXG4gICAgICB0aGlzLmRhdGEuaXNIaWRlQWxsUmVtb3ZlTm9kZSA9IHRoaXMuZGF0YS5pc0hpZGVBbGxSZW1vdmVOb2RlID8/IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZSh0aGlzLmRhdGEuaXNIaWRlQWxsUmVtb3ZlTm9kZSBhcyBhbnksIHRoaXMuZ3JvdXApO1xyXG5cclxuICAgICAgdGhpcy5zZXREZWZhdWx0RXhwYW5kYWJsZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnJlZ2lzdGVyQ29tcG9uZW50KHRoaXMpO1xyXG4gICAgdGhpcy5jb21wb25lbnRTZXJ2aWNlLmRlY3JlbWVudENvbXBvbmVudENvdW50ZXJGb3JGaWVsZCh0aGlzLmRhdGEpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHBvcHVsYXRlQWxsTm9kZXNXaXRvdXRIaWVyYWNoeShub2RlczogYW55KSB7XHJcbiAgICBpZiAobm9kZXMgJiYgQXJyYXkuaXNBcnJheShub2RlcykpIHtcclxuICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmFsbE5vZGVzV2l0b3V0SGllcmFjaHkuc29tZSh4ID0+IHguSWQgPT0gbm9kZS5JZCkpIHtcclxuICAgICAgICAgIHRoaXMuYWxsTm9kZXNXaXRvdXRIaWVyYWNoeS5wdXNoKG5vZGUpO1xyXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobm9kZS5WYWx1ZSkpIHtcclxuICAgICAgICAgICAgdGhpcy5wb3B1bGF0ZUFsbE5vZGVzV2l0b3V0SGllcmFjaHkobm9kZS5WYWx1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRJdGVtcygpIHtcclxuICAgIGNvbnN0IGZpZWxkVmFsdWUgPSB0aGlzLmRhdGEuVmFsdWU7XHJcbiAgICBpZiAoZmllbGRWYWx1ZSkge1xyXG4gICAgICB0aGlzLm5vZGVzID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIHRoaXMuZGF0YS5WYWx1ZSk7XHJcbiAgICAgIGlmICh0aGlzLmRhdGEuVHlwZSA9PSBcInp0cmVlXCIpIHtcclxuICAgICAgICB0aGlzLnBvcHVsYXRlQWxsTm9kZXNXaXRvdXRIaWVyYWNoeSh0aGlzLm5vZGVzKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCd6dHJlZSBmaWVsZCBWYWx1ZSBpcyBub3Qgc2V0IGNvcnJlY3RseS4gJywgZmllbGRWYWx1ZSk7XHJcbiAgICAgIHRoaXMubm9kZXMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5ub2RlcztcclxuICB9XHJcblxyXG4gIGdldFRlbXBsYXRlKGRhdGFJdGVtOiBhbnksIGRhdGE6IFpGaWVsZCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKGRhdGEuSXRlbVRlbXBsYXRlKSB7XHJcbiAgICAgIGNvbnN0IGdldFRlbXBsYXRlRnVuYyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbChcclxuICAgICAgICB0aGlzLFxyXG4gICAgICAgIGRhdGEuSXRlbVRlbXBsYXRlXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChnZXRUZW1wbGF0ZUZ1bmMpIHtcclxuICAgICAgICByZXR1cm4gZ2V0VGVtcGxhdGVGdW5jKHtcclxuICAgICAgICAgIGRhdGFJdGVtLFxyXG4gICAgICAgICAgZGF0YSxcclxuICAgICAgICAgIGdyb3VwXHJcbiAgICAgICAgfSBhcyBaVHJlZVRlbXBsYXRlUGFyYW1zKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oXCJUaGUgKFwiICsgZGF0YS5JdGVtVGVtcGxhdGUgKyBcIikgaXMgbm90IGRlZmluZWQgY29ycmVjdGx5LiBWYWx1ZSBjb250YWluczogXCIsIGdldFRlbXBsYXRlRnVuYyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhkYXRhSXRlbSlcclxuICAgICAgLmZpbHRlcihkYXRhID0+IHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiKVxyXG4gICAgICAuam9pbihcIiwgXCIpO1xyXG5cclxuICB9XHJcblxyXG4gIGNvbnZlcnRUb1RyZWVJdGVtcyhkYXRhU2V0OiBhbnlbXSkge1xyXG4gICAgY29uc29sZS53YXJuKFwiVGhpcyBtZXRob2QgaXMgdG8gYmUgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBaQ29tcG9uZW50SGVscGVyLmNvbnZlcnRUb1RyZWVJdGVtcygpXCIpO1xyXG5cclxuICAgIGNvbnN0IHRvVHJlZUl0ZW1zOiBhbnlbXSA9IFtdO1xyXG4gICAgY29uc3QgdHJlZUluZGV4OiBhbnkgPSB7fTtcclxuICAgIGNvbnN0IHBlbmRpbmdJdGVtczogYW55W10gPSBbXTtcclxuICAgIGRhdGFTZXQuZm9yRWFjaCgoZDogYW55KSA9PiB7XHJcbiAgICAgIGlmICghZC5QYXJlbnRJZCkge1xyXG4gICAgICAgIHRvVHJlZUl0ZW1zLnB1c2goZCk7XHJcbiAgICAgICAgdHJlZUluZGV4W2QuSWRdID0gZDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodHJlZUluZGV4W2QuUGFyZW50SWRdKSB7XHJcbiAgICAgICAgICBjb25zdCBwYXJlbnRJdGVtID0gdHJlZUluZGV4W2QuUGFyZW50SWRdO1xyXG4gICAgICAgICAgaWYgKCFwYXJlbnRJdGVtLlZhbHVlKSB7XHJcbiAgICAgICAgICAgIHBhcmVudEl0ZW0uVmFsdWUgPSBbXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHBhcmVudEl0ZW0uVmFsdWUucHVzaChkKTtcclxuICAgICAgICAgIHRyZWVJbmRleFtkLklkXSA9IGQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHBlbmRpbmdJdGVtcy5wdXNoKGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHBlbmRpbmdJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHBlbmRpbmdJdGVtcy5mb3JFYWNoKChkOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAodHJlZUluZGV4W2QuUGFyZW50SWRdKSB7XHJcbiAgICAgICAgICBjb25zdCBwYXJlbnRJdGVtID0gdHJlZUluZGV4W2QuUGFyZW50SWRdO1xyXG4gICAgICAgICAgcGFyZW50SXRlbS5WYWx1ZS5wdXNoKGQpO1xyXG4gICAgICAgICAgdHJlZUluZGV4W2QuSWRdID0gZDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0b1RyZWVJdGVtcztcclxuICB9XHJcblxyXG4gIG9uU2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgIGxldCB0YXJnZXROYW1lOiBib29sZWFuIHwgc3RyaW5nO1xyXG4gICAgaWYgKHRoaXMuY2xpY2tBY3ROYW1lKSB7XHJcbiAgICAgIHN3aXRjaCAodGhpcy5jbGlja0FjdE5hbWUpIHtcclxuICAgICAgICBjYXNlICdBZGROb2RlJzpcclxuICAgICAgICAgIHRhcmdldE5hbWUgPSB0aGlzLmRhdGEuT25BZGROb2RlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnUmVtb3ZlTm9kZSc6XHJcbiAgICAgICAgICB0YXJnZXROYW1lID0gdGhpcy5kYXRhLk9uUmVtb3ZlTm9kZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0YXJnZXROYW1lKSB7XHJcbiAgICAgIHRhcmdldE5hbWUgPSB0aGlzLmRhdGEuT25JdGVtQ2xpY2s7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jbGlja0FjdE5hbWUgPSBudWxsO1xyXG4gICAgdGhpcy5ncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICB0eXBlOiBcInp0cmVlX29uU2VsZWN0aW9uQ2hhbmdlXCIsXHJcbiAgICAgIHRhcmdldDogdGFyZ2V0TmFtZSxcclxuICAgICAgZGF0YTogZXZlbnQuZGF0YUl0ZW0sXHJcbiAgICAgIGV2ZW50OiBldmVudC5pbmRleFxyXG4gICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uTm9kZUNsaWNrKGV2ZW50OiBhbnkpIHtcclxuICAgIC8vIFJpZ2h0IGNsaWNrIGhhbmRsZXJcclxuICAgIGlmIChldmVudC50eXBlID09PSBcImNvbnRleHRtZW51XCIpIHtcclxuICAgICAgdGhpcy5kYXRhSXRlbUNvbnRleHRNZW51LnNob3dDb250ZXh0TWVudU1hbnVhbGx5KGV2ZW50LCBldmVudC5pdGVtKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFNlbGVjdGVkVmFsdWVzKCk6IEFycmF5PGFueT4ge1xyXG4gICAgaWYgKHRoaXMuYWxsTm9kZXNXaXRvdXRIaWVyYWNoeSAmJiB0aGlzLnNlbGVjdGVkS2V5cyAmJiB0aGlzLmFsbE5vZGVzV2l0b3V0SGllcmFjaHkubGVuZ3RoID4gMCAmJiB0aGlzLnNlbGVjdGVkS2V5cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmFsbE5vZGVzV2l0b3V0SGllcmFjaHkuZmlsdGVyKHggPT4gdGhpcy5zZWxlY3RlZEtleXMuaW5jbHVkZXMoeFt0aGlzLmRhdGEuU2VsZWN0T3B0aW9uc10pKTtcclxuICAgIH1cclxuICAgIHJldHVybiBbXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRTZWxlY3RlZFZhbHVlcyhkYXRhOiBhbnkpIHtcclxuICAgIGlmIChkYXRhKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRLZXlzID0gQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV07XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEtleXMgPSBbXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFNldFNlbGVjdGVkVmFsdWVzKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5TZWxlY3RlZFZhbHVlcykge1xyXG4gICAgICBjb25zdCBzZWxlY3RlZE5vZGVzID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIHRoaXMuZGF0YS5TZWxlY3RlZFZhbHVlcyk7XHJcbiAgICAgIHRoaXMuc2V0U2VsZWN0ZWRWYWx1ZXMoc2VsZWN0ZWROb2Rlcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL3B1YmxpYyBzZXRSb3dIZWlnaHREb3VibGUodmFsdWU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgLy8gIGNvbnNvbGUud2FybignRGVwcmVjYXRlZCAtIG5vIGxvbmRlciBuZWVkIHRvIHNldCB0aGUgaGVpZ2h0Jyk7XHJcbiAgLy8gIC8vIHRoaXMuZGF0YS5kb3VibGVIZWlnaHQgPSB2YWx1ZTtcclxuICAvL31cclxuXHJcbiAgLy8jcmVnaW9uIEV4cGFuZCAmIENvbGxhcHNlXHJcbiAgcHVibGljIGlzRXhwYW5kZWQgPSAoZGF0YUl0ZW06IGFueSwgaW5kZXg6IHN0cmluZykgPT4ge1xyXG4gICAgLy8gY29uc29sZS5sb2coaW5kZXgpO1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuZXhwYW5kZWRrZXlzLmluZGV4T2YoaW5kZXgpID4gLTE7XHJcbiAgICAvLyByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBleHBhbmROb2RlID0gKGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIHNldEFzU2VsZWN0ZWQ6IGJvb2xlYW4pID0+IHtcclxuICAgIHRoaXMuaXRlbUluZGV4ID0gW107XHJcbiAgICB0aGlzLmdldEl0ZW1zKCk7XHJcblxyXG4gICAgdGhpcy5zZWFyY2hOb2RlSW5kZXgodGhpcy5ub2RlcywgdmFsdWUsICcnLCBmaWVsZCk7XHJcblxyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLml0ZW1JbmRleDtcclxuICAgIGlmIChzZXRBc1NlbGVjdGVkKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRLZXlzID0gaW5kZXg7XHJcbiAgICB9XHJcbiAgICBjb25zdCBpbmRleEFyciA9IFtdO1xyXG4gICAgaW5kZXguZm9yRWFjaCgoaTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGFyciA9IGkuc3BsaXQoJ18nKTtcclxuICAgICAgbGV0IGluZGV4cyA9IFwiXCI7XHJcbiAgICAgIGFyci5mb3JFYWNoKCh4OiBhbnkpID0+IHtcclxuICAgICAgICBpbmRleHMgPSBpbmRleHMuY29uY2F0KFwiX1wiKS5jb25jYXQoeCk7XHJcbiAgICAgICAgaW5kZXhBcnIucHVzaChpbmRleHMuc3Vic3RyaW5nKDEpKTtcclxuICAgICAgfSlcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zdGF0ZS5leHBhbmRlZGtleXMgPSB0aGlzLnN0YXRlLmV4cGFuZGVka2V5cy5jb25jYXQoaW5kZXhBcnIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvbGxhcHNlTm9kZSA9IChmaWVsZDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBjb2xsYXBzZVBhcmVudDogYm9vbGVhbikgPT4ge1xyXG4gICAgdGhpcy5pdGVtSW5kZXggPSBbXTtcclxuICAgIHRoaXMuZ2V0SXRlbXMoKTtcclxuXHJcbiAgICB0aGlzLnNlYXJjaE5vZGVJbmRleCh0aGlzLm5vZGVzLCB2YWx1ZSwgJycsIGZpZWxkKTtcclxuXHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuaXRlbUluZGV4O1xyXG4gICAgbGV0IGluZGV4QXJyID0gW107XHJcbiAgICBpZiAoY29sbGFwc2VQYXJlbnQpIHtcclxuICAgICAgaW5kZXguZm9yRWFjaCgoaTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgYXJyID0gaS5zcGxpdCgnXycpO1xyXG4gICAgICAgIGxldCBpbmRleHMgPSBcIlwiO1xyXG4gICAgICAgIGFyci5mb3JFYWNoKCh4OiBhbnkpID0+IHtcclxuICAgICAgICAgIGluZGV4cyA9IGluZGV4cy5jb25jYXQoXCJfXCIpLmNvbmNhdCh4KTtcclxuICAgICAgICAgIGluZGV4QXJyLnB1c2goaW5kZXhzLnN1YnN0cmluZygxKSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpbmRleEFyciA9IGluZGV4O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3RhdGUuZXhwYW5kZWRrZXlzID0gdGhpcy5zdGF0ZS5leHBhbmRlZGtleXMuZmlsdGVyKHYgPT4ge1xyXG4gICAgICByZXR1cm4gIWluZGV4QXJyLmluY2x1ZGVzKHYpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VhcmNoTm9kZUluZGV4KG5vZGU6IGFueSwgdmFsdWU6IHN0cmluZywga2V5OiBzdHJpbmcsIGZpZWxkOiBzdHJpbmcpIHtcclxuICAgIGlmIChrZXkpIHtcclxuICAgICAga2V5ID0ga2V5ICsgJ18nO1xyXG4gICAgfVxyXG4gICAgbm9kZS5mb3JFYWNoKChkOiBhbnksIGk6IG51bWJlcikgPT4ge1xyXG4gICAgICBpZiAoZFtmaWVsZF0gPT09IE51bWJlcih2YWx1ZSkgfHwgZFtmaWVsZF0gPT09IHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5pdGVtSW5kZXggPSB0aGlzLml0ZW1JbmRleC5jb25jYXQoa2V5ICsgJycgKyBpKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkLlZhbHVlKSkge1xyXG4gICAgICAgIGNvbnN0IGsgPSBrZXkgKyAnJyArIGk7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hOb2RlSW5kZXgoZC5WYWx1ZSwgdmFsdWUsIGssIGZpZWxkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZXhwYW5kQWxsID0gKCkgPT4ge1xyXG4gICAgdGhpcy5nZXRJdGVtcygpO1xyXG4gICAgaWYgKHRoaXMubm9kZXMpIHtcclxuICAgICAgdGhpcy5leHBhbmRBbGxOb2RlKHRoaXMubm9kZXMsICcnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb2xsYXBzZUFsbCA9ICgpID0+IHtcclxuICAgIHRoaXMuc3RhdGUuZXhwYW5kZWRrZXlzID0gW107XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV4cGFuZEFsbE5vZGUobm9kZTogYW55LCBrZXk6IHN0cmluZykge1xyXG4gICAgaWYgKGtleSkge1xyXG4gICAgICBrZXkgPSBrZXkgKyAnXyc7XHJcbiAgICB9XHJcbiAgICBub2RlLmZvckVhY2goKGQ6IGFueSwgaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGQuVmFsdWUpKSB7XHJcbiAgICAgICAgY29uc3QgayA9IGtleSArICcnICsgaTtcclxuICAgICAgICB0aGlzLnN0YXRlLmV4cGFuZGVka2V5cyA9IHRoaXMuc3RhdGUuZXhwYW5kZWRrZXlzLmNvbmNhdChrKTtcclxuICAgICAgICB0aGlzLmV4cGFuZEFsbE5vZGUoZC5WYWx1ZSwgayk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZUNvbGxhcHNlKG5vZGUpIHtcclxuICAgIHRoaXMuc3RhdGUuZXhwYW5kZWRrZXlzID0gdGhpcy5zdGF0ZS5leHBhbmRlZGtleXMuZmlsdGVyKGsgPT4gayAhPT0gbm9kZS5pbmRleCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlRXhwYW5kKG5vZGUpIHtcclxuICAgIHRoaXMuc3RhdGUuZXhwYW5kZWRrZXlzID0gdGhpcy5zdGF0ZS5leHBhbmRlZGtleXMuY29uY2F0KG5vZGUuaW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldERlZmF1bHRFeHBhbmRhYmxlKCkge1xyXG4gICAgY29uc3QgZXhwYW5kZWREYXRhSWRzID0gdGhpcy5kYXRhLlRyZWVMaXN0SW5pdGlhbGx5RXhwYW5kZWREYXRhSWRzO1xyXG5cclxuICAgIGlmIChleHBhbmRlZERhdGFJZHMpIHtcclxuICAgICAgY29uc3QgaWRMaXN0ID0gdHlwZW9mIGV4cGFuZGVkRGF0YUlkcyA9PT0gJ3N0cmluZydcclxuICAgICAgICA/IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShleHBhbmRlZERhdGFJZHMsIHRoaXMuZ3JvdXApXHJcbiAgICAgICAgOiBleHBhbmRlZERhdGFJZHM7XHJcblxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShpZExpc3QpKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZS5leHBhbmRlZGtleXMgPSBpZExpc3Q7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBOb2RlIEhhbmRsaW5nXHJcbiAgb25FZGl0Tm9kZShldmVudDogYW55KSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLk9uRWRpdE5vZGUpIHtcclxuICAgICAgY29uc3QgZnVuYyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCB0aGlzLmRhdGEuT25FZGl0Tm9kZSk7XHJcbiAgICAgIGlmICh0eXBlb2YgZnVuYyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIGNvbnN0IGNhbGxGdW5jID0gZnVuYy5iaW5kKHRoaXMuZ3JvdXAuY3RybFNjb3BlKTtcclxuICAgICAgICBjYWxsRnVuYyhldmVudCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25BZGROb2RlKGV2ZW50OiBhbnksIGRhdGFJdGVtOiBhbnksIGRhdGE6IFpGaWVsZCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgdGhpcy5jbGlja0FjdE5hbWUgPSAnQWRkTm9kZSc7XHJcbiAgICAvLyBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIC8vIGlmICh0aGlzLmRhdGEuT25BZGROb2RlKSB7XHJcbiAgICAvLyAgIGNvbnN0IGZ1bmMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgdGhpcy5kYXRhLk9uQWRkTm9kZSk7XHJcbiAgICAvLyAgIGlmICh0eXBlb2YgZnVuYyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgLy8gICAgIGNvbnN0IGNhbGxGdW5jID0gZnVuYy5iaW5kKHRoaXMuZ3JvdXAuY3RybFNjb3BlKTtcclxuICAgIC8vICAgICBjYWxsRnVuYyhkYXRhSXRlbSwgZGF0YSwgZ3JvdXAsIGV2ZW50LmluZGV4KTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gICByZXR1cm47XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICBvblJlbW92ZU5vZGUoZXZlbnQ6IGFueSwgZGF0YUl0ZW06IGFueSwgZGF0YTogWkZpZWxkLCBncm91cDogWkdyb3VwKSB7XHJcbiAgICB0aGlzLmNsaWNrQWN0TmFtZSA9ICdSZW1vdmVOb2RlJztcclxuICB9XHJcblxyXG4gIGhhbmRsZU5vZGVEcm9wKGV2ZW50OiBUcmVlSXRlbURyb3BFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5EcmFnZ2FibGUgPT09IGZhbHNlKSB7XHJcbiAgICAgIGV2ZW50LnNldFZhbGlkKGZhbHNlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNOb2RlRHJvcCA9IHRydWU7XHJcbiAgICBjb25zdCBkcm9wSGFuZGxlciA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbChcclxuICAgICAgdGhpcyxcclxuICAgICAgdGhpcy5kYXRhLk9uRHJvcFxyXG4gICAgKTtcclxuICAgIGlmICh0eXBlb2YgZHJvcEhhbmRsZXIgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICBjb25zdCBjYWxsRnVuYyA9IGRyb3BIYW5kbGVyLmJpbmQodGhpcyk7XHJcbiAgICAgIGNhbGxGdW5jKGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwcmV2ZW50IGRyb3AgaWYgYXR0ZW1wdGluZyB0byBhZGQgdG8gZmlsZVxyXG4gICAgLy8gaWYgKGlzRmlsZShldmVudC5kZXN0aW5hdGlvbkl0ZW0uaXRlbS5kYXRhSXRlbS50ZXh0KSAmJiBldmVudC5kcm9wUG9zaXRpb24gPT09IERyb3BQb3NpdGlvbi5PdmVyKSB7XHJcbiAgICAvLyAgICAgZXZlbnQuc2V0VmFsaWQoZmFsc2UpO1xyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlTm9kZURyYWdFbmQoZXZlbnQ6IFRyZWVJdGVtRHJhZ0V2ZW50KSB7XHJcbiAgICBpZiAoIXRoaXMuaXNOb2RlRHJvcCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzTm9kZURyb3AgPSBmYWxzZTtcclxuICAgIHRoaXMuZ2V0SXRlbXMoKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKCdJdGVtczogJywgdGhpcy5pdGVtcyk7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBbXTtcclxuICAgIHRoaXMudXBkYXRlQ2hhbmdlVG9EYXRhU2V0KHRoaXMubm9kZXMsIHRhcmdldCk7XHJcbiAgICAvLyB0aGlzLmRhdGFTZXQgPSB0YXJnZXQ7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnNldE1vZGVsVmFsdWUodGhpcy5kYXRhLlZhbHVlLCB0YXJnZXQsIHRoaXMuZ3JvdXApO1xyXG4gICAgdGhpcy5ncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICB0eXBlOiBcInp0cmVlLW9uVHJlZU5vZGVEcmFnRW5kXCIsXHJcbiAgICAgIHRhcmdldDogdGhpcy5kYXRhLk9uQ2hhbmdlLFxyXG4gICAgICBkYXRhOiB0YXJnZXRcclxuICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQ2hhbmdlVG9EYXRhU2V0KHNvdXJjZTogQXJyYXk8YW55PiwgdGFyZ2V0OiBBcnJheTxhbnk+KSB7XHJcbiAgICBzb3VyY2UuZm9yRWFjaChkID0+IHtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZC5WYWx1ZSkpIHtcclxuICAgICAgICBjb25zdCB0ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkKSk7XHJcbiAgICAgICAgdC5WYWx1ZSA9IFtdO1xyXG4gICAgICAgIHRhcmdldC5wdXNoKHQpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ2hhbmdlVG9EYXRhU2V0KGQuVmFsdWUsIHQuVmFsdWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHQgPSBPYmplY3QuYXNzaWduKHt9LCBkKTtcclxuICAgICAgICB0LlZhbHVlID0gdC5fRGF0YVZhbHVlO1xyXG4gICAgICAgIGRlbGV0ZSB0Ll9EYXRhVmFsdWU7XHJcbiAgICAgICAgdGFyZ2V0LnB1c2godCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhpZGVBZGROb2RlKGlzSGlkZGVuID0gdHJ1ZSkge1xyXG4gICAgdGhpcy5kYXRhLmlzSGlkZUFsbEFkZE5vZGUgPSBpc0hpZGRlbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoaWRlUmVtb3ZlTm9kZShpc0hpZGRlbiA9IHRydWUpIHtcclxuICAgIHRoaXMuZGF0YS5pc0hpZGVBbGxSZW1vdmVOb2RlID0gaXNIaWRkZW47XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gU2VhcmNoIGZlYXR1cmUgLSBmaWx0ZXJhYmxlOiB0cnVlXHJcbiAgcHVibGljIGNsZWFyRmlsdGVyKCkge1xyXG4gICAgdGhpcy5pdGVtcyA9IFtdO1xyXG4gICAgdGhpcy5vcmlnaW5hbEl0ZW1zID0gW107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlRmlsdGVyKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLml0ZW1zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLml0ZW1zID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIHRoaXMuZGF0YS5WYWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaXRlbXMubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgIGlmICh0aGlzLm9yaWdpbmFsSXRlbXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgdGhpcy5vcmlnaW5hbEl0ZW1zID0gWkNvbXBvbmVudEhlbHBlci5kZWVwQ2xvbmUodGhpcy5pdGVtcyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMuaXRlbXMgPSBaQ29tcG9uZW50SGVscGVyLmRlZXBDbG9uZSh0aGlzLm9yaWdpbmFsSXRlbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGdyaWRWYWx1ZSA9IHRoaXMuZmlsdGVyUHJlZml4KHRoaXMuZGF0YS5WYWx1ZSk7XHJcbiAgICB0aGlzLmdyb3VwW2dyaWRWYWx1ZV0gPSB0aGlzLnNlYXJjaCh0aGlzLml0ZW1zLCB2YWx1ZSk7XHJcblxyXG4gICAgaWYgKFpDb21wb25lbnRIZWxwZXIuaXNOdWxsVW5kZWZpbmVkRW1wdHkodmFsdWUpKSB7XHJcbiAgICAgIHRoaXMuY2xlYXJGaWx0ZXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmlsdGVyUHJlZml4KHZhbHVlTmFtZTogYW55KSB7XHJcbiAgICBpZiAodmFsdWVOYW1lLnN0YXJ0c1dpdGgoJ3pEYXRhLicpKSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZU5hbWUuc2xpY2UoNik7XHJcbiAgICB9XHJcbiAgICBpZiAodmFsdWVOYW1lLnN0YXJ0c1dpdGgoJ2dyb3VwLnpEYXRhLicpKSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZU5hbWUuc2xpY2UoMTIpO1xyXG4gICAgfVxyXG4gICAgaWYgKHZhbHVlTmFtZS5zdGFydHNXaXRoKCdncm91cC4nKSkge1xyXG4gICAgICByZXR1cm4gdmFsdWVOYW1lLnNsaWNlKDYpO1xyXG4gICAgfVxyXG4gICAgaWYgKHZhbHVlTmFtZSkge1xyXG4gICAgICByZXR1cm4gdmFsdWVOYW1lO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZWFyY2goaXRlbXM6IGFueVtdLCB0ZXJtOiBzdHJpbmcpOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gaXRlbXMucmVkdWNlKChhY2MsIGl0ZW0pID0+IHtcclxuICAgICAgaWYgKHRoaXMuY29udGFpbnMoaXRlbS5OYW1lLCB0ZXJtKSkge1xyXG4gICAgICAgIGFjYy5wdXNoKGl0ZW0pO1xyXG4gICAgICB9IGVsc2UgaWYgKGl0ZW0uVmFsdWUgJiYgaXRlbS5WYWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3QgbmV3SXRlbXMgPSB0aGlzLnNlYXJjaChpdGVtLlZhbHVlLCB0ZXJtKTtcclxuXHJcbiAgICAgICAgaWYgKG5ld0l0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHZhciBmaWx0ZXJJdGVtID0gaXRlbTtcclxuICAgICAgICAgIGZpbHRlckl0ZW0uVmFsdWUgPSBuZXdJdGVtcztcclxuICAgICAgICAgIGFjYy5wdXNoKGZpbHRlckl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gYWNjO1xyXG4gICAgfSwgW10pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb250YWlucyh0ZXh0OiBzdHJpbmcsIHRlcm06IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRleHQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCh0ZXJtIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCkpID49IDA7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gQ2hlY2tib3hcclxuICBwcml2YXRlIGluaXROb2RlQ2hlY2tib3goKSB7XHJcbiAgICBpZiAoISF0aGlzLmRhdGEuVHJlZVZpZXdDaGVja2JveENvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgY29uc3QgY2hlY2tib3hDb25maWd1cmF0aW9uID0gdGhpcy5nZXRDaGVja2JveENvbmZpZ3VyYXRpb24oKTtcclxuXHJcbiAgICAgIGlmIChjaGVja2JveENvbmZpZ3VyYXRpb24uU2VsZWN0ZWRWYWx1ZXMpIHtcclxuICAgICAgICBjb25zdCBjaGVja2VkTm9kZXMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgY2hlY2tib3hDb25maWd1cmF0aW9uLlNlbGVjdGVkVmFsdWVzKTtcclxuICAgICAgICB0aGlzLnNldENoZWNrZWRWYWx1ZXMoY2hlY2tlZE5vZGVzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNoZWNrYm94Q29uZmlndXJhdGlvbi5EaXNhYmxlZFZhbHVlcykge1xyXG4gICAgICAgIGNvbnN0IGRpc2FibGVkTm9kZXMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgY2hlY2tib3hDb25maWd1cmF0aW9uLkRpc2FibGVkVmFsdWVzKTtcclxuICAgICAgICB0aGlzLnNldERpc2FibGVkQ2hlY2tCb3goZGlzYWJsZWROb2Rlcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q2hlY2tib3hDb25maWd1cmF0aW9uKCk6IFRyZWVWaWV3Q2hlY2tib3hDb25maWd1cmF0aW9uIHtcclxuICAgIGxldCBjaGVja2JveENvbmZpZ3VyYXRpb246IFRyZWVWaWV3Q2hlY2tib3hDb25maWd1cmF0aW9uO1xyXG5cclxuICAgIGlmICh0eXBlb2YgdGhpcy5kYXRhLlRyZWVWaWV3Q2hlY2tib3hDb25maWd1cmF0aW9uID09PSAnc3RyaW5nJykge1xyXG4gICAgICAvLyBJZiBDaGVja2JveENvbmZpZ3VyYXRpb24gaXMgYSBzdHJpbmcsIHJldHJpZXZlIHRoZSBjb25maWd1cmF0aW9uIGZyb20gZ3JvdXBcclxuICAgICAgY2hlY2tib3hDb25maWd1cmF0aW9uID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHRoaXMuZGF0YS5UcmVlVmlld0NoZWNrYm94Q29uZmlndXJhdGlvbiwgdGhpcy5ncm91cCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gSWYgQ2hlY2tib3hDb25maWd1cmF0aW9uIGlzIGFuIG9iamVjdCwgdXNlIGl0IGRpcmVjdGx5XHJcbiAgICAgIGNoZWNrYm94Q29uZmlndXJhdGlvbiA9IHRoaXMuZGF0YS5UcmVlVmlld0NoZWNrYm94Q29uZmlndXJhdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2hlY2tib3hDb25maWd1cmF0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRWYWx1ZXMoZGF0YTogYW55LCB0YXJnZXRWYXJpYWJsZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IGFueVtdID0gW10pIHtcclxuICAgIHRoaXNbdGFyZ2V0VmFyaWFibGVdID0gZGF0YSA/IChBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXSkgOiBkZWZhdWx0VmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Q2hlY2tlZFZhbHVlcyhkYXRhOiBhbnkpIHtcclxuICAgIHRoaXMuc2V0VmFsdWVzKGRhdGEsICdjaGVja2VkS2V5cycpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldERpc2FibGVkQ2hlY2tCb3goZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLnNldFZhbHVlcyhkYXRhLCAnZGlzYWJsZWRDaGVja0JveEtleXMnKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY2hlY2thYmxlU2V0dGluZ3MoKTogQ2hlY2thYmxlU2V0dGluZ3Mge1xyXG4gICAgaWYgKCEhdGhpcy5kYXRhLlRyZWVWaWV3Q2hlY2tib3hDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgIGNvbnN0IGNoZWNrYm94Q29uZmlndXJhdGlvbiA9IHRoaXMuZ2V0Q2hlY2tib3hDb25maWd1cmF0aW9uKCk7XHJcbiAgICAgIGNvbnN0IGNoZWNrYWJsZVNldHRpbmdzID0ge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgY2hlY2tQYXJlbnRzOiAhY2hlY2tib3hDb25maWd1cmF0aW9uLkRpc2FibGVQYXJlbnRBdXRvU2VsZWN0T25BbGxDaGlsZHJlbixcclxuICAgICAgICBjaGVja0NoaWxkcmVuOiAhY2hlY2tib3hDb25maWd1cmF0aW9uLkRpc2FibGVQYXJlbnRTZWxlY3RzQWxsQ2hpbGRyZW4sXHJcbiAgICAgICAgY2hlY2tEaXNhYmxlZENoaWxkcmVuOiBjaGVja2JveENvbmZpZ3VyYXRpb24uRW5hYmxlRGlzYWJsZWRDaGlsZHJlblNlbGVjdGlvbixcclxuICAgICAgICBtb2RlOiBjaGVja2JveENvbmZpZ3VyYXRpb24uU2VsZWN0TXVsdGlwbGUgPyAnbXVsdGlwbGUnIDogJ3NpbmdsZScsXHJcbiAgICAgICAgY2hlY2tPbkNsaWNrOiBjaGVja2JveENvbmZpZ3VyYXRpb24uVG9nZ2xlQ2hlY2tib3hPbk5vZGVDbGljayxcclxuICAgICAgfSBhcyBDaGVja2FibGVTZXR0aW5ncztcclxuXHJcbiAgICAgIHJldHVybiBjaGVja2FibGVTZXR0aW5ncztcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNoZWNrZWRDaGFuZ2UoZXZlbnQ6IGFueSkge1xyXG4gICAgaWYgKCEhdGhpcy5kYXRhLlRyZWVWaWV3Q2hlY2tib3hDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgIGNvbnN0IGNoZWNrYm94Q29uZmlndXJhdGlvbiA9IHRoaXMuZ2V0Q2hlY2tib3hDb25maWd1cmF0aW9uKCk7XHJcblxyXG4gICAgICBjb25zdCB0YXJnZXROYW1lID0gY2hlY2tib3hDb25maWd1cmF0aW9uLk9uQ2hhbmdlO1xyXG4gICAgICBjb25zdCBpc0NoZWNrZWQgPSB0aGlzLmNoZWNrZWRLZXlzLmluZGV4T2YoZXZlbnQuaXRlbS5kYXRhSXRlbS5JZCkgPiAtMTtcclxuXHJcbiAgICAgIHRoaXMuZ3JvdXAuc3ViamVjdC5uZXh0KHtcclxuICAgICAgICB0eXBlOiBcInp0cmVlX09uQ2hlY2tib3hDaGFuZ2VcIixcclxuICAgICAgICB0YXJnZXQ6IHRhcmdldE5hbWUsXHJcbiAgICAgICAgZXZlbnQsXHJcbiAgICAgICAgZGF0YTogeyBjaGVja2VkVmFsdWU6IGlzQ2hlY2tlZCwgc2VsZWN0ZWRJdGVtOiBldmVudC5pdGVtLmRhdGFJdGVtLCBmaWVsZDogdGhpcy5kYXRhLCBjb21wOiB0aGlzIH1cclxuICAgICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENoZWNrZWRWYWx1ZXMoKTogQXJyYXk8YW55PiB7XHJcbiAgICBpZiAodGhpcy5hbGxOb2Rlc1dpdG91dEhpZXJhY2h5ICYmIHRoaXMuY2hlY2tlZEtleXMgJiYgdGhpcy5hbGxOb2Rlc1dpdG91dEhpZXJhY2h5Lmxlbmd0aCA+IDAgJiYgdGhpcy5jaGVja2VkS2V5cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdE9wdGlvbnNLZXkgPSB0aGlzLmRhdGEuU2VsZWN0T3B0aW9ucztcclxuICAgICAgcmV0dXJuIHRoaXMuYWxsTm9kZXNXaXRvdXRIaWVyYWNoeS5maWx0ZXIobm9kZSA9PiB0aGlzLmNoZWNrZWRLZXlzLmluY2x1ZGVzKG5vZGVbc2VsZWN0T3B0aW9uc0tleV0pKTtcclxuICAgIH1cclxuICAgIHJldHVybiBbXTtcclxuICB9XHJcblxyXG4gIC8vIEN1c3RvbSBsb2dpYyBoYW5kbGluZyBJbmRldGVybWluYXRlIHN0YXRlIHdoZW4gY3VzdG9tIGRhdGEgaXRlbSBwcm9wZXJ0eSBpcyBwZXJzaXN0ZWRcclxuICBwdWJsaWMgaXNDaGVja2VkID0gKGRhdGFJdGVtOiBhbnksIGluZGV4OiBzdHJpbmcpOiBDaGVja2VkU3RhdGUgPT4ge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5UcmVlVmlld0NoZWNrYm94Q29uZmlndXJhdGlvbikge1xyXG4gICAgICBpZiAodGhpcy5jb250YWluc0l0ZW0oZGF0YUl0ZW0pKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiY2hlY2tlZFwiO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5pc0luZGV0ZXJtaW5hdGUoZGF0YUl0ZW0uVmFsdWUpKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiaW5kZXRlcm1pbmF0ZVwiO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gXCJub25lXCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnRhaW5zSXRlbShpdGVtOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNoZWNrZWRLZXlzLmluZGV4T2YoaXRlbVt0aGlzLmRhdGEuU2VsZWN0T3B0aW9uc10pID4gLTE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzSW5kZXRlcm1pbmF0ZShpdGVtczogYW55W10gPSBbXSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlkeCA9IDA7XHJcbiAgICBsZXQgaXRlbTtcclxuXHJcbiAgICB3aGlsZSAoKGl0ZW0gPSBpdGVtc1tpZHhdKSkge1xyXG4gICAgICBpZiAodGhpcy5pc0luZGV0ZXJtaW5hdGUoaXRlbS5WYWx1ZSkgfHwgdGhpcy5jb250YWluc0l0ZW0oaXRlbSkpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWR4ICs9IDE7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxufVxyXG4iLCI8ZGl2IHN0eWxlPVwid2lkdGg6MTAwJVwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlXCIgY2xhc3M9XCJlMXRhZy1zdHlsZVwiXHJcbiAgICAgKm5nSWY9XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGVGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZSlcIj5cclxuICA8a2VuZG8tdHJlZXZpZXcgW25vZGVzXT1cImdldEl0ZW1zKClcIlxyXG4gICAgICAgICAgICAgICAgICBrZW5kb1RyZWVWaWV3RXhwYW5kYWJsZVxyXG4gICAgICAgICAgICAgICAgICBba2VuZG9UcmVlVmlld1NlbGVjdGFibGVdPVwic2VsZWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAga2VuZG9UcmVlVmlld0RyYWdBbmREcm9wXHJcbiAgICAgICAgICAgICAgICAgIGtlbmRvVHJlZVZpZXdEcmFnQW5kRHJvcEVkaXRpbmdcclxuICAgICAgICAgICAgICAgICAgW2lzRXhwYW5kZWRdPVwiaXNFeHBhbmRlZFwiXHJcbiAgICAgICAgICAgICAgICAgIChjb2xsYXBzZSk9XCJoYW5kbGVDb2xsYXBzZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKGV4cGFuZCk9XCJoYW5kbGVFeHBhbmQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIChub2RlRHJvcCk9XCJoYW5kbGVOb2RlRHJvcCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKG5vZGVEcmFnRW5kKT1cImhhbmRsZU5vZGVEcmFnRW5kKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICBbKHNlbGVjdGVkS2V5cyldPVwic2VsZWN0ZWRLZXlzXCJcclxuICAgICAgICAgICAgICAgICAga2VuZG9UcmVlVmlld0hpZXJhcmNoeUJpbmRpbmdcclxuICAgICAgICAgICAgICAgICAgY2hpbGRyZW5GaWVsZD1cIlZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgdGV4dEZpZWxkPVwiTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzZWxlY3RCeV09XCJkYXRhLlNlbGVjdE9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICBbZmlsdGVyYWJsZV09XCJkYXRhLkZpbHRlcmFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAoZmlsdGVyQ2hhbmdlKT1cImhhbmRsZUZpbHRlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlMXRhZy1zdHlsZTFcIlxyXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJkYXRhLkNsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgW2tlbmRvVHJlZVZpZXdDaGVja2FibGVdPVwiY2hlY2thYmxlU2V0dGluZ3NcIlxyXG4gICAgICAgICAgICAgICAgICBbY2hlY2tCeV09XCJkYXRhLlNlbGVjdE9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICBbKGNoZWNrZWRLZXlzKV09XCJjaGVja2VkS2V5c1wiXHJcbiAgICAgICAgICAgICAgICAgIChjaGVja2VkQ2hhbmdlKT1cIm9uQ2hlY2tlZENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgW2tlbmRvVHJlZVZpZXdEaXNhYmxlXT1cImRhdGEuU2VsZWN0T3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgIFtpc0NoZWNrZWRdPVwiaXNDaGVja2VkXCJcclxuICAgICAgICAgICAgICAgICAgWyhkaXNhYmxlZEtleXMpXT1cImRpc2FibGVkQ2hlY2tCb3hLZXlzXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVQYXJlbnROb2Rlc09ubHldPVwiZGF0YS5EaXNhYmxlUGFyZW50Tm9kZXNPbmx5XCJcclxuICAgICAgICAgICAgICAgICAgW2V4cGFuZERpc2FibGVkTm9kZXNdPVwiZGF0YS5FeHBhbmREaXNhYmxlZE5vZGVzXCJcclxuICAgICAgICAgICAgICAgICAgKG5vZGVDbGljayk9XCJvbk5vZGVDbGljaygkZXZlbnQpXCI+XHJcbiAgICA8bmctdGVtcGxhdGUga2VuZG9UcmVlVmlld05vZGVUZW1wbGF0ZSBsZXQtZGF0YUl0ZW0gI25vZGV0ZW1wbGF0ZT5cclxuICAgICAgPGRpdiBjbGFzcz1cInRyZWUtY29udGVudC1jb250YWluZXJcIj5cclxuICAgICAgICA8aW9uLWJ1dHRvbiAqbmdJZj1cIiEhZGF0YS5PbkFkZE5vZGUgJiYgIWRhdGEuaXNIaWRlQWxsQWRkTm9kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWRkTm9kZSgkZXZlbnQsIGRhdGFJdGVtLCBkYXRhLCBncm91cClcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiem9vbTogMC42OyBtYXJnaW46IDAgMCAwIDJweDtcIlxyXG4gICAgICAgICAgICAgICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICBzaXplPVwibWVkaXVtXCJcclxuICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiEhZGF0YUl0ZW0uT25BZGROb2RlVmlzaWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUyXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImUxdGFnLXN0eWxlMlwiPlxyXG4gICAgICAgICAgPGZhLWljb24gW2ljb25dPVwiJ3BsdXMnXCI+PC9mYS1pY29uPlxyXG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cclxuICAgICAgICA8aW9uLWJ1dHRvbiAqbmdJZj1cIiEhZGF0YS5PblJlbW92ZU5vZGUgJiYgIWRhdGEuaXNIaWRlQWxsUmVtb3ZlTm9kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUmVtb3ZlTm9kZSgkZXZlbnQsIGRhdGFJdGVtLCBkYXRhLCBncm91cClcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiem9vbTogMC42OyBtYXJnaW46IDAgMCAwIDEwcHg7XCJcclxuICAgICAgICAgICAgICAgICAgICBjb2xvcj1cImRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cclxuICAgICAgICAgICAgICAgICAgICBzaXplPVwibWVkaXVtXCJcclxuICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiEhZGF0YUl0ZW0uT25SZW1vdmVOb2RlVmlzaWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUzXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImUxdGFnLXN0eWxlM1wiPlxyXG4gICAgICAgICAgPGZhLWljb24gW2ljb25dPVwiJ21pbnVzJ1wiPjwvZmEtaWNvbj5cclxuICAgICAgICA8L2lvbi1idXR0b24+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJidG4tc2VwZXJhdG9yIGUxdGFnLXN0eWxlN1wiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlN1wiPjwvc3Bhbj5cclxuICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgaWNvbiBvZiBkYXRhSXRlbS5JY29uTGlzdFwiPlxyXG4gICAgICAgICAgPGZhLWljb24gY2xhc3M9XCJlMXRhZy1zdHlsZTUgbGVmdC1pY29uXCIgW2ljb25dPVwiaWNvblwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlNVwiPjwvZmEtaWNvbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPGlvbi1sYWJlbCBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTRcIiBjbGFzcz1cImUxdGFnLXN0eWxlNFwiIFtuZ0NsYXNzXT1cImRhdGFJdGVtLmNsYXNzXCIgKm5nSWY9XCIhZGF0YUl0ZW0uel9pbnB1dFR5cGVcIj5cclxuICAgICAgICAgIDxkaXYgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU2XCIgY2xhc3M9XCJlMXRhZy1zdHlsZTZcIiBbaW5uZXJIVE1MXT1cImdldFRlbXBsYXRlKGRhdGFJdGVtLCBkYXRhLCBncm91cCkgfCBodG1sU2FuaXRpemVcIj48L2Rpdj5cclxuICAgICAgICA8L2lvbi1sYWJlbD5cclxuICAgICAgICA8ZGl2IFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlNFwiIGNsYXNzPVwiZTF0YWctc3R5bGU0XCIgW25nQ2xhc3NdPVwiZGF0YUl0ZW0uY2xhc3NcIiAqbmdJZj1cIiEhZGF0YUl0ZW0uel9pbnB1dFR5cGVcIj5cclxuICAgICAgICAgIDxrZW5kby10ZXh0Ym94XHJcbiAgICAgICAgICAgICAgICAgICN6aW5wdXRfdGV4dGJveFxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImRhdGFJdGVtLnpfaW5wdXRUeXBlID09ICd0ZXh0J1wiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZmllbGQgZTF0YWctc3R5bGU4XCJcclxuICAgICAgICAgICAgICAgICAgW2lkXT1cImRhdGEuTmFtZSArICdfJyArIGRhdGFJdGVtLnpfaW5wdXRUeXBlICsgJ18nICsgZGF0YUl0ZW0uSWRcIlxyXG4gICAgICAgICAgICAgICAgICBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZThcIlxyXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImRhdGFJdGVtLnpfaW5wdXRWYWx1ZVwiPlxyXG4gICAgICAgICAgPC9rZW5kby10ZXh0Ym94PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9rZW5kby10cmVldmlldz5cclxuICA8YXBwLWNvbnRleHQtbWVudSBbZGF0YV09XCJkYXRhXCIgW2dyb3VwXT1cImdyb3VwXCIgW2Zvcm1dPVwiZm9ybVwiICNkYXRhaXRlbWNvbnRleHRtZW51PjwvYXBwLWNvbnRleHQtbWVudT5cclxuPC9kaXY+XHJcbiJdfQ==
|