gamma-app-controller 1.1.4 → 1.1.6

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.
Files changed (21) hide show
  1. package/esm2020/lib/application-controller/application-content.service.mjs +32 -1
  2. package/esm2020/lib/application-controller/application-controller.module.mjs +37 -5
  3. package/esm2020/lib/application-controller/application-dataset-component/application-dataset/application-dataset.component.mjs +4 -4
  4. package/esm2020/lib/application-controller/application-metric-config/all-metrics-config/all-metrics-config.component.mjs +95 -0
  5. package/esm2020/lib/application-controller/application-metric-config/create-metrics/create-metrics.component.mjs +173 -0
  6. package/esm2020/lib/application-controller/application-metric-config/ofline-metrics/ofline-metrics.component.mjs +77 -0
  7. package/esm2020/lib/application-controller/application-metric-config/online-metrics/online-metrics.component.mjs +171 -0
  8. package/esm2020/lib/application-controller/application-view-components/create-comp-view/create-comp-view.component.mjs +4 -4
  9. package/esm2020/public-api.mjs +5 -1
  10. package/fesm2015/gamma-app-controller.mjs +635 -115
  11. package/fesm2015/gamma-app-controller.mjs.map +1 -1
  12. package/fesm2020/gamma-app-controller.mjs +641 -115
  13. package/fesm2020/gamma-app-controller.mjs.map +1 -1
  14. package/lib/application-controller/application-content.service.d.ts +4 -0
  15. package/lib/application-controller/application-controller.module.d.ts +15 -11
  16. package/lib/application-controller/application-metric-config/all-metrics-config/all-metrics-config.component.d.ts +41 -0
  17. package/lib/application-controller/application-metric-config/create-metrics/create-metrics.component.d.ts +136 -0
  18. package/lib/application-controller/application-metric-config/ofline-metrics/ofline-metrics.component.d.ts +42 -0
  19. package/lib/application-controller/application-metric-config/online-metrics/online-metrics.component.d.ts +49 -0
  20. package/package.json +1 -1
  21. package/public-api.d.ts +4 -0
@@ -0,0 +1,171 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../../common";
4
+ import * as i2 from "ngx-toastr";
5
+ import * as i3 from "../../application-content.service";
6
+ import * as i4 from "@angular/common";
7
+ import * as i5 from "devextreme-angular/ui/check-box";
8
+ import * as i6 from "devextreme-angular/ui/select-box";
9
+ import * as i7 from "devextreme-angular/ui/text-box";
10
+ import * as i8 from "@angular/forms";
11
+ export class OnlineMetricsComponent {
12
+ constructor(commonService, toastr, service) {
13
+ this.commonService = commonService;
14
+ this.toastr = toastr;
15
+ this.service = service;
16
+ this.reqFieldsDataSource = [];
17
+ this.isreqFields = false;
18
+ this.iscdrParams = false;
19
+ this.cdrFieldsDataSource = [];
20
+ this.kpi_function = ["sum", "count", "avg", "max", "min", "stddev", "count_distinct"];
21
+ this.kpi_operator = ["eq", "gte", "lte", "ne", "in", "notIn"];
22
+ this.kpi_enrichment_name = [];
23
+ this.reqShortDataSource = [];
24
+ this.filterMapingDatasource = [];
25
+ this.isModelVisible = false;
26
+ this.isSqlCopiedText = false;
27
+ this.isReconColume = false;
28
+ this.getMetRicOnlineDataSet = new EventEmitter();
29
+ this.reconColumeDatasource = [];
30
+ this.isQueryTypeSelect = false;
31
+ this.mesuresAndDimentionsColumns = [];
32
+ this.metricMainObject = {};
33
+ }
34
+ set onlineMetricData(value) {
35
+ this.metricMainObject = value;
36
+ value.source.dimensions.forEach(dimension => {
37
+ this.mesuresAndDimentionsColumns.push({
38
+ ...dimension,
39
+ measures: false
40
+ });
41
+ });
42
+ value.source.measures.forEach(measure => {
43
+ this.mesuresAndDimentionsColumns.push({
44
+ ...measure,
45
+ measures: true
46
+ });
47
+ });
48
+ }
49
+ ngOnInit() {
50
+ this.service.listColumnEnrichmentFunctions().subscribe(data => {
51
+ this.kpi_enrichment_name = data;
52
+ });
53
+ }
54
+ addColumns() {
55
+ let obj = {
56
+ "measures": true,
57
+ "fieldName": "",
58
+ "aliasName": "",
59
+ "dataType": "",
60
+ "format": "",
61
+ "method": "",
62
+ "type": ""
63
+ };
64
+ this.mesuresAndDimentionsColumns.push(obj);
65
+ }
66
+ deleteColumns(i) {
67
+ this.mesuresAndDimentionsColumns.splice(i, 1);
68
+ }
69
+ addFilterMapingColumns() {
70
+ let obj = {
71
+ "fieldName": "",
72
+ "operation": "",
73
+ "threshold": "",
74
+ "comparator": "",
75
+ };
76
+ this.metricMainObject.source.filters.push(obj);
77
+ }
78
+ deleteFilterMapingColumns(i) {
79
+ this.metricMainObject.source.filters.splice(i, 1);
80
+ }
81
+ addExclusionsMapingColumns() {
82
+ let obj = {
83
+ "fieldName": "",
84
+ "operation": "",
85
+ "threshold": "",
86
+ "comparator": "",
87
+ };
88
+ this.metricMainObject.source.exclusions.push(obj);
89
+ }
90
+ deleteExclusionsMapingColumns(i) {
91
+ this.metricMainObject.source.exclusions.splice(i, 1);
92
+ }
93
+ transformDataForMFilter(mapfilter) {
94
+ let result = [];
95
+ mapfilter.forEach(mapping => {
96
+ let resultObj = {
97
+ columnName: mapping.serverColumn,
98
+ dataType: mapping.dataType,
99
+ operator: mapping.operatorName,
100
+ value: mapping.defaultValue
101
+ };
102
+ result.push(resultObj);
103
+ });
104
+ return result;
105
+ }
106
+ createOnlineMetrics() {
107
+ this.metricMainObject.source.measures = [];
108
+ this.metricMainObject.source.dimensions = [];
109
+ this.mesuresAndDimentionsColumns.forEach(element => {
110
+ if (element.measures) {
111
+ let obj = {
112
+ fieldName: element.fieldName,
113
+ aliasName: element.aliasName,
114
+ dataType: element.dataType,
115
+ type: element.type,
116
+ };
117
+ this.metricMainObject.source.measures.push(obj);
118
+ }
119
+ else {
120
+ let obj = {
121
+ fieldName: element.fieldName,
122
+ aliasName: element.aliasName,
123
+ dataType: element.dataType,
124
+ type: element.type,
125
+ };
126
+ this.metricMainObject.source.dimensions.push(obj);
127
+ }
128
+ });
129
+ this.getMetRicOnlineDataSet.emit(this.metricMainObject);
130
+ }
131
+ getQueryForDetailsData(e) {
132
+ if (e.value == 'Basic') {
133
+ this.queryBulderDataset.api = '/kpi/genericDetailDataResponse';
134
+ this.queryBulderDataset.queryConfig.columns = [];
135
+ }
136
+ else {
137
+ this.queryBulderDataset.api = '/kpi/genericAggregatePaginatedKpiServiceResponse';
138
+ }
139
+ }
140
+ getDataConfig(e) {
141
+ if (e.event) {
142
+ this.selectedDataSource = e.value;
143
+ this.isQueryTypeSelect = true;
144
+ }
145
+ }
146
+ addHavingsColume() {
147
+ let obj = {
148
+ "columnName": "",
149
+ "advancedColumn": "",
150
+ "dataType": "",
151
+ "operator": "",
152
+ "value": ""
153
+ };
154
+ this.queryBulderDataset.queryConfig.havings.push(obj);
155
+ }
156
+ deleteHavingsColume(i) {
157
+ this.queryBulderDataset.queryConfig.havings.splice(i, 1);
158
+ }
159
+ }
160
+ OnlineMetricsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OnlineMetricsComponent, deps: [{ token: i1.CommonService }, { token: i2.ToastrService }, { token: i3.ApplicationContentService }], target: i0.ɵɵFactoryTarget.Component });
161
+ OnlineMetricsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: OnlineMetricsComponent, selector: "app-online-metrics", inputs: { onlineMetricData: "onlineMetricData" }, outputs: { getMetRicOnlineDataSet: "getMetRicOnlineDataSet" }, ngImport: i0, template: "<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Target\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Database Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.databaseName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> DB Config </div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"metricMainObject.target.dbConfig\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Table Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.tableName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Dimension Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.dimensionColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Measure Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.measureColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Write Disposition</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.writeDisposition\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2 mt-8\"></div>\n <dx-check-box text=\"Create Table\" [(ngModel)]=\"metricMainObject.target.createTable\"></dx-check-box>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Source\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Data Source Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.datasource\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Event Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.eventName\"></dx-text-box>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\">Measures and\n Dimensions\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\" *ngFor=\"let item of mesuresAndDimentionsColumns; let i = index;\">\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Measures</div>\n <dx-check-box [value]=\"item.measures\" [(ngModel)]=\"item.measures\"></dx-check-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Value Field(aliasName)</div>\n <dx-text-box [(ngModel)]=\"item.aliasName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Server Column Name</div>\n <dx-text-box [(ngModel)]=\"item.fieldName\"></dx-text-box>\n </div>\n \n \n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Datatype</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"item.dataType\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Type</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"kpi_function\" [(ngModel)]=\"item.type\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Format</div>\n <dx-text-box [(ngModel)]=\"item.format\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Method Name</div>\n <dx-text-box [(ngModel)]=\"item.method\"></dx-text-box>\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\" (click)=\"deleteColumns(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"addColumns()\">Add\n Columns</button>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Filter Maping\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex flex-row justify-between\"\n *ngFor=\"let item of metricMainObject.source.filters; let i = index;\">\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Field Name</div>\n <dx-text-box [(ngModel)]=\"item.fieldName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Operation</div>\n <dx-text-box [(ngModel)]=\"item.operation\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Threshold</div>\n <dx-text-box [(ngModel)]=\"item.threshold\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Comparator</div>\n <dx-select-box [(ngModel)]=\"item.comparator\" [items]=\"kpi_operator\"></dx-select-box>\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\" (click)=\"deleteFilterMapingColumns(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row\">\n <div class=\"w-full\">\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addFilterMapingColumns()\">Add\n Maping</button>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Exclusions\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex flex-row justify-between\"\n *ngFor=\"let item of metricMainObject.source.exclusions; let i = index;\">\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Field Name</div>\n <dx-text-box [(ngModel)]=\"item.fieldName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Operation</div>\n <dx-text-box [(ngModel)]=\"item.operation\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Threshold</div>\n <dx-text-box [(ngModel)]=\"item.threshold\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Comparator</div>\n <dx-select-box [(ngModel)]=\"item.comparator\" [items]=\"kpi_operator\"></dx-select-box>\n\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\"\n (click)=\"deleteExclusionsMapingColumns(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row\">\n <div class=\"w-full\">\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addExclusionsMapingColumns()\">Add\n Exclusions</button>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex w-full justify-end mt-5 border-t\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\" (click)=\"createOnlineMetrics()\">\n Save Online Metrics\n </button>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i5.DxCheckBoxComponent, selector: "dx-check-box", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "iconSize", "isValid", "name", "readOnly", "rtlEnabled", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconSizeChange", "isValidChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i6.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i7.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
162
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: OnlineMetricsComponent, decorators: [{
163
+ type: Component,
164
+ args: [{ selector: 'app-online-metrics', template: "<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Target\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Database Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.databaseName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> DB Config </div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"metricMainObject.target.dbConfig\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Table Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.tableName\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Dimension Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.dimensionColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Measure Columns</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.measureColumns\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2\"> Write Disposition</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.target.writeDisposition\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/3\">\n <div class=\"text-md mb-2 mt-8\"></div>\n <dx-check-box text=\"Create Table\" [(ngModel)]=\"metricMainObject.target.createTable\"></dx-check-box>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-3\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Source\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"flex flex-wrap p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Data Source Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.datasource\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Event Name</div>\n <dx-text-box [(ngModel)]=\"metricMainObject.source.eventName\"></dx-text-box>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\">Measures and\n Dimensions\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\" *ngFor=\"let item of mesuresAndDimentionsColumns; let i = index;\">\n <div class=\"px-1 mb-2\">\n <div class=\"text-md mb-2\"> Measures</div>\n <dx-check-box [value]=\"item.measures\" [(ngModel)]=\"item.measures\"></dx-check-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Value Field(aliasName)</div>\n <dx-text-box [(ngModel)]=\"item.aliasName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Server Column Name</div>\n <dx-text-box [(ngModel)]=\"item.fieldName\"></dx-text-box>\n </div>\n \n \n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Datatype</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"item.dataType\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Type</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"kpi_function\" [(ngModel)]=\"item.type\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Format</div>\n <dx-text-box [(ngModel)]=\"item.format\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Method Name</div>\n <dx-text-box [(ngModel)]=\"item.method\"></dx-text-box>\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\" (click)=\"deleteColumns(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"addColumns()\">Add\n Columns</button>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Filter Maping\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex flex-row justify-between\"\n *ngFor=\"let item of metricMainObject.source.filters; let i = index;\">\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Field Name</div>\n <dx-text-box [(ngModel)]=\"item.fieldName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Operation</div>\n <dx-text-box [(ngModel)]=\"item.operation\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Threshold</div>\n <dx-text-box [(ngModel)]=\"item.threshold\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Comparator</div>\n <dx-select-box [(ngModel)]=\"item.comparator\" [items]=\"kpi_operator\"></dx-select-box>\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\" (click)=\"deleteFilterMapingColumns(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row\">\n <div class=\"w-full\">\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addFilterMapingColumns()\">Add\n Maping</button>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-lg py-2 font-extrabold border-b bg-gray-700 text-white px-2\"> Exclusions\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex flex-row justify-between\"\n *ngFor=\"let item of metricMainObject.source.exclusions; let i = index;\">\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Field Name</div>\n <dx-text-box [(ngModel)]=\"item.fieldName\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Operation</div>\n <dx-text-box [(ngModel)]=\"item.operation\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Threshold</div>\n <dx-text-box [(ngModel)]=\"item.threshold\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Comparator</div>\n <dx-select-box [(ngModel)]=\"item.comparator\" [items]=\"kpi_operator\"></dx-select-box>\n\n </div>\n\n <div class=\"px-1 mt-7 text-center\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\"\n (click)=\"deleteExclusionsMapingColumns(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-row\">\n <div class=\"w-full\">\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addExclusionsMapingColumns()\">Add\n Exclusions</button>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"flex w-full justify-end mt-5 border-t\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\" (click)=\"createOnlineMetrics()\">\n Save Online Metrics\n </button>\n</div>" }]
165
+ }], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i2.ToastrService }, { type: i3.ApplicationContentService }]; }, propDecorators: { getMetRicOnlineDataSet: [{
166
+ type: Output
167
+ }], onlineMetricData: [{
168
+ type: Input,
169
+ args: ['onlineMetricData']
170
+ }] } });
171
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25saW5lLW1ldHJpY3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2FwcGxpY2F0aW9uLW1ldHJpYy1jb25maWcvb25saW5lLW1ldHJpY3Mvb25saW5lLW1ldHJpY3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2FwcGxpY2F0aW9uLW1ldHJpYy1jb25maWcvb25saW5lLW1ldHJpY3Mvb25saW5lLW1ldHJpY3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7OztBQVUvRSxNQUFNLE9BQU8sc0JBQXNCO0lBaURqQyxZQUFtQixhQUE0QixFQUFVLE1BQXFCLEVBQVUsT0FBa0M7UUFBdkcsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBMkI7UUE5QzFILHdCQUFtQixHQUFRLEVBQUUsQ0FBQztRQUM5QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3Qix3QkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDOUIsaUJBQVksR0FBUSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUE7UUFDckYsaUJBQVksR0FBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDN0Qsd0JBQW1CLEdBQVEsRUFBRSxDQUFDO1FBQzlCLHVCQUFrQixHQUFRLEVBQUUsQ0FBQztRQUM3QiwyQkFBc0IsR0FBUSxFQUFFLENBQUM7UUFFakMsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDaEMsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFFakMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDZCwyQkFBc0IsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVoRiwwQkFBcUIsR0FBRyxFQUFFLENBQUM7UUFHM0Isc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBRW5DLGdDQUEyQixHQUFHLEVBQUUsQ0FBQztRQUNqQyxxQkFBZ0IsR0FBUSxFQUFFLENBQUM7SUF3Qm1HLENBQUM7SUFuQi9ILElBQ0ksZ0JBQWdCLENBQUMsS0FBSztRQUN4QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQzlCLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUMxQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDO2dCQUNwQyxHQUFHLFNBQVM7Z0JBQ1osUUFBUSxFQUFFLEtBQUs7YUFDaEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDdEMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQztnQkFDcEMsR0FBRyxPQUFPO2dCQUNWLFFBQVEsRUFBRSxJQUFJO2FBQ2YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBTUQsUUFBUTtRQUNOLElBQUksQ0FBQyxPQUFPLENBQUMsNkJBQTZCLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDNUQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxHQUFHLEdBQUc7WUFDUixVQUFVLEVBQUUsSUFBSTtZQUNoQixXQUFXLEVBQUUsRUFBRTtZQUNmLFdBQVcsRUFBRSxFQUFFO1lBQ2YsVUFBVSxFQUFFLEVBQUU7WUFDZCxRQUFRLEVBQUUsRUFBRTtZQUNaLFFBQVEsRUFBRSxFQUFFO1lBQ1osTUFBTSxFQUFFLEVBQUU7U0FDWCxDQUFBO1FBQ0QsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBR0QsYUFBYSxDQUFDLENBQUM7UUFDYixJQUFJLENBQUMsMkJBQTJCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLElBQUksR0FBRyxHQUFHO1lBQ1IsV0FBVyxFQUFFLEVBQUU7WUFDZixXQUFXLEVBQUUsRUFBRTtZQUNmLFdBQVcsRUFBRSxFQUFFO1lBQ2YsWUFBWSxFQUFFLEVBQUU7U0FDakIsQ0FBQTtRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQseUJBQXlCLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCwwQkFBMEI7UUFDeEIsSUFBSSxHQUFHLEdBQUc7WUFDUixXQUFXLEVBQUUsRUFBRTtZQUNmLFdBQVcsRUFBRSxFQUFFO1lBQ2YsV0FBVyxFQUFFLEVBQUU7WUFDZixZQUFZLEVBQUUsRUFBRTtTQUNqQixDQUFBO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCw2QkFBNkIsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUlELHVCQUF1QixDQUFDLFNBQVM7UUFDL0IsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDMUIsSUFBSSxTQUFTLEdBQUc7Z0JBQ2QsVUFBVSxFQUFFLE9BQU8sQ0FBQyxZQUFZO2dCQUNoQyxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7Z0JBQzFCLFFBQVEsRUFBRSxPQUFPLENBQUMsWUFBWTtnQkFDOUIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxZQUFZO2FBQzVCLENBQUM7WUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUlELG1CQUFtQjtRQUNqQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBRTdDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFJakQsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFO2dCQUNwQixJQUFJLEdBQUcsR0FBRztvQkFDUixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7b0JBQzVCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztvQkFDNUIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO29CQUMxQixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7aUJBQ25CLENBQUE7Z0JBRUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2pEO2lCQUFNO2dCQUNMLElBQUksR0FBRyxHQUFHO29CQUNSLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztvQkFDNUIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO29CQUM1QixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7b0JBQzFCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtpQkFDbkIsQ0FBQTtnQkFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDbkQ7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUE7SUFDekQsQ0FBQztJQUVELHNCQUFzQixDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLE9BQU8sRUFBRTtZQUN0QixJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxHQUFHLGdDQUFnQyxDQUFBO1lBQzlELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztTQUNsRDthQUFNO1lBQ0wsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsR0FBRyxrREFBa0QsQ0FBQztTQUNsRjtJQUNILENBQUM7SUFHRCxhQUFhLENBQUMsQ0FBQztRQUNiLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRTtZQUNYLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7U0FDL0I7SUFFSCxDQUFDO0lBR0QsZ0JBQWdCO1FBQ2QsSUFBSSxHQUFHLEdBQUc7WUFDUixZQUFZLEVBQUUsRUFBRTtZQUNoQixnQkFBZ0IsRUFBRSxFQUFFO1lBQ3BCLFVBQVUsRUFBRSxFQUFFO1lBQ2QsVUFBVSxFQUFFLEVBQUU7WUFDZCxPQUFPLEVBQUUsRUFBRTtTQUNaLENBQUE7UUFDRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELG1CQUFtQixDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDOzttSEF4TFUsc0JBQXNCO3VHQUF0QixzQkFBc0IsMktDVm5DLCt0U0FrTU07MkZEeExPLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSxvQkFBb0I7d0tBcUJiLHNCQUFzQjtzQkFBdEMsTUFBTTtnQkFjSCxnQkFBZ0I7c0JBRG5CLEtBQUs7dUJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHsgQXBwbGljYXRpb25Db250ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL2FwcGxpY2F0aW9uLWNvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLW9ubGluZS1tZXRyaWNzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL29ubGluZS1tZXRyaWNzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vb25saW5lLW1ldHJpY3MuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBPbmxpbmVNZXRyaWNzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgbG9hZGluZ01vZGFsOiBib29sZWFuO1xuICAvLyBASW5wdXQoKSBxdWVyeUJ1bGRlckRhdGFzZXQ6IGFueTtcbiAgcmVxRmllbGRzRGF0YVNvdXJjZTogYW55ID0gW107XG4gIGlzcmVxRmllbGRzOiBib29sZWFuID0gZmFsc2U7XG4gIGlzY2RyUGFyYW1zOiBib29sZWFuID0gZmFsc2U7XG4gIGNkckZpZWxkc0RhdGFTb3VyY2U6IGFueSA9IFtdO1xuICBrcGlfZnVuY3Rpb246IGFueSA9IFtcInN1bVwiLCBcImNvdW50XCIsIFwiYXZnXCIsIFwibWF4XCIsIFwibWluXCIsIFwic3RkZGV2XCIsIFwiY291bnRfZGlzdGluY3RcIl1cbiAga3BpX29wZXJhdG9yOiBhbnkgPSBbXCJlcVwiLCBcImd0ZVwiLCBcImx0ZVwiLCBcIm5lXCIsIFwiaW5cIiwgXCJub3RJblwiXVxuICBrcGlfZW5yaWNobWVudF9uYW1lOiBhbnkgPSBbXTtcbiAgcmVxU2hvcnREYXRhU291cmNlOiBhbnkgPSBbXTtcbiAgZmlsdGVyTWFwaW5nRGF0YXNvdXJjZTogYW55ID0gW107XG4gIHF1ZXJ5X2RhdGE6IGFueTtcbiAgaXNNb2RlbFZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNTcWxDb3BpZWRUZXh0OiBib29sZWFuID0gZmFsc2U7XG4gIHF1ZXJ5QnVsZGVyRGF0YXNldDogYW55O1xuICBpc1JlY29uQ29sdW1lOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBwdWJsaWMgZ2V0TWV0UmljT25saW5lRGF0YVNldDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcmVjb25Db2x1bWVEYXRhc291cmNlID0gW107XG5cbiAgc2VsZWN0ZWREYXRhU291cmNlOiBhbnk7XG4gIGlzUXVlcnlUeXBlU2VsZWN0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgbWVzdXJlc0FuZERpbWVudGlvbnNDb2x1bW5zID0gW107XG4gIG1ldHJpY01haW5PYmplY3Q6IGFueSA9IHt9O1xuXG4gIG1ldHJpY3R5cGU6IGFueTtcblxuXG4gIEBJbnB1dCgnb25saW5lTWV0cmljRGF0YScpXG4gIHNldCBvbmxpbmVNZXRyaWNEYXRhKHZhbHVlKSB7XG4gICAgdGhpcy5tZXRyaWNNYWluT2JqZWN0ID0gdmFsdWU7XG4gICAgdmFsdWUuc291cmNlLmRpbWVuc2lvbnMuZm9yRWFjaChkaW1lbnNpb24gPT4ge1xuICAgICAgdGhpcy5tZXN1cmVzQW5kRGltZW50aW9uc0NvbHVtbnMucHVzaCh7XG4gICAgICAgIC4uLmRpbWVuc2lvbixcbiAgICAgICAgbWVhc3VyZXM6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB2YWx1ZS5zb3VyY2UubWVhc3VyZXMuZm9yRWFjaChtZWFzdXJlID0+IHtcbiAgICAgIHRoaXMubWVzdXJlc0FuZERpbWVudGlvbnNDb2x1bW5zLnB1c2goe1xuICAgICAgICAuLi5tZWFzdXJlLFxuICAgICAgICBtZWFzdXJlczogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuXG5cbiAgY29uc3RydWN0b3IocHVibGljIGNvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2UsIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLCBwcml2YXRlIHNlcnZpY2U6IEFwcGxpY2F0aW9uQ29udGVudFNlcnZpY2UpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VydmljZS5saXN0Q29sdW1uRW5yaWNobWVudEZ1bmN0aW9ucygpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMua3BpX2VucmljaG1lbnRfbmFtZSA9IGRhdGE7XG4gICAgfSlcbiAgfVxuXG4gIGFkZENvbHVtbnMoKSB7XG4gICAgbGV0IG9iaiA9IHtcbiAgICAgIFwibWVhc3VyZXNcIjogdHJ1ZSxcbiAgICAgIFwiZmllbGROYW1lXCI6IFwiXCIsXG4gICAgICBcImFsaWFzTmFtZVwiOiBcIlwiLFxuICAgICAgXCJkYXRhVHlwZVwiOiBcIlwiLFxuICAgICAgXCJmb3JtYXRcIjogXCJcIixcbiAgICAgIFwibWV0aG9kXCI6IFwiXCIsXG4gICAgICBcInR5cGVcIjogXCJcIlxuICAgIH1cbiAgICB0aGlzLm1lc3VyZXNBbmREaW1lbnRpb25zQ29sdW1ucy5wdXNoKG9iaik7XG4gIH1cblxuXG4gIGRlbGV0ZUNvbHVtbnMoaSkge1xuICAgIHRoaXMubWVzdXJlc0FuZERpbWVudGlvbnNDb2x1bW5zLnNwbGljZShpLCAxKVxuICB9XG5cbiAgYWRkRmlsdGVyTWFwaW5nQ29sdW1ucygpIHtcbiAgICBsZXQgb2JqID0ge1xuICAgICAgXCJmaWVsZE5hbWVcIjogXCJcIixcbiAgICAgIFwib3BlcmF0aW9uXCI6IFwiXCIsXG4gICAgICBcInRocmVzaG9sZFwiOiBcIlwiLFxuICAgICAgXCJjb21wYXJhdG9yXCI6IFwiXCIsXG4gICAgfVxuICAgIHRoaXMubWV0cmljTWFpbk9iamVjdC5zb3VyY2UuZmlsdGVycy5wdXNoKG9iaik7XG4gIH1cblxuICBkZWxldGVGaWx0ZXJNYXBpbmdDb2x1bW5zKGkpIHtcbiAgICB0aGlzLm1ldHJpY01haW5PYmplY3Quc291cmNlLmZpbHRlcnMuc3BsaWNlKGksIDEpO1xuICB9XG5cbiAgYWRkRXhjbHVzaW9uc01hcGluZ0NvbHVtbnMoKSB7XG4gICAgbGV0IG9iaiA9IHtcbiAgICAgIFwiZmllbGROYW1lXCI6IFwiXCIsXG4gICAgICBcIm9wZXJhdGlvblwiOiBcIlwiLFxuICAgICAgXCJ0aHJlc2hvbGRcIjogXCJcIixcbiAgICAgIFwiY29tcGFyYXRvclwiOiBcIlwiLFxuICAgIH1cbiAgICB0aGlzLm1ldHJpY01haW5PYmplY3Quc291cmNlLmV4Y2x1c2lvbnMucHVzaChvYmopO1xuICB9XG5cbiAgZGVsZXRlRXhjbHVzaW9uc01hcGluZ0NvbHVtbnMoaSkge1xuICAgIHRoaXMubWV0cmljTWFpbk9iamVjdC5zb3VyY2UuZXhjbHVzaW9ucy5zcGxpY2UoaSwgMSk7XG4gIH1cblxuXG5cbiAgdHJhbnNmb3JtRGF0YUZvck1GaWx0ZXIobWFwZmlsdGVyKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIG1hcGZpbHRlci5mb3JFYWNoKG1hcHBpbmcgPT4ge1xuICAgICAgbGV0IHJlc3VsdE9iaiA9IHtcbiAgICAgICAgY29sdW1uTmFtZTogbWFwcGluZy5zZXJ2ZXJDb2x1bW4sXG4gICAgICAgIGRhdGFUeXBlOiBtYXBwaW5nLmRhdGFUeXBlLFxuICAgICAgICBvcGVyYXRvcjogbWFwcGluZy5vcGVyYXRvck5hbWUsXG4gICAgICAgIHZhbHVlOiBtYXBwaW5nLmRlZmF1bHRWYWx1ZVxuICAgICAgfTtcbiAgICAgIHJlc3VsdC5wdXNoKHJlc3VsdE9iaik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG5cblxuICBjcmVhdGVPbmxpbmVNZXRyaWNzKCkge1xuICAgIHRoaXMubWV0cmljTWFpbk9iamVjdC5zb3VyY2UubWVhc3VyZXMgPSBbXTtcbiAgICB0aGlzLm1ldHJpY01haW5PYmplY3Quc291cmNlLmRpbWVuc2lvbnMgPSBbXTtcblxuICAgIHRoaXMubWVzdXJlc0FuZERpbWVudGlvbnNDb2x1bW5zLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAvLyBDaGVjayBpZiBlbGVtZW50LmFkdmFuY2VkQ29sdW1uIGlzIGFuIGVtcHR5IHN0cmluZyBhbmQgc2V0IGl0IHRvIG51bGxcbiAgICAgIC8vIGNvbnN0IGFkdmFuY2VkQ29sdW1uVmFsdWUgPSBlbGVtZW50LmFkdmFuY2VkQ29sdW1uID09PSBcIlwiID8gbnVsbCA6IGVsZW1lbnQuYWR2YW5jZWRDb2x1bW47XG5cbiAgICAgIGlmIChlbGVtZW50Lm1lYXN1cmVzKSB7XG4gICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgZmllbGROYW1lOiBlbGVtZW50LmZpZWxkTmFtZSxcbiAgICAgICAgICBhbGlhc05hbWU6IGVsZW1lbnQuYWxpYXNOYW1lLFxuICAgICAgICAgIGRhdGFUeXBlOiBlbGVtZW50LmRhdGFUeXBlLFxuICAgICAgICAgIHR5cGU6IGVsZW1lbnQudHlwZSxcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWV0cmljTWFpbk9iamVjdC5zb3VyY2UubWVhc3VyZXMucHVzaChvYmopO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICBmaWVsZE5hbWU6IGVsZW1lbnQuZmllbGROYW1lLFxuICAgICAgICAgIGFsaWFzTmFtZTogZWxlbWVudC5hbGlhc05hbWUsXG4gICAgICAgICAgZGF0YVR5cGU6IGVsZW1lbnQuZGF0YVR5cGUsXG4gICAgICAgICAgdHlwZTogZWxlbWVudC50eXBlLFxuICAgICAgICB9XG4gICAgICAgIHRoaXMubWV0cmljTWFpbk9iamVjdC5zb3VyY2UuZGltZW5zaW9ucy5wdXNoKG9iaik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmdldE1ldFJpY09ubGluZURhdGFTZXQuZW1pdCh0aGlzLm1ldHJpY01haW5PYmplY3QpXG4gIH1cblxuICBnZXRRdWVyeUZvckRldGFpbHNEYXRhKGUpIHtcbiAgICBpZiAoZS52YWx1ZSA9PSAnQmFzaWMnKSB7XG4gICAgICB0aGlzLnF1ZXJ5QnVsZGVyRGF0YXNldC5hcGkgPSAnL2twaS9nZW5lcmljRGV0YWlsRGF0YVJlc3BvbnNlJ1xuICAgICAgdGhpcy5xdWVyeUJ1bGRlckRhdGFzZXQucXVlcnlDb25maWcuY29sdW1ucyA9IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnF1ZXJ5QnVsZGVyRGF0YXNldC5hcGkgPSAnL2twaS9nZW5lcmljQWdncmVnYXRlUGFnaW5hdGVkS3BpU2VydmljZVJlc3BvbnNlJztcbiAgICB9XG4gIH1cblxuXG4gIGdldERhdGFDb25maWcoZSkge1xuICAgIGlmIChlLmV2ZW50KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZSA9IGUudmFsdWU7XG4gICAgICB0aGlzLmlzUXVlcnlUeXBlU2VsZWN0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgfVxuXG5cbiAgYWRkSGF2aW5nc0NvbHVtZSgpIHtcbiAgICBsZXQgb2JqID0ge1xuICAgICAgXCJjb2x1bW5OYW1lXCI6IFwiXCIsXG4gICAgICBcImFkdmFuY2VkQ29sdW1uXCI6IFwiXCIsXG4gICAgICBcImRhdGFUeXBlXCI6IFwiXCIsXG4gICAgICBcIm9wZXJhdG9yXCI6IFwiXCIsXG4gICAgICBcInZhbHVlXCI6IFwiXCJcbiAgICB9XG4gICAgdGhpcy5xdWVyeUJ1bGRlckRhdGFzZXQucXVlcnlDb25maWcuaGF2aW5ncy5wdXNoKG9iaik7XG4gIH1cblxuICBkZWxldGVIYXZpbmdzQ29sdW1lKGkpIHtcbiAgICB0aGlzLnF1ZXJ5QnVsZGVyRGF0YXNldC5xdWVyeUNvbmZpZy5oYXZpbmdzLnNwbGljZShpLCAxKTtcbiAgfVxuXG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBweS0yIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBUYXJnZXRcbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHQtMiBib3JkZXIteCBib3JkZXItYiBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIHAtMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRGF0YWJhc2UgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3QudGFyZ2V0LmRhdGFiYXNlTmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IERCIENvbmZpZyA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiWydtb25nbycsJ2ltcGFsYScsJ3Bvc3RncmVzJywnbXlzcWwnLCdiaWdxdWVyeSddXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cImdldERhdGFDb25maWcoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC50YXJnZXQuZGJDb25maWdcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFRhYmxlIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnRhcmdldC50YWJsZU5hbWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBEaW1lbnNpb24gQ29sdW1uczwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3QudGFyZ2V0LmRpbWVuc2lvbkNvbHVtbnNcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBNZWFzdXJlIENvbHVtbnM8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJtZXRyaWNNYWluT2JqZWN0LnRhcmdldC5tZWFzdXJlQ29sdW1uc1wiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFdyaXRlIERpc3Bvc2l0aW9uPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC50YXJnZXQud3JpdGVEaXNwb3NpdGlvblwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yIG10LThcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtY2hlY2stYm94IHRleHQ9XCJDcmVhdGUgVGFibGVcIiBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3QudGFyZ2V0LmNyZWF0ZVRhYmxlXCI+PC9keC1jaGVjay1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBweS0yIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBTb3VyY2VcbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHQtMiBib3JkZXIteCBib3JkZXItYiBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIHAtMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRGF0YSBTb3VyY2UgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIm1ldHJpY01haW5PYmplY3Quc291cmNlLmRhdGFzb3VyY2VcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBFdmVudCBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwibWV0cmljTWFpbk9iamVjdC5zb3VyY2UuZXZlbnROYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC1hdXRvIG1pbi13LTAgbXktMlwiPlxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWxnIHB5LTIgZm9udC1leHRyYWJvbGQgYm9yZGVyLWIgYmctZ3JheS03MDAgdGV4dC13aGl0ZSBweC0yXCI+TWVhc3VyZXMgYW5kXG4gICAgICAgIERpbWVuc2lvbnNcbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHQtMiBib3JkZXIteCBib3JkZXItYiBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm15LTIgZmxleCBqdXN0aWZ5LWJldHdlZW5cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBtZXN1cmVzQW5kRGltZW50aW9uc0NvbHVtbnM7IGxldCBpID0gaW5kZXg7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBNZWFzdXJlczwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggW3ZhbHVlXT1cIml0ZW0ubWVhc3VyZXNcIiBbKG5nTW9kZWwpXT1cIml0ZW0ubWVhc3VyZXNcIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFZhbHVlIEZpZWxkKGFsaWFzTmFtZSk8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLmFsaWFzTmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBTZXJ2ZXIgQ29sdW1uIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLmZpZWxkTmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgXG4gICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IERhdGF0eXBlPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIFtpdGVtc109XCJbJ2RhdGUnLCdzdHJpbmcnLCd0aW1lc3RhbXAnLCdpbnQnLCAnZG91YmxlJywgJ2Jvb2xlYW4nXVwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS5kYXRhVHlwZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFR5cGU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cImtwaV9mdW5jdGlvblwiIFsobmdNb2RlbCldPVwiaXRlbS50eXBlXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRm9ybWF0PC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5mb3JtYXRcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gTWV0aG9kIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLm1ldGhvZFwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbXQtNyB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9zbX19IGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImRlbGV0ZUNvbHVtbnMoaSlcIj48aVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktZW5kIG15LTJcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfc219fSBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJhZGRDb2x1bW5zKClcIj5BZGRcbiAgICAgICAgICAgICAgICBDb2x1bW5zPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LWF1dG8gbWluLXctMCBteS0yXCI+XG4gICAgPGRpdiBjbGFzcz1cInRleHQtbGcgcHktMiBmb250LWV4dHJhYm9sZCBib3JkZXItYiBiZy1ncmF5LTcwMCB0ZXh0LXdoaXRlIHB4LTJcIj4gRmlsdGVyIE1hcGluZ1xuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwdC0yIGJvcmRlci14IGJvcmRlci1iIFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXktMiBmbGV4IGZsZXgtcm93IGp1c3RpZnktYmV0d2VlblwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBtZXRyaWNNYWluT2JqZWN0LnNvdXJjZS5maWx0ZXJzOyBsZXQgaSA9IGluZGV4O1wiPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRmllbGQgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0uZmllbGROYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IE9wZXJhdGlvbjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0ub3BlcmF0aW9uXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFRocmVzaG9sZDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0udGhyZXNob2xkXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IENvbXBhcmF0b3I8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0uY29tcGFyYXRvclwiIFtpdGVtc109XCJrcGlfb3BlcmF0b3JcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbXQtNyB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9zbX19IGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImRlbGV0ZUZpbHRlck1hcGluZ0NvbHVtbnMoaSlcIj48aVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1lbmQgbXktMlwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X3NtfX0gY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEZpbHRlck1hcGluZ0NvbHVtbnMoKVwiPkFkZFxuICAgICAgICAgICAgICAgICAgICAgICAgTWFwaW5nPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTJcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBweS0yIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBFeGNsdXNpb25zXG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInB0LTIgYm9yZGVyLXggYm9yZGVyLWIgXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJteS0yIGZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuXCJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIG1ldHJpY01haW5PYmplY3Quc291cmNlLmV4Y2x1c2lvbnM7IGxldCBpID0gaW5kZXg7XCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBGaWVsZCBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5maWVsZE5hbWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gT3BlcmF0aW9uPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5vcGVyYXRpb25cIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gVGhyZXNob2xkPC9kaXY+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS50aHJlc2hvbGRcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gQ29tcGFyYXRvcjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFsobmdNb2RlbCldPVwiaXRlbS5jb21wYXJhdG9yXCIgW2l0ZW1zXT1cImtwaV9vcGVyYXRvclwiPjwvZHgtc2VsZWN0LWJveD5cblxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG10LTcgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9kYW5nZXJfc219fSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVFeGNsdXNpb25zTWFwaW5nQ29sdW1ucyhpKVwiPjxpIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktZW5kIG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9zbX19IGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRFeGNsdXNpb25zTWFwaW5nQ29sdW1ucygpXCI+QWRkXG4gICAgICAgICAgICAgICAgICAgICAgICBFeGNsdXNpb25zPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBqdXN0aWZ5LWVuZCBtdC01IGJvcmRlci10XCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fc3VjY2Vzc19tZH19IGN1cnNvci1wb2ludGVyIG14LTEgbXktMlwiIChjbGljayk9XCJjcmVhdGVPbmxpbmVNZXRyaWNzKClcIj5cbiAgICAgICAgU2F2ZSBPbmxpbmUgTWV0cmljc1xuICAgIDwvYnV0dG9uPlxuPC9kaXY+Il19