ezlibrary_v2 0.0.1
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/esm2020/ezlibrary_v2.mjs +5 -0
- package/esm2020/lib/admin-service/admin-service.service.mjs +36 -0
- package/esm2020/lib/analysis-search/analysis-search.component.mjs +1083 -0
- package/esm2020/lib/assort-service/assort-service.service.mjs +31 -0
- package/esm2020/lib/attribute-definition/attribute-definition.component.mjs +231 -0
- package/esm2020/lib/auth/auth.guard.mjs +40 -0
- package/esm2020/lib/bi-service/bi.service.mjs +58 -0
- package/esm2020/lib/call-info/callinfo.component.mjs +126 -0
- package/esm2020/lib/comman-service/comman-service.service.mjs +679 -0
- package/esm2020/lib/comman-service/share-data-service.service.mjs +23 -0
- package/esm2020/lib/contact-search/contact-search.component.mjs +679 -0
- package/esm2020/lib/contact-service/contact-service.service.mjs +47 -0
- package/esm2020/lib/ezheader/header.component.mjs +383 -0
- package/esm2020/lib/ezlib.module.mjs +220 -0
- package/esm2020/lib/file-upload/fileupload.component.mjs +920 -0
- package/esm2020/lib/file-upload-log/file-upload-log.component.mjs +175 -0
- package/esm2020/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.mjs +14 -0
- package/esm2020/lib/fileupload-module/fileupload-routing.module.mjs +28 -0
- package/esm2020/lib/footer/footer.component.mjs +18 -0
- package/esm2020/lib/globle/common-pdf.service.mjs +28 -0
- package/esm2020/lib/globle/globle-env.service.mjs +45 -0
- package/esm2020/lib/globle/memo-report.service.mjs +2800 -0
- package/esm2020/lib/globle/pdf-service.service.mjs +18848 -0
- package/esm2020/lib/globle/shared-services.service.mjs +27 -0
- package/esm2020/lib/globle/upload-service.service.mjs +69 -0
- package/esm2020/lib/header/header.component.mjs +179 -0
- package/esm2020/lib/invalid/invalid.component.mjs +71 -0
- package/esm2020/lib/logout/logout.component.mjs +107 -0
- package/esm2020/lib/menu-right/menu-right.component.mjs +252 -0
- package/esm2020/lib/pipes/number-with-commas.pipe.mjs +24 -0
- package/esm2020/lib/pipes/order-by-pipe.pipe.mjs +17 -0
- package/esm2020/lib/pipes/selectedCount.mjs +19 -0
- package/esm2020/lib/pipes/sum.pipe.mjs +16 -0
- package/esm2020/lib/pkt-data/pkt-data.component.mjs +1107 -0
- package/esm2020/lib/pricing-service/pricing.service.mjs +58 -0
- package/esm2020/lib/qa-analysis/qa-analysis.component.mjs +1035 -0
- package/esm2020/lib/report-format/report-format.component.mjs +400 -0
- package/esm2020/lib/sessionend/session-end.guard.mjs +28 -0
- package/esm2020/lib/stock-service/lazyload.service.mjs +21 -0
- package/esm2020/lib/stock-service/stock-service.service.mjs +62 -0
- package/esm2020/lib/system-module/subform/subform.component.mjs +2481 -0
- package/esm2020/lib/system-module/system/system.component.mjs +959 -0
- package/esm2020/lib/system-module/system-service/system-service.service.mjs +85 -0
- package/esm2020/lib/system-module/system-service/upload-file.service.mjs +86 -0
- package/esm2020/lib/utility/app-no-dbl-click.directive.mjs +23 -0
- package/esm2020/lib/utility/constants.mjs +5 -0
- package/esm2020/lib/utility/contact-table-search.pipe.mjs +25 -0
- package/esm2020/lib/utility/formate-num-field.pipe.mjs +19 -0
- package/esm2020/lib/utility/search-pipe.pipe.mjs +26 -0
- package/esm2020/lib/utility/selective-preloading-strategy.mjs +23 -0
- package/esm2020/lib/utility/table-search.pipe.mjs +25 -0
- package/esm2020/lib/utility/tranform.directive.mjs +27 -0
- package/esm2020/lib/websearch-history/websearch-history.component.mjs +273 -0
- package/esm2020/public_api.mjs +57 -0
- package/ezlibrary_v2.d.ts +5 -0
- package/fesm2015/ezlibrary_v2.mjs +33543 -0
- package/fesm2015/ezlibrary_v2.mjs.map +1 -0
- package/fesm2020/ezlibrary_v2.mjs +33533 -0
- package/fesm2020/ezlibrary_v2.mjs.map +1 -0
- package/lib/admin-service/admin-service.service.d.ts +13 -0
- package/lib/analysis-search/analysis-search.component.d.ts +122 -0
- package/lib/assort-service/assort-service.service.d.ts +12 -0
- package/lib/attribute-definition/attribute-definition.component.d.ts +47 -0
- package/lib/auth/auth.guard.d.ts +16 -0
- package/lib/bi-service/bi.service.d.ts +20 -0
- package/lib/call-info/callinfo.component.d.ts +30 -0
- package/lib/comman-service/comman-service.service.d.ts +111 -0
- package/lib/comman-service/share-data-service.service.d.ts +10 -0
- package/lib/contact-search/contact-search.component.d.ts +115 -0
- package/lib/contact-service/contact-service.service.d.ts +15 -0
- package/lib/ezheader/header.component.d.ts +61 -0
- package/lib/ezlib.module.d.ts +47 -0
- package/lib/file-upload/fileupload.component.d.ts +131 -0
- package/lib/file-upload-log/file-upload-log.component.d.ts +53 -0
- package/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.d.ts +8 -0
- package/lib/fileupload-module/fileupload-routing.module.d.ts +7 -0
- package/lib/footer/footer.component.d.ts +9 -0
- package/lib/globle/common-pdf.service.d.ts +9 -0
- package/lib/globle/globle-env.service.d.ts +16 -0
- package/lib/globle/memo-report.service.d.ts +107 -0
- package/lib/globle/pdf-service.service.d.ts +459 -0
- package/lib/globle/shared-services.service.d.ts +12 -0
- package/lib/globle/upload-service.service.d.ts +20 -0
- package/lib/header/header.component.d.ts +45 -0
- package/lib/invalid/invalid.component.d.ts +12 -0
- package/lib/logout/logout.component.d.ts +21 -0
- package/lib/menu-right/menu-right.component.d.ts +47 -0
- package/lib/pipes/number-with-commas.pipe.d.ts +7 -0
- package/lib/pipes/order-by-pipe.pipe.d.ts +7 -0
- package/lib/pipes/selectedCount.d.ts +7 -0
- package/lib/pipes/sum.pipe.d.ts +7 -0
- package/lib/pkt-data/pkt-data.component.d.ts +189 -0
- package/lib/pricing-service/pricing.service.d.ts +20 -0
- package/lib/qa-analysis/qa-analysis.component.d.ts +99 -0
- package/lib/report-format/report-format.component.d.ts +74 -0
- package/lib/sessionend/session-end.guard.d.ts +10 -0
- package/lib/stock-service/lazyload.service.d.ts +7 -0
- package/lib/stock-service/stock-service.service.d.ts +19 -0
- package/lib/system-module/subform/subform.component.d.ts +227 -0
- package/lib/system-module/system/system.component.d.ts +113 -0
- package/lib/system-module/system-service/system-service.service.d.ts +23 -0
- package/lib/system-module/system-service/upload-file.service.d.ts +12 -0
- package/lib/utility/app-no-dbl-click.directive.d.ts +7 -0
- package/lib/utility/constants.d.ts +4 -0
- package/lib/utility/contact-table-search.pipe.d.ts +7 -0
- package/lib/utility/formate-num-field.pipe.d.ts +7 -0
- package/lib/utility/search-pipe.pipe.d.ts +7 -0
- package/lib/utility/selective-preloading-strategy.d.ts +9 -0
- package/lib/utility/table-search.pipe.d.ts +7 -0
- package/lib/utility/tranform.directive.d.ts +10 -0
- package/lib/websearch-history/websearch-history.component.d.ts +62 -0
- package/package.json +48 -0
- package/public_api.d.ts +52 -0
|
@@ -0,0 +1,959 @@
|
|
|
1
|
+
import { Component, ViewChild, ElementRef } from '@angular/core';
|
|
2
|
+
import { HttpHeaders } from '@angular/common/http';
|
|
3
|
+
import { Router, ActivatedRoute } from '@angular/router';
|
|
4
|
+
import { ToastrService } from 'ngx-toastr';
|
|
5
|
+
import { Cookie } from 'ng2-cookies/ng2-cookies';
|
|
6
|
+
import { NgxSpinnerService } from "ngx-spinner";
|
|
7
|
+
import { SystemServiceService } from '../system-service/system-service.service';
|
|
8
|
+
import { CommanServiceService } from '../../comman-service/comman-service.service';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@angular/router";
|
|
11
|
+
import * as i2 from "ngx-toastr";
|
|
12
|
+
import * as i3 from "../system-service/system-service.service";
|
|
13
|
+
import * as i4 from "ngx-spinner";
|
|
14
|
+
import * as i5 from "../../comman-service/comman-service.service";
|
|
15
|
+
import * as i6 from "ngx-pagination";
|
|
16
|
+
import * as i7 from "ngx-chips";
|
|
17
|
+
import * as i8 from "ng-select";
|
|
18
|
+
import * as i9 from "@angular/common";
|
|
19
|
+
import * as i10 from "@angular/forms";
|
|
20
|
+
import * as i11 from "../../utility/app-no-dbl-click.directive";
|
|
21
|
+
import * as i12 from "ngx-order-pipe";
|
|
22
|
+
import * as i13 from "../../utility/search-pipe.pipe";
|
|
23
|
+
import * as i14 from "../../pipes/order-by-pipe.pipe";
|
|
24
|
+
export class SystemComponent {
|
|
25
|
+
constructor(router, route, toastr, ss, spinnerService, cs) {
|
|
26
|
+
this.router = router;
|
|
27
|
+
this.route = route;
|
|
28
|
+
this.toastr = toastr;
|
|
29
|
+
this.ss = ss;
|
|
30
|
+
this.spinnerService = spinnerService;
|
|
31
|
+
this.cs = cs;
|
|
32
|
+
this.cDt = new Date();
|
|
33
|
+
this.formFilds = [];
|
|
34
|
+
this.formFildsPopup = [];
|
|
35
|
+
this.datalist = [];
|
|
36
|
+
this.actions = [];
|
|
37
|
+
this.lovs = [];
|
|
38
|
+
this.addNew = [];
|
|
39
|
+
this.tblH = [];
|
|
40
|
+
this.tblDesc = [];
|
|
41
|
+
this.navigation = [];
|
|
42
|
+
this.Sysresult = [];
|
|
43
|
+
this.whereMap = {};
|
|
44
|
+
this.paraObj = {};
|
|
45
|
+
this.currObj = {};
|
|
46
|
+
this.sqlArray = {};
|
|
47
|
+
this.glbObj = {};
|
|
48
|
+
this.pageSize = 10;
|
|
49
|
+
this.cLink = 0;
|
|
50
|
+
this.p = 1;
|
|
51
|
+
this.eveC = 'fa-eye-slash';
|
|
52
|
+
this.inputtype = 'password';
|
|
53
|
+
this.order = '';
|
|
54
|
+
this.reverse = false;
|
|
55
|
+
this.subform = false;
|
|
56
|
+
this.estst = false;
|
|
57
|
+
this.contactName = "";
|
|
58
|
+
//for set null to table cell
|
|
59
|
+
this.closeNull = () => this.tbCell = null;
|
|
60
|
+
//reseting form
|
|
61
|
+
this.reset = v => v.form.reset();
|
|
62
|
+
}
|
|
63
|
+
//load page defination
|
|
64
|
+
getPageDefination() {
|
|
65
|
+
this.datalist = [];
|
|
66
|
+
this.whereMap = [];
|
|
67
|
+
this.spinnerService.show();
|
|
68
|
+
let action = this.route.snapshot.params['action'] || '';
|
|
69
|
+
if (this.whrV != null && this.subFrmWk == null) {
|
|
70
|
+
this.paraObj['whereKeys'] = this.whrK;
|
|
71
|
+
this.paraObj['whereVlus'] = '' + this.whrV;
|
|
72
|
+
this.whereMap[this.whrK] = this.whrV;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
this.paraObj['whereKeys'] = '1';
|
|
76
|
+
this.paraObj['whereVlus'] = '1';
|
|
77
|
+
}
|
|
78
|
+
this.header['method'] = 'loadList';
|
|
79
|
+
if (this.pageInfo != null) {
|
|
80
|
+
var pageTP = this.pageInfo.page_typ;
|
|
81
|
+
if (pageTP == 'jsonForm') {
|
|
82
|
+
this.paraObj['whereKeys'] = this.pageInfo.where_clause;
|
|
83
|
+
this.paraObj['whereVlus'] = this.whereMap[this.pageInfo.where_clause];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (action == 'newcontact') {
|
|
87
|
+
this.paraObj['whereKeys'] = "nme_idn";
|
|
88
|
+
this.paraObj['whereVlus'] = "0";
|
|
89
|
+
}
|
|
90
|
+
if (action == 'newacccontact') {
|
|
91
|
+
this.paraObj['whereKeys'] = "nme_idn";
|
|
92
|
+
this.paraObj['whereVlus'] = "0";
|
|
93
|
+
}
|
|
94
|
+
if (action == 'newledger') {
|
|
95
|
+
this.paraObj['whereKeys'] = "ledger_idn";
|
|
96
|
+
this.paraObj['whereVlus'] = "0";
|
|
97
|
+
}
|
|
98
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
99
|
+
console.log(options);
|
|
100
|
+
console.log(JSON.stringify(this.paraObj));
|
|
101
|
+
this.ss.getData(this.paraObj, options).then((response) => {
|
|
102
|
+
if (response.status == 'SUCCESS') {
|
|
103
|
+
console.log(response);
|
|
104
|
+
this.spinnerService.hide();
|
|
105
|
+
this.tblH = response.dataHeader;
|
|
106
|
+
this.tblDesc = response.dataHeaderPrint;
|
|
107
|
+
this.addNew = response.buttons[0] || {};
|
|
108
|
+
this.pageInfo = response.pageInfo;
|
|
109
|
+
this.pkf = response.pageInfo.primary_key_field;
|
|
110
|
+
this.datalist = response.dataList || [];
|
|
111
|
+
this.actions = response.actions;
|
|
112
|
+
this.navigation = response.navigation;
|
|
113
|
+
debugger;
|
|
114
|
+
if (action == 'newcontact' || action == 'newledger' || action == 'newacccontact') {
|
|
115
|
+
this.action = action;
|
|
116
|
+
this.navigation = response.navigation[0];
|
|
117
|
+
setTimeout(() => {
|
|
118
|
+
this.formFilds = [];
|
|
119
|
+
document.getElementById('datamdbtn').click();
|
|
120
|
+
this.paraObj['formNme'] = this.route.snapshot.params['frmnme'];
|
|
121
|
+
this.getFormFields();
|
|
122
|
+
this.btnName = 'Add';
|
|
123
|
+
}, 500);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
this.spinnerService.hide();
|
|
128
|
+
this.toastr.error(response.message);
|
|
129
|
+
}
|
|
130
|
+
}).catch((err) => {
|
|
131
|
+
this.spinnerService.hide();
|
|
132
|
+
this.toastr.error(err.message);
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
//load form fields
|
|
136
|
+
getFormFields() {
|
|
137
|
+
this.spinnerService.show();
|
|
138
|
+
if (this.whrV != null) {
|
|
139
|
+
this.paraObj['whereKeys'] = this.whrK;
|
|
140
|
+
this.paraObj['whereVlus'] = this.whrV;
|
|
141
|
+
}
|
|
142
|
+
this.header['method'] = 'loadAddEdit';
|
|
143
|
+
console.log(JSON.stringify(this.paraObj));
|
|
144
|
+
console.log(JSON.stringify(this.header));
|
|
145
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
146
|
+
this.ss.getFormF(this.paraObj, options).then((response) => {
|
|
147
|
+
if (response.status == 'SUCCESS' && response.message != 'SUCCESS') {
|
|
148
|
+
this.toastr.error(response.message);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
;
|
|
152
|
+
if (response.status == 'SUCCESS') {
|
|
153
|
+
console.log(response);
|
|
154
|
+
this.formFilds = response.formFields;
|
|
155
|
+
debugger;
|
|
156
|
+
this.spinnerService.hide();
|
|
157
|
+
this.formFilds.forEach(element => {
|
|
158
|
+
if (element.form_field_typ == 'tb') {
|
|
159
|
+
this.getLovList(element.form_field, element.page_item_idn);
|
|
160
|
+
}
|
|
161
|
+
if (element.form_field_typ == 's') {
|
|
162
|
+
this.getLovList(element.form_field, element.page_item_idn);
|
|
163
|
+
}
|
|
164
|
+
if (element.form_field_typ == 'hd') {
|
|
165
|
+
element.default_value = this.whereMap[element.form_field];
|
|
166
|
+
}
|
|
167
|
+
if (element.form_field_typ == 'sq') {
|
|
168
|
+
this.getSequence(element);
|
|
169
|
+
}
|
|
170
|
+
if (element.dta_typ == 'sa') {
|
|
171
|
+
this.getLovList(element.form_field, element.page_item_idn);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
this.spinnerService.hide();
|
|
177
|
+
this.toastr.error(response.message);
|
|
178
|
+
}
|
|
179
|
+
}).catch((err) => {
|
|
180
|
+
this.spinnerService.hide();
|
|
181
|
+
this.toastr.error(err.message);
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
//load form fields
|
|
185
|
+
getFormFieldsPopup() {
|
|
186
|
+
this.spinnerService.show();
|
|
187
|
+
if (this.whrV != null) {
|
|
188
|
+
this.paraObj['whereKeys'] = this.whrK;
|
|
189
|
+
this.paraObj['whereVlus'] = this.whrV;
|
|
190
|
+
this.whereMap[this.whrK] = this.whrV;
|
|
191
|
+
}
|
|
192
|
+
this.header['method'] = 'loadAddEdit';
|
|
193
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
194
|
+
this.ss.getFormF(this.paraObj, options).then((response) => {
|
|
195
|
+
if (response.status == 'SUCCESS' && response.message != 'SUCCESS') {
|
|
196
|
+
this.toastr.error(response.message);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
;
|
|
200
|
+
if (response.status == 'SUCCESS') {
|
|
201
|
+
console.log(response);
|
|
202
|
+
debugger;
|
|
203
|
+
this.formFildsPopup = response.formFields;
|
|
204
|
+
this.popuppageInfo = response.pageInfo;
|
|
205
|
+
this.spinnerService.hide();
|
|
206
|
+
this.formFildsPopup.forEach(element => {
|
|
207
|
+
debugger;
|
|
208
|
+
if (element.form_field_typ == 'tb') {
|
|
209
|
+
this.getLovList(element.form_field, element.page_item_idn);
|
|
210
|
+
}
|
|
211
|
+
if (element.form_field_typ == 's') {
|
|
212
|
+
this.getLovList(element.form_field, element.page_item_idn);
|
|
213
|
+
}
|
|
214
|
+
if (element.form_field_typ == 'hd') {
|
|
215
|
+
element.default_value = this.whereMap[element.form_field];
|
|
216
|
+
}
|
|
217
|
+
if (element.form_field_typ == 'sq') {
|
|
218
|
+
this.getSequence(element);
|
|
219
|
+
}
|
|
220
|
+
if (element.form_field_typ == 'fk') {
|
|
221
|
+
element.default_value = this.whrV;
|
|
222
|
+
}
|
|
223
|
+
if (element.dta_typ == 'sa') {
|
|
224
|
+
this.getLovList(element.form_field, element.page_item_idn);
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
this.spinnerService.hide();
|
|
230
|
+
this.toastr.error(response.message);
|
|
231
|
+
}
|
|
232
|
+
}).catch((err) => {
|
|
233
|
+
this.spinnerService.hide();
|
|
234
|
+
this.toastr.error(err.message);
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
// function to remove invalid characters
|
|
238
|
+
// removeInvalid(fl) {
|
|
239
|
+
// if (fl.form_field == "nme" || fl.form_field == "print_nme") {
|
|
240
|
+
// fl.default_value = fl.default_value.replace(/[^a-z ]/gi, '');
|
|
241
|
+
// }
|
|
242
|
+
// };
|
|
243
|
+
//users action like 'add', 'edit', 'delete' and 'ad Item'
|
|
244
|
+
userAction(ua, c, a) {
|
|
245
|
+
debugger;
|
|
246
|
+
console.log(ua, c, a);
|
|
247
|
+
if (c == 'add') {
|
|
248
|
+
this.spinnerService.show();
|
|
249
|
+
this.formFilds = [];
|
|
250
|
+
document.getElementById('datamdbtn').click();
|
|
251
|
+
this.paraObj['formNme'] = this.route.snapshot.params['frmnme'];
|
|
252
|
+
this.getFormFields();
|
|
253
|
+
this.btnName = 'Add';
|
|
254
|
+
}
|
|
255
|
+
else if (ua && c.trim() == 'edit') {
|
|
256
|
+
this.glbObj = ua;
|
|
257
|
+
this.spinnerService.show();
|
|
258
|
+
this.formFilds = [];
|
|
259
|
+
document.getElementById('datamdbtn').click();
|
|
260
|
+
this.pid = ua[this.pkf];
|
|
261
|
+
this.paraObj['formNme'] = this.route.snapshot.params['frmnme'];
|
|
262
|
+
this.getEditData(ua[this.pkf]);
|
|
263
|
+
this.btnName = 'Edit';
|
|
264
|
+
}
|
|
265
|
+
else if (a.form_field == 'addAttr') {
|
|
266
|
+
this.spinnerService.show();
|
|
267
|
+
this.formFilds = [];
|
|
268
|
+
this.curl = a.lov_qry;
|
|
269
|
+
this.router.navigate([a.lov_qry.trim(), this.pkf, ua[this.pkf]]);
|
|
270
|
+
this.whrK = this.pkf;
|
|
271
|
+
this.whrV = ua[this.pkf];
|
|
272
|
+
}
|
|
273
|
+
else if (ua && c.trim() == 'subform' && a.form_field != "out_mapping") {
|
|
274
|
+
this.spinnerService.show();
|
|
275
|
+
this.formFilds = [];
|
|
276
|
+
this.curl = a.lov_qry;
|
|
277
|
+
this.router.navigate([a.lov_qry.trim(), this.pkf, ua[this.pkf]]);
|
|
278
|
+
this.whrK = this.pkf;
|
|
279
|
+
this.whrV = ua[this.pkf];
|
|
280
|
+
}
|
|
281
|
+
else if (ua && c.trim() == 'delete') {
|
|
282
|
+
document.getElementById('deletebtn').click();
|
|
283
|
+
this.pid = ua[this.pkf];
|
|
284
|
+
this.paraObj['formNme'] = this.route.snapshot.params['frmnme'];
|
|
285
|
+
}
|
|
286
|
+
else if (c.trim() == 'popup') {
|
|
287
|
+
debugger;
|
|
288
|
+
document.getElementById('popdatamdbtn').click();
|
|
289
|
+
this.paraObj['formNme'] = a.lov_qry.split('/')[2];
|
|
290
|
+
this.whrK = this.pkf;
|
|
291
|
+
this.whrV = ua[this.pkf];
|
|
292
|
+
this.getFormFieldsPopup();
|
|
293
|
+
this.pid = ua[this.pkf];
|
|
294
|
+
this.btnName = 'Add';
|
|
295
|
+
}
|
|
296
|
+
else if (c.trim() == 'defination') {
|
|
297
|
+
console.log(a.lov_qry.trim(), ua[this.pkf]);
|
|
298
|
+
this.router.navigate([a.lov_qry.trim(), ua[this.pkf]]);
|
|
299
|
+
}
|
|
300
|
+
else if (c.trim() == 'subform' && a.form_field == "out_mapping") {
|
|
301
|
+
this.loadProductMasterMapping(ua['attr_idn']);
|
|
302
|
+
this.attMapModelTitle = ua.display;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
loadProductMasterMapping(attrIdn) {
|
|
306
|
+
this.productMasAttrId = attrIdn;
|
|
307
|
+
this.spinnerService.show();
|
|
308
|
+
let obj = {};
|
|
309
|
+
obj['formNme'] = 'fileUpload';
|
|
310
|
+
obj['attr_idn'] = attrIdn;
|
|
311
|
+
this.header['method'] = 'loadPrdMasterMapping';
|
|
312
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
313
|
+
this.ss.Save(obj, options, 'fileUpload/load').then((response) => {
|
|
314
|
+
if (response.status == 'SUCCESS') {
|
|
315
|
+
console.log(response);
|
|
316
|
+
let result = response.result;
|
|
317
|
+
this.attrDtl = result.attrDtl;
|
|
318
|
+
this.attrMappingDtl = result.attrMappingDtl;
|
|
319
|
+
document.getElementById('productMapMasMDbtn').click();
|
|
320
|
+
this.spinnerService.hide();
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
this.spinnerService.hide();
|
|
324
|
+
this.toastr.error(response.message);
|
|
325
|
+
}
|
|
326
|
+
}).catch((err) => {
|
|
327
|
+
this.spinnerService.hide();
|
|
328
|
+
this.toastr.error(err.message);
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
saveProductMasterMapping() {
|
|
332
|
+
this.spinnerService.show();
|
|
333
|
+
let obj = {};
|
|
334
|
+
obj['formNme'] = 'fileUpload';
|
|
335
|
+
obj['attr_idn'] = this.productMasAttrId;
|
|
336
|
+
obj['attrDtlMap'] = this.attrMappingDtl;
|
|
337
|
+
this.header['method'] = 'updateProductAttr';
|
|
338
|
+
console.log(JSON.stringify(obj));
|
|
339
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
340
|
+
this.ss.Save(obj, options, 'fileUpload/load').then((response) => {
|
|
341
|
+
if (response.status == 'SUCCESS') {
|
|
342
|
+
console.log(response);
|
|
343
|
+
this.toastr.success(response.message);
|
|
344
|
+
this.spinnerService.hide();
|
|
345
|
+
this.productMapclsbtn.nativeElement.click();
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
this.spinnerService.hide();
|
|
349
|
+
this.toastr.error(response.message);
|
|
350
|
+
}
|
|
351
|
+
}).catch((err) => {
|
|
352
|
+
this.spinnerService.hide();
|
|
353
|
+
this.toastr.error(err.message);
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
//side nevigation
|
|
357
|
+
navigationFun(nav, i) {
|
|
358
|
+
this.cLink = i;
|
|
359
|
+
this.whrK = nav.column_key.trim();
|
|
360
|
+
this.whrV = nav.form_field.trim();
|
|
361
|
+
this.navform = nav.lov_qry.trim();
|
|
362
|
+
if (this.subFrmWv == '') {
|
|
363
|
+
this.subFrmWk = null;
|
|
364
|
+
this.subFrmWv = null;
|
|
365
|
+
}
|
|
366
|
+
if (this.navform != '') {
|
|
367
|
+
if (this.navform == 'addtionalDtlMaster') {
|
|
368
|
+
this.addFrmNme = this.navform;
|
|
369
|
+
this.getNameAttr(this.addFrmNme);
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
this.paraObj['formNme'] = this.navform;
|
|
373
|
+
this.getPageDefination();
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
else {
|
|
377
|
+
this.getPageDefination();
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
//load edit table data with default value
|
|
381
|
+
getEditData(pid) {
|
|
382
|
+
this.spinnerService.show();
|
|
383
|
+
this.formFilds = [];
|
|
384
|
+
let reqObj = {};
|
|
385
|
+
var pageTP = this.pageInfo.page_typ;
|
|
386
|
+
reqObj['formNme'] = this.pageInfo.form_nme;
|
|
387
|
+
reqObj['primaryKey'] = this.pageInfo.primary_key_field;
|
|
388
|
+
reqObj['pageTyp'] = this.pageInfo.page_typ;
|
|
389
|
+
reqObj['secondKeyField'] = this.pageInfo.second_key_field;
|
|
390
|
+
if (this.tbCell != null) {
|
|
391
|
+
reqObj['inLineEditColumn'] = this.tbCell;
|
|
392
|
+
}
|
|
393
|
+
reqObj['primaryId'] = pid;
|
|
394
|
+
if (pageTP == 'jsonForm') {
|
|
395
|
+
reqObj['whereKeys'] = this.pageInfo.where_clause;
|
|
396
|
+
reqObj['whereVlus'] = this.whereMap[this.pageInfo.where_clause];
|
|
397
|
+
}
|
|
398
|
+
console.log(JSON.stringify(reqObj));
|
|
399
|
+
this.header['method'] = 'loadAddEdit';
|
|
400
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
401
|
+
this.ss.getEditD(reqObj, options).then((response) => {
|
|
402
|
+
console.log(response);
|
|
403
|
+
if (response.status == 'SUCCESS' && response.message != 'SUCCESS') {
|
|
404
|
+
this.spinnerService.hide();
|
|
405
|
+
this.toastr.error(response.message);
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
;
|
|
409
|
+
if (response.status == 'SUCCESS') {
|
|
410
|
+
this.spinnerService.hide();
|
|
411
|
+
if (this.tbCell != null) {
|
|
412
|
+
document.getElementById('datamdbtn').click();
|
|
413
|
+
}
|
|
414
|
+
this.formFilds = response.formFields;
|
|
415
|
+
this.formFilds.forEach(element => {
|
|
416
|
+
if (element.form_field_typ == 'tb') {
|
|
417
|
+
this.getLovList(element.form_field, element.page_item_idn);
|
|
418
|
+
}
|
|
419
|
+
if (element.form_field_typ == 's') {
|
|
420
|
+
this.getLovList(element.form_field, element.page_item_idn);
|
|
421
|
+
}
|
|
422
|
+
if (element.form_field_typ == 'hd') {
|
|
423
|
+
element.default_value = this.whereMap[element.form_field];
|
|
424
|
+
}
|
|
425
|
+
if (element.form_field_typ == 'sq') {
|
|
426
|
+
this.getSequence(element);
|
|
427
|
+
}
|
|
428
|
+
if (element.dta_typ == 'sa') {
|
|
429
|
+
this.getLovList(element.form_field, element.page_item_idn);
|
|
430
|
+
}
|
|
431
|
+
});
|
|
432
|
+
this.spinnerService.hide();
|
|
433
|
+
}
|
|
434
|
+
else {
|
|
435
|
+
this.spinnerService.hide();
|
|
436
|
+
this.toastr.error(response.message);
|
|
437
|
+
}
|
|
438
|
+
}).catch((err) => {
|
|
439
|
+
this.spinnerService.hide();
|
|
440
|
+
this.toastr.error(err.message);
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
getSequence(element) {
|
|
444
|
+
let reqObj = {};
|
|
445
|
+
reqObj['seq'] = element.lov_qry;
|
|
446
|
+
this.header['method'] = 'getSeq';
|
|
447
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
448
|
+
this.ss.getData(reqObj, options).then((response) => {
|
|
449
|
+
if (response.status == 'SUCCESS') {
|
|
450
|
+
var seq = response.seq;
|
|
451
|
+
element.default_value = seq;
|
|
452
|
+
}
|
|
453
|
+
else {
|
|
454
|
+
this.toastr.error(response.message);
|
|
455
|
+
}
|
|
456
|
+
}).catch((err) => {
|
|
457
|
+
this.toastr.error(err.message);
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
//load lov data by passing query to it
|
|
461
|
+
getLovList(tblF, page_item_idn) {
|
|
462
|
+
let reqObj = {};
|
|
463
|
+
reqObj['page_item_idn'] = page_item_idn;
|
|
464
|
+
this.header['method'] = 'getDataByItemIdn';
|
|
465
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
466
|
+
this.ss.getData(reqObj, options).then((response) => {
|
|
467
|
+
if (response.status == 'SUCCESS') {
|
|
468
|
+
debugger;
|
|
469
|
+
this.lovs = response.kv.map(option => ({
|
|
470
|
+
value: option.k,
|
|
471
|
+
label: option.v
|
|
472
|
+
}));
|
|
473
|
+
this.sqlArray[tblF] = this.lovs;
|
|
474
|
+
// console.log(tblF, sql, this.lovs);
|
|
475
|
+
// console.log(this.sqlArray[tblF])
|
|
476
|
+
}
|
|
477
|
+
else {
|
|
478
|
+
this.toastr.error(response.message);
|
|
479
|
+
}
|
|
480
|
+
}).catch((err) => {
|
|
481
|
+
this.toastr.error(err.message);
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
//delete speficefic data list
|
|
485
|
+
deleteDataList() {
|
|
486
|
+
this.spinnerService.show();
|
|
487
|
+
let reqObj = {};
|
|
488
|
+
reqObj['formNme'] = this.pageInfo.form_nme;
|
|
489
|
+
reqObj['pageTyp'] = this.pageInfo.page_typ;
|
|
490
|
+
reqObj['primaryKey'] = this.pageInfo.primary_key_field;
|
|
491
|
+
reqObj['primaryId'] = this.pid;
|
|
492
|
+
reqObj['tableName'] = this.pageInfo.table_name;
|
|
493
|
+
reqObj['trnsType'] = 'DELETE';
|
|
494
|
+
this.header['method'] = 'save';
|
|
495
|
+
console.log(JSON.stringify(reqObj));
|
|
496
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
497
|
+
this.ss.deleteData(reqObj, options).then((response) => {
|
|
498
|
+
if (response.status == 'SUCCESS') {
|
|
499
|
+
this.getPageDefination();
|
|
500
|
+
this.deleteclsbtn.nativeElement.click();
|
|
501
|
+
this.spinnerService.hide();
|
|
502
|
+
}
|
|
503
|
+
else {
|
|
504
|
+
this.spinnerService.hide();
|
|
505
|
+
this.toastr.error(response.message);
|
|
506
|
+
}
|
|
507
|
+
}).catch((err) => {
|
|
508
|
+
this.spinnerService.hide();
|
|
509
|
+
this.toastr.error(err.message);
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
//dyanamic funcation
|
|
513
|
+
chkFun(fl, fData) {
|
|
514
|
+
if (fl.validations == '' || fl.validations == null) {
|
|
515
|
+
return;
|
|
516
|
+
}
|
|
517
|
+
else {
|
|
518
|
+
if (fl.validations == 'validateQuery') {
|
|
519
|
+
this.validateQuery(fl, fData);
|
|
520
|
+
}
|
|
521
|
+
else if (fl.validations == 'isUnique') {
|
|
522
|
+
this.isUnique(fl, fData);
|
|
523
|
+
}
|
|
524
|
+
else if (fl.validations == 'setnameprint') {
|
|
525
|
+
this.setnameprint(fl, fData);
|
|
526
|
+
}
|
|
527
|
+
else if (fl.validations == 'setfactor') {
|
|
528
|
+
this.setfactor(fl, fData);
|
|
529
|
+
}
|
|
530
|
+
else if (fl.form_field_typ == 's') {
|
|
531
|
+
if (fl.validations == null) {
|
|
532
|
+
return;
|
|
533
|
+
}
|
|
534
|
+
let sq = fl.validations.replace(/#QVAL/g, fData);
|
|
535
|
+
// this.getLovList(fl.column_key, sq);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
//on submit action checks validation
|
|
540
|
+
onSubmit(formVal, btn) {
|
|
541
|
+
debugger;
|
|
542
|
+
var t = Object.keys(formVal.form.controls).forEach(field => {
|
|
543
|
+
debugger;
|
|
544
|
+
const control = formVal.form.get(field);
|
|
545
|
+
control.markAsTouched({ onlySelf: true });
|
|
546
|
+
});
|
|
547
|
+
if (formVal.form.valid == true) {
|
|
548
|
+
this.addedit(formVal.value, btn);
|
|
549
|
+
// this.lower(formVal.value);
|
|
550
|
+
}
|
|
551
|
+
else {
|
|
552
|
+
return;
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
setnameprint(fl, fData) {
|
|
556
|
+
debugger;
|
|
557
|
+
let nmeIdn = fData;
|
|
558
|
+
let list = this.sqlArray[fl.form_field] || [];
|
|
559
|
+
let nmwDtl = list.find(x => x.value == nmeIdn) || '';
|
|
560
|
+
if (nmwDtl != '') {
|
|
561
|
+
this.formFilds.forEach(element => {
|
|
562
|
+
if (element.form_field == 'nme')
|
|
563
|
+
element.default_value = nmwDtl.label;
|
|
564
|
+
if (element.form_field == 'print_nme')
|
|
565
|
+
element.default_value = nmwDtl.label;
|
|
566
|
+
});
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
setfactor(fl, fData) {
|
|
570
|
+
let fctr = -1;
|
|
571
|
+
if (fData == 'income' || fData == 'assets')
|
|
572
|
+
fctr = 1;
|
|
573
|
+
this.formFilds.forEach(element => {
|
|
574
|
+
if (element.form_field == 'fctr')
|
|
575
|
+
element.default_value = fctr;
|
|
576
|
+
});
|
|
577
|
+
}
|
|
578
|
+
onPopupSubmit(formVal, btn) {
|
|
579
|
+
debugger;
|
|
580
|
+
var t = Object.keys(formVal.form.controls).forEach(field => {
|
|
581
|
+
const control = formVal.form.get(field);
|
|
582
|
+
control.markAsTouched({ onlySelf: true });
|
|
583
|
+
});
|
|
584
|
+
if (formVal.form.valid == true) {
|
|
585
|
+
debugger;
|
|
586
|
+
this.addPopupFrm(formVal.value, btn);
|
|
587
|
+
}
|
|
588
|
+
else {
|
|
589
|
+
return;
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
lower(v) {
|
|
593
|
+
var key, keys = Object.keys(v);
|
|
594
|
+
var n = keys.length;
|
|
595
|
+
var newobj = {};
|
|
596
|
+
while (n--) {
|
|
597
|
+
key = keys[n];
|
|
598
|
+
newobj[key] = typeof v[key] == "string" ? v[key].toLowerCase() : v[key];
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
//submit data
|
|
602
|
+
addedit(v, btn) {
|
|
603
|
+
this.spinnerService.show();
|
|
604
|
+
let reqObj = {};
|
|
605
|
+
var pageTP = this.pageInfo.page_typ.trim();
|
|
606
|
+
reqObj['formNme'] = this.pageInfo.form_nme;
|
|
607
|
+
reqObj['primaryKey'] = this.pageInfo.primary_key_field;
|
|
608
|
+
reqObj['pageTyp'] = this.pageInfo.page_typ;
|
|
609
|
+
reqObj['secondKeyField'] = this.pageInfo.second_key_field;
|
|
610
|
+
reqObj['primaryId'] = this.btnName == 'Add' ? '' : "" + this.pid;
|
|
611
|
+
reqObj['tableName'] = this.pageInfo.table_name;
|
|
612
|
+
reqObj['trnsType'] = this.btnName == 'Add' ? 'ADD' : 'EDIT';
|
|
613
|
+
reqObj['dataTrnsDtl'] = v;
|
|
614
|
+
if (pageTP == 'jsonForm') {
|
|
615
|
+
reqObj['whereKeys'] = this.pageInfo.where_clause;
|
|
616
|
+
reqObj['whereVlus'] = this.whereMap[this.pageInfo.where_clause];
|
|
617
|
+
}
|
|
618
|
+
console.log(JSON.stringify(reqObj));
|
|
619
|
+
this.header['method'] = 'save';
|
|
620
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
621
|
+
console.log(JSON.stringify(this.header));
|
|
622
|
+
this.ss.addData(reqObj, options).then((response) => {
|
|
623
|
+
console.log(response);
|
|
624
|
+
if (response.status == 'SUCCESS') {
|
|
625
|
+
btn.disabled = false;
|
|
626
|
+
debugger;
|
|
627
|
+
if (this.action == 'newcontact') {
|
|
628
|
+
this.router.navigate(['/contact/master/nameMaster/nme_idn/' + response._id]);
|
|
629
|
+
}
|
|
630
|
+
else if (this.action == 'newacccontact') {
|
|
631
|
+
this.router.navigate(['/accounts/contact/master/accNameMaster/nme_idn/' + response._id]);
|
|
632
|
+
}
|
|
633
|
+
else if (this.action == 'newledger') {
|
|
634
|
+
this.router.navigate(['/accounts/admin/master/ledgerMaster/ledger_idn/' + response._id]);
|
|
635
|
+
}
|
|
636
|
+
else {
|
|
637
|
+
this.tbCell = null;
|
|
638
|
+
this.searchF = null;
|
|
639
|
+
this.closebtn.nativeElement.click();
|
|
640
|
+
if (this.addNew.lov_qry == null || this.addNew.lov_qry == "") {
|
|
641
|
+
if (this.currstat == "popup") {
|
|
642
|
+
// this.setSysSetup(this.coidn);
|
|
643
|
+
}
|
|
644
|
+
else {
|
|
645
|
+
this.getPageDefination();
|
|
646
|
+
this.spinnerService.hide();
|
|
647
|
+
this.toastr.success(response.message);
|
|
648
|
+
}
|
|
649
|
+
return;
|
|
650
|
+
}
|
|
651
|
+
else {
|
|
652
|
+
this.router.navigate([this.addNew.lov_qry, response._id]);
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
else {
|
|
657
|
+
btn.disabled = false;
|
|
658
|
+
this.tbCell = null;
|
|
659
|
+
this.spinnerService.hide();
|
|
660
|
+
this.toastr.error(response.message);
|
|
661
|
+
}
|
|
662
|
+
}).catch((err) => {
|
|
663
|
+
btn.disabled = false;
|
|
664
|
+
this.tbCell = null;
|
|
665
|
+
this.spinnerService.hide();
|
|
666
|
+
this.toastr.error(err.message);
|
|
667
|
+
});
|
|
668
|
+
}
|
|
669
|
+
addPopupFrm(v, btn) {
|
|
670
|
+
this.spinnerService.show();
|
|
671
|
+
debugger;
|
|
672
|
+
let reqObj = {};
|
|
673
|
+
var pageTP = this.popuppageInfo.page_typ.trim();
|
|
674
|
+
reqObj['formNme'] = this.popuppageInfo.form_nme;
|
|
675
|
+
reqObj['primaryKey'] = this.popuppageInfo.primary_key_field;
|
|
676
|
+
reqObj['pageTyp'] = this.popuppageInfo.page_typ;
|
|
677
|
+
reqObj['secondKeyField'] = this.popuppageInfo.second_key_field;
|
|
678
|
+
reqObj['primaryId'] = ''; //this.btnName == 'Add' ? '' : "" + this.pid;
|
|
679
|
+
reqObj['tableName'] = this.popuppageInfo.table_name;
|
|
680
|
+
reqObj['trnsType'] = 'ADD';
|
|
681
|
+
reqObj['dataTrnsDtl'] = v;
|
|
682
|
+
console.log("add", JSON.stringify(reqObj));
|
|
683
|
+
this.header['method'] = 'save';
|
|
684
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
685
|
+
this.ss.addData(reqObj, options).then((response) => {
|
|
686
|
+
if (response.status == 'SUCCESS') {
|
|
687
|
+
btn.disabled = false;
|
|
688
|
+
this.spinnerService.hide();
|
|
689
|
+
debugger;
|
|
690
|
+
this.setSysSetup(this.pid);
|
|
691
|
+
this.popclosebtn.nativeElement.click();
|
|
692
|
+
}
|
|
693
|
+
else {
|
|
694
|
+
btn.disabled = false;
|
|
695
|
+
this.spinnerService.hide();
|
|
696
|
+
this.toastr.error(response.message);
|
|
697
|
+
}
|
|
698
|
+
}).catch((err) => {
|
|
699
|
+
btn.disabled = false;
|
|
700
|
+
this.spinnerService.hide();
|
|
701
|
+
this.toastr.error(err.message);
|
|
702
|
+
});
|
|
703
|
+
}
|
|
704
|
+
setSysSetup(coIdn) {
|
|
705
|
+
debugger;
|
|
706
|
+
let reqObj = {};
|
|
707
|
+
reqObj['coIdn'] = coIdn;
|
|
708
|
+
this.header['method'] = 'clientSetup';
|
|
709
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
710
|
+
this.ss.validate(reqObj, options, 'system/setup').then((response) => {
|
|
711
|
+
if (response.status == 'SUCCESS') {
|
|
712
|
+
document.getElementById('popResmodalbtn').click();
|
|
713
|
+
this.Sysresult = response.result;
|
|
714
|
+
}
|
|
715
|
+
}).catch((err) => {
|
|
716
|
+
this.spinnerService.hide();
|
|
717
|
+
this.toastr.error(err.message);
|
|
718
|
+
});
|
|
719
|
+
}
|
|
720
|
+
//validate query
|
|
721
|
+
validateQuery(tblObj, f) {
|
|
722
|
+
if (f == '' || f == null)
|
|
723
|
+
return;
|
|
724
|
+
let reqObj = {};
|
|
725
|
+
reqObj['sql'] = f;
|
|
726
|
+
this.header['method'] = 'validateQuery';
|
|
727
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
728
|
+
console.log(JSON.stringify(reqObj));
|
|
729
|
+
this.ss.validate(reqObj, options, 'system/apppages').then((response) => {
|
|
730
|
+
if (response.status == 'SUCCESS') {
|
|
731
|
+
this.onErr = '';
|
|
732
|
+
}
|
|
733
|
+
else {
|
|
734
|
+
this.spinnerService.hide();
|
|
735
|
+
this.onErr = tblObj.form_field;
|
|
736
|
+
this.toastr.error(response.message);
|
|
737
|
+
}
|
|
738
|
+
}).catch((err) => {
|
|
739
|
+
this.spinnerService.hide();
|
|
740
|
+
this.toastr.error(err.message);
|
|
741
|
+
});
|
|
742
|
+
}
|
|
743
|
+
//validate this field value is unique
|
|
744
|
+
isUnique(dtaObj, inpuVal) {
|
|
745
|
+
if (inpuVal == '' || inpuVal == null)
|
|
746
|
+
return;
|
|
747
|
+
let reqObj = {};
|
|
748
|
+
reqObj['tableName'] = this.pageInfo.table_name;
|
|
749
|
+
reqObj['whereKeys'] = dtaObj.form_field;
|
|
750
|
+
reqObj['whereVlus'] = inpuVal;
|
|
751
|
+
reqObj['primaryKey'] = this.pageInfo.primary_key_field;
|
|
752
|
+
reqObj['primaryId'] = this.btnName == 'Add' ? '' : this.pid;
|
|
753
|
+
this.header['method'] = 'uniqueConQ';
|
|
754
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
755
|
+
this.ss.validate(reqObj, options, 'system/apppages').then((response) => {
|
|
756
|
+
if (response.status == 'SUCCESS') {
|
|
757
|
+
this.onErr = '';
|
|
758
|
+
}
|
|
759
|
+
else {
|
|
760
|
+
this.spinnerService.hide();
|
|
761
|
+
this.onErr = dtaObj.form_field;
|
|
762
|
+
this.toastr.error(response.message);
|
|
763
|
+
}
|
|
764
|
+
}).catch((err) => {
|
|
765
|
+
this.spinnerService.hide();
|
|
766
|
+
this.toastr.error(err.message);
|
|
767
|
+
});
|
|
768
|
+
}
|
|
769
|
+
onPageSizeChange(p) {
|
|
770
|
+
if (p == 'All') {
|
|
771
|
+
this.pageSize = this.datalist.length;
|
|
772
|
+
}
|
|
773
|
+
else {
|
|
774
|
+
this.pageSize = p;
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
//sorting
|
|
778
|
+
setOrder(value, i) {
|
|
779
|
+
this.showarr = i;
|
|
780
|
+
if (this.order === value) {
|
|
781
|
+
this.reverse = !this.reverse;
|
|
782
|
+
}
|
|
783
|
+
this.order = value;
|
|
784
|
+
}
|
|
785
|
+
//edit cell open model
|
|
786
|
+
editCell(d, tbh) {
|
|
787
|
+
this.glbObj = d;
|
|
788
|
+
this.tbCell = tbh;
|
|
789
|
+
this.title = d.title;
|
|
790
|
+
this.btnName = 'Edit';
|
|
791
|
+
this.pid = d[this.pkf];
|
|
792
|
+
this.getEditData(d[this.pkf]);
|
|
793
|
+
}
|
|
794
|
+
//load nme attr data
|
|
795
|
+
getNameAttr(frmnme) {
|
|
796
|
+
let reqObj = {};
|
|
797
|
+
let custObj = {};
|
|
798
|
+
reqObj['formNme'] = frmnme;
|
|
799
|
+
reqObj['nmeIdn'] = this.whrV;
|
|
800
|
+
this.header['method'] = 'loadNmeAttr';
|
|
801
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
802
|
+
this.ss.validate(reqObj, options, 'system/apppages').then((response) => {
|
|
803
|
+
if (response.status == 'SUCCESS') {
|
|
804
|
+
this.uiGrpList = response.uiGrpList;
|
|
805
|
+
this.uiGrpListDtl = response.uiGrpListDtl;
|
|
806
|
+
this.dataDtl = response.dataDtl;
|
|
807
|
+
}
|
|
808
|
+
else {
|
|
809
|
+
this.spinnerService.hide();
|
|
810
|
+
this.toastr.error(response.message);
|
|
811
|
+
}
|
|
812
|
+
}).catch((err) => {
|
|
813
|
+
this.spinnerService.hide();
|
|
814
|
+
this.toastr.error(err.message);
|
|
815
|
+
});
|
|
816
|
+
}
|
|
817
|
+
//save nme data
|
|
818
|
+
saveFun(k, v) {
|
|
819
|
+
this.spinnerService.show();
|
|
820
|
+
let reqObj = {};
|
|
821
|
+
let subObj = {};
|
|
822
|
+
subObj[k] = v;
|
|
823
|
+
reqObj['formNme'] = this.addFrmNme;
|
|
824
|
+
reqObj['nmeIdn'] = this.whrV;
|
|
825
|
+
reqObj['dataTrnsDtl'] = subObj;
|
|
826
|
+
this.header['method'] = 'saveNmeAttr';
|
|
827
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
828
|
+
this.ss.addData(reqObj, options).then((response) => {
|
|
829
|
+
if (response.status == 'SUCCESS') {
|
|
830
|
+
this.spinnerService.hide();
|
|
831
|
+
this.toastr.success(response.message);
|
|
832
|
+
}
|
|
833
|
+
else {
|
|
834
|
+
this.spinnerService.hide();
|
|
835
|
+
this.toastr.error(response.message);
|
|
836
|
+
}
|
|
837
|
+
}).catch((err) => {
|
|
838
|
+
this.spinnerService.hide();
|
|
839
|
+
this.toastr.error(err.message);
|
|
840
|
+
});
|
|
841
|
+
}
|
|
842
|
+
loadSuggdata(str, page_item_idn, form_field) {
|
|
843
|
+
if (str == undefined || str == '' || str.length < 3)
|
|
844
|
+
return;
|
|
845
|
+
let reqObj = {};
|
|
846
|
+
reqObj["formNme"] = this.route.snapshot.params["frmnme"] || 'loadSuggestionData';
|
|
847
|
+
reqObj['page_item_idn'] = page_item_idn;
|
|
848
|
+
reqObj['likeStr'] = str;
|
|
849
|
+
this.header['method'] = 'loadSuggestionDataByItemIdn';
|
|
850
|
+
console.log(this.header);
|
|
851
|
+
let options = ({ headers: new HttpHeaders(this.header) });
|
|
852
|
+
console.log(JSON.stringify(reqObj));
|
|
853
|
+
// console.log(this.header);
|
|
854
|
+
this.cs.load(reqObj, options, "contact/registerData").then((response) => {
|
|
855
|
+
console.log(response);
|
|
856
|
+
let result = response.result;
|
|
857
|
+
let suggestionData = result.suggestionData || [];
|
|
858
|
+
let list = suggestionData.map(option => ({
|
|
859
|
+
value: option.k,
|
|
860
|
+
label: option.v
|
|
861
|
+
}));
|
|
862
|
+
this.sqlArray[form_field] = list;
|
|
863
|
+
});
|
|
864
|
+
}
|
|
865
|
+
// fl = "select table_catalog||' '||table_name k , table_name v from information_schema.tables where table_schema = 'public' and table_type = 'BASE TABLE' and table_name like '#INPUT%' and table_name=COALESCE(null,table_name) order by 1;"
|
|
866
|
+
// suggestData:any = [];
|
|
867
|
+
// getSuggetion(scT) {
|
|
868
|
+
// if (scT == '' || scT == null) return;
|
|
869
|
+
// let sq = this.fl.replace(/#INPUT/g, scT);
|
|
870
|
+
// let reqObj = {};
|
|
871
|
+
// reqObj['sql'] = sq;
|
|
872
|
+
// this.header['method'] = 'getData';
|
|
873
|
+
// let options = ({ headers: new HttpHeaders(this.header) });
|
|
874
|
+
// this.ss.validate(reqObj, options).then((response: any) => {
|
|
875
|
+
// if (response.status == 'SUCCESS') {
|
|
876
|
+
// this.suggestData = response.kv;
|
|
877
|
+
// } else {
|
|
878
|
+
// this.spinnerService.hide();
|
|
879
|
+
// this.toastr.error(response.message)
|
|
880
|
+
// }
|
|
881
|
+
// }).catch((err: any) => {
|
|
882
|
+
// this.spinnerService.hide();
|
|
883
|
+
// this.toastr.error(err.message)
|
|
884
|
+
// });
|
|
885
|
+
// }
|
|
886
|
+
// na(){
|
|
887
|
+
// this.input.nativeElement.focus();
|
|
888
|
+
// this.suggestData = [];
|
|
889
|
+
// }
|
|
890
|
+
//hide show password field text
|
|
891
|
+
showHIdePass() {
|
|
892
|
+
this.estst = !this.estst;
|
|
893
|
+
if (this.estst) {
|
|
894
|
+
this.eveC = 'fa-eye';
|
|
895
|
+
this.inputtype = 'text';
|
|
896
|
+
}
|
|
897
|
+
else {
|
|
898
|
+
this.eveC = 'fa-eye-slash';
|
|
899
|
+
this.inputtype = 'password';
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
ngOnInit() {
|
|
903
|
+
//globle header parameter
|
|
904
|
+
let mdlk = JSON.parse(localStorage.getItem('mdlKey'));
|
|
905
|
+
let mdlKey = Object.keys(mdlk);
|
|
906
|
+
this.cUrl = this.router.url;
|
|
907
|
+
this.header = {
|
|
908
|
+
'clientkey': Cookie.get('_ck'),
|
|
909
|
+
'Content-Type': 'application/json',
|
|
910
|
+
'modulekey': mdlk[this.cUrl.split('/')[1]],
|
|
911
|
+
'loginid': Cookie.get('_logid'),
|
|
912
|
+
'source': 'qs'
|
|
913
|
+
};
|
|
914
|
+
let companyDtl = JSON.parse(Cookie.get('_accCompany')) || {};
|
|
915
|
+
let yearDtl = JSON.parse(Cookie.get('_accyear')) || {};
|
|
916
|
+
let sub_co_idn = (companyDtl["sub_co_idn"] || '').toString();
|
|
917
|
+
let fin_year_idn = (yearDtl["fin_year_idn"] || '').toString();
|
|
918
|
+
if (sub_co_idn != '') {
|
|
919
|
+
this.header['subcomidn'] = sub_co_idn;
|
|
920
|
+
this.header['yearidn'] = fin_year_idn;
|
|
921
|
+
}
|
|
922
|
+
//on form name change
|
|
923
|
+
this.route.params.subscribe((params) => {
|
|
924
|
+
this.subFrmWk = null;
|
|
925
|
+
this.whrK = "1";
|
|
926
|
+
this.whrV = "1";
|
|
927
|
+
this.paraObj['formNme'] = params['frmnme'];
|
|
928
|
+
this.searchF = null;
|
|
929
|
+
this.getPageDefination();
|
|
930
|
+
this.cLink = 0;
|
|
931
|
+
this.p = 1;
|
|
932
|
+
});
|
|
933
|
+
}
|
|
934
|
+
}
|
|
935
|
+
/** @nocollapse */ /** @nocollapse */ SystemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SystemComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.ToastrService }, { token: i3.SystemServiceService }, { token: i4.NgxSpinnerService }, { token: i5.CommanServiceService }], target: i0.ɵɵFactoryTarget.Component });
|
|
936
|
+
/** @nocollapse */ /** @nocollapse */ SystemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: SystemComponent, selector: "app-system", viewQueries: [{ propertyName: "closebtn", first: true, predicate: ["closebtn"], descendants: true }, { propertyName: "deleteclsbtn", first: true, predicate: ["deleteclsbtn"], descendants: true }, { propertyName: "input", first: true, predicate: ["inputs"], descendants: true }, { propertyName: "popclosebtn", first: true, predicate: ["popclosebtn"], descendants: true }, { propertyName: "submitbtn", first: true, predicate: ["submitBtn"], descendants: true }, { propertyName: "productMapclsbtn", first: true, predicate: ["productMapclsbtn"], descendants: true }], ngImport: i0, template: "<div class=\"mt\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-heading\">\r\n <h3 class=\"panel-title\">{{pageInfo?.title}}\r\n <span class=\"f-12\">({{cDt | date:'medium'}})</span>\r\n </h3>\r\n <button type=\"button\" id=\"addBtn\" class=\"btn btn-info pull-right\" *ngIf=\"addNew?.is_compulsory == 1\"\r\n (click)=\"userAction(data, 'add', '');f.reset();\">{{addNew?.form_field_title}}</button>\r\n\r\n\r\n </div>\r\n </div>\r\n <div class=\"row\" *ngIf=\"router.url != curl\">\r\n <div class=\"col-md-2\" *ngIf=\"navigation.length > 0\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-body\">\r\n <div class=\"list-group border-bottom\">\r\n <a href=\"javascript:void(0)\" class=\"list-group-item\" [ngClass]=\"{'active' :i == cLink}\"\r\n *ngFor=\"let nav of navigation;let i=index\"\r\n (click)=\"navigationFun(nav,i);\">{{nav.form_field_title}} </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"navigation.length > 0 ? 'col-md-10' : 'col-md-12'\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-body\">\r\n <!-- <div class=\"row\">\r\n <div class=\"col-sm-8\"></div>\r\n <div class=\"col-sm-4\">\r\n <form class=\"form-inline pull-right\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName2\">Search </label>\r\n <input type=\"text\" class=\"form-control\" id=\"exampleInputName2\" name=\"schtxt\" [(ngModel)]=\"searchF\" />\r\n </div>\r\n </form>\r\n </div>\r\n </div> -->\r\n <div class=\"row\">\r\n <div class=\"col-sm-6\">\r\n <form class=\"form-inline pull-left\">\r\n <div class=\"form-group\">\r\n <label for=\"ddlPagesize\">Page Size </label>\r\n <select class=\"form-control\" name=\"pageSize\" [(ngModel)]=\"pageSize\"\r\n (change)=\"onPageSizeChange(pageSize)\">\r\n <option value=\"All\">All</option>\r\n <option value=\"10\">10</option>\r\n <option value=\"25\">25</option>\r\n <option value=\"50\">50</option>\r\n <option value=\"100\">100</option>\r\n </select>\r\n </div>\r\n </form>\r\n <button class=\"btn btn-default\" style=\"padding: 4px 15px 4px 20px;margin-left: 10px;\"\r\n data-toggle=\"tooltip\" data-placement=\"right\" title=\"Refresh\" (click)=\"ngOnInit();\">\r\n <span class=\"fa fa-refresh\"></span>\r\n </button>\r\n <!-- <label>{{datalist.length}}</label> -->\r\n </div>\r\n <div class=\"col-sm-6\">\r\n <form class=\"form-inline pull-right\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName2\">Search </label>\r\n <input type=\"text\" class=\"form-control\" id=\"exampleInputName2\" name=\"schtxt\"\r\n [(ngModel)]=\"searchF\" />\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-bordered table-hover table-hover-cells\">\r\n <thead>\r\n <tr>\r\n <th>SR No</th>\r\n <th>Action</th>\r\n <th *ngFor=\"let tbh of tblH; let i = index \" (click)=\"setOrder(tbh,i)\">\r\n {{tblDesc[tbh]}}\r\n <span [hidden]=\"reverse\" *ngIf=\"showarr === i\">\r\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\r\n </span>\r\n <span [hidden]=\"!reverse\" *ngIf=\"showarr === i\">\r\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\r\n </span>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"let data of datalist | searchPipe:searchF | orderBy: order:reverse | paginate: { itemsPerPage: pageSize, currentPage: p }; let i = index;\">\r\n <td>{{i + 1}}</td>\r\n <td>\r\n <div class=\"btn-group\">\r\n <a href=\"#\" data-toggle=\"dropdown\"\r\n class=\"btn btn-info dropdown-toggle\">Action\r\n <span class=\"caret\"></span>\r\n </a>\r\n <ul class=\"dropdown-menu\" role=\"menu\">\r\n <li *ngFor=\"let action of actions\">\r\n <a href=\"javascript:void(0)\"\r\n (click)=\"userAction(data, action.form_field_typ, action);\">\r\n {{action.form_field_title}}\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </td>\r\n <td *ngFor=\"let tbh of tblH; let i=index\" on-mouseover=\"hoveredI=i\"\r\n on-mouseleave=\"hoveredI=-1\">\r\n {{data[tbh]}}\r\n <div class=\"onHoverDiv\" *ngIf=\"i==hoveredI\">\r\n <ul>\r\n <li (click)=\"editCell(data,tbh);\">\r\n <span class=\"fa fa-pencil\"></span>\r\n </li>\r\n </ul>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <pagination-controls (pageChange)=\"p = $event\" class=\"pull-right\"></pagination-controls>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal\" id=\"datamodal\" role=\"dialog\" aria-labelledby=\"defModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\">\r\n <form class=\"form-horizontal\" #f=\"ngForm\" name=\"appForm\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\" #closebtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"defModalHead\">{{btnName}} Record</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\" *ngFor=\"let fl of formFilds | orderByPipe: 'srt': 'asc'\">\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 't' && fl?.is_hidden == 0 && fl?.dta_typ =='c' || fl?.dta_typ =='t'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <!-- (change)=\"removeInvalid(fl)\" -->\r\n <input type=\"text\" class=\"form-control\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #textInput=\"ngModel\" (blur)=\"chkFun(fl,fl.default_value);\"\r\n [ngClass]=\"{'uniqErrMsg': fl?.form_field == onErr}\"\r\n [required]=\"fl?.is_compulsory == 1\" />\r\n </div>\r\n <!-- (blur)=\"this[fl?.validations](fl.default_value)\" -->\r\n <div *ngIf=\"textInput.invalid && (textInput.dirty || textInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"textInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n <!-- <div *ngIf=\"textInput.errors.minlength\">\r\n {{fl.form_field_title}} must be at least {{fl.form_field_min_length}} characters long.\r\n </div>\r\n <div *ngIf=\"textInput.errors.maxlength\">\r\n {{fl.form_field_title}} Maxmimum limit {{fl.form_field_max_length}} characters long.\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 't' && fl?.is_hidden == 0 && fl?.dta_typ =='n'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"number\" class=\"form-control\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #numberInput=\"ngModel\" [required]=\"fl?.is_compulsory == 1\">\r\n <!-- minlength={{fl?.form_field_min_length}} maxlength={{fl?.form_field_max_length}}/ -->\r\n </div>\r\n <div *ngIf=\"numberInput.invalid && (numberInput.dirty || numberInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"numberInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n <!-- <div *ngIf=\"numberInput.errors.minlength\">\r\n {{fl.form_field_title}} must be at least {{fl.form_field_min_length}} characters long.\r\n </div>\r\n <div *ngIf=\"numberInput.errors.maxlength\">\r\n {{fl.form_field_title}} Maxmimum limit {{fl.form_field_max_length}} characters long.\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 'pw' && fl?.is_hidden == 0 && fl?.dta_typ =='pw'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"{{inputtype}}\" class=\"form-control posrel\"\r\n name=\"{{fl?.form_field}}\" [value]=\"fl?.default_value\"\r\n [(ngModel)]=\"fl.default_value\" #passInput=\"ngModel\"\r\n [required]=\"fl?.is_compulsory == 1\" />\r\n <span class=\"fa {{eveC}} eye\" (click)=\"showHIdePass();\"></span>\r\n </div>\r\n <!-- (blur)=\"this[fl?.validations](fl.default_value)\" -->\r\n <div *ngIf=\"passInput.invalid && (passInput.dirty || passInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"passInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 't' && fl?.dta_typ =='a'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <tag-input [(ngModel)]=\"fl.default_value\" name=\"{{fl?.form_field}}\"\r\n [modelAsStrings]=\"true\" [allowDupes]=\"true\" [editable]='true'>\r\n </tag-input>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 't' && fl?.dta_typ =='sa'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <ng-select [options]=\"sqlArray[fl?.form_field]\" style=\"z-index:9;\"\r\n [(ngModel)]=\"fl.default_value\" #safield=\"ngModel\"\r\n [required]=\"fl?.is_compulsory == 1\" name=\"{{fl?.form_field}}\"\r\n [multiple]=\"true\" [allowClear]=\"true\">\r\n <ng-template #optionTemplate let-option=\"option\">\r\n <div class=\"famfamfam-flags {{option?.value}}\"></div>\r\n {{option?.label}}\r\n </ng-template>\r\n </ng-select>\r\n <!-- <ng-select [items]=\"sqlArray[fl?.form_field]\" [addTag]=\"addTag\" bindValue=\"k\" multiple=\"true\" bindLabel=\"v\" name=\"{{fl?.form_field}}\"\r\n [(ngModel)]=\"fl.default_value\" #safield=\"ngModel\" [required]=\"fl?.is_compulsory == 1\">\r\n </ng-select> -->\r\n </div>\r\n <div *ngIf=\"safield.invalid && (safield.dirty || safield.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"safield.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 'ta' && fl?.is_hidden == 0 && fl?.dta_typ =='c'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <textarea class=\"form-control\" rows=\"3\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #textArea=\"ngModel\" (blur)=\"chkFun(fl,fl.default_value);\"\r\n [ngClass]=\"{'uniqErrMsg': fl?.form_field == onErr}\"\r\n [required]=\"fl?.is_compulsory == 1\"></textarea>\r\n </div>\r\n <div *ngIf=\"textArea.invalid && (textArea.dirty || textArea.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"textArea.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 'hd' || fl?.form_field_typ == 'df' || fl?.form_field_typ == 'fk' && fl?.is_hidden == 0\"\r\n [ngClass]=\"{'mt0': fl?.form_field_typ == 'hd'}\">\r\n <label class=\"col-md-3 control-label\"></label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"hidden\" class=\"form-control\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #hdf=\"ngModel\" />\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'sq' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\"></label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"hidden\" class=\"form-control\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\" />\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'tb' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <!-- <div class=\"col-md-9\">\r\n <div class=\"btn-group\" data-toggle=\"buttons\">\r\n <label class=\"btn btn-default btn-on btn-xs\" *ngFor=\"let lov of sqlArray[fl.form_field];let i=index\">\r\n <input type=\"radio\" [value]=\"lov.k\" id=\"{{i}}\" name=\"{{fl?.form_field}}\" [value]=\"\" [(ngModel)]=\"fl.default_value\">{{lov.v}}</label>\r\n </div>\r\n </div> -->\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #tdf=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let dynamic of sqlArray[fl.form_field]\"\r\n value=\"{{dynamic.value}}\">\r\n {{dynamic.label}}</option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"tdf.invalid && (tdf.dirty || tdf.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"tdf.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'l' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #lInput=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let lov of fl.kv\" value=\"{{lov.k}}\">{{lov.v}}</option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"lInput.invalid && (lInput.dirty || lInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"lInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'ld' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #ldInput=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let dynamic of sqlArray[fl.form_field]\"\r\n value=\"{{dynamic.k}}\">{{dynamic.v}}\r\n </option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"ldInput.invalid && (ldInput.dirty || ldInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"ldInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 's' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n (change)=\"chkFun(fl,fl.default_value)\" id=\"{{fl.column_key}}\"\r\n #sfi=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let dynamic of sqlArray[fl.form_field]\"\r\n value=\"{{dynamic.value}}\">\r\n {{dynamic.label}}</option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"sfi.invalid && (sfi.dirty || sfi.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"sfi.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'sb'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-8\">\r\n <div class=\"input-group w-100\">\r\n <ng-select style=\"z-index: 5;\" [options]=\"sqlArray[fl.form_field]\"\r\n #sfi=\"ngModel\" [(ngModel)]=\"fl.default_value\" name=\"{{fl?.form_field}}\"\r\n (selected)=\"chkFun(fl,fl.default_value)\"\r\n (filterInputChanged)=\"loadSuggdata($event,fl.page_item_idn,fl.form_field)\">\r\n </ng-select>\r\n </div>\r\n <div *ngIf=\"sfi.invalid && (sfi.dirty || sfi.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"sfi.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-1\" *ngIf=\"fl?.form_field_icon == 'add'\">\r\n <button type=\"button\" class=\"btn btn-success btn-rounded\"><span><i\r\n class=\"fa fa-plus\"></i></span></button>\r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" appAppNoDblClick class=\"btn btn-success\" (click)=\"onSubmit(f,submitBtn)\"\r\n #submitBtn>{{btnName}}</button>\r\n <button type=\"reset\" class=\"btn btn-danger\" (click)=\"reset(f)\"\r\n *ngIf=\"btnName == 'Add'\">Reset</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal\" id=\"deletemodal\" role=\"dialog\" aria-labelledby=\"smallModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog modal-sm\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\" #deleteclsbtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Warning</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n Are you sure want to delete?\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\r\n <button type=\"button\" class=\"btn btn-danger\" data-dismiss=\"modal\"\r\n (click)=\"deleteDataList();\">Delete</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal\" id=\"popdatamodal\" role=\"dialog\" aria-labelledby=\"defModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\">\r\n <form class=\"form-horizontal\" #fpop=\"ngForm\" name=\"appForm\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\" #popclosebtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"defModalHead\">{{btnName}} Record</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\" *ngFor=\"let fl of formFildsPopup | orderByPipe: 'srt': 'asc'\">\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 't' && fl?.is_hidden == 0 && fl?.dta_typ =='c' || fl?.dta_typ =='t'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"text\" class=\"form-control\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #textInput=\"ngModel\" (blur)=\"chkFun(fl,fl.default_value);\"\r\n [ngClass]=\"{'uniqErrMsg': fl?.form_field == onErr}\"\r\n [required]=\"fl?.is_compulsory == '1'\" />\r\n </div>\r\n <div *ngIf=\"textInput.invalid && (textInput.dirty || textInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"textInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 't' && fl?.is_hidden == 0 && fl?.dta_typ =='n'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"number\" class=\"form-control\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #numberInput=\"ngModel\" [required]=\"fl?.is_compulsory==1\">\r\n <!-- minlength={{fl?.form_field_min_length}} maxlength={{fl?.form_field_max_length}}/ -->\r\n </div>\r\n <div *ngIf=\"numberInput.invalid && (numberInput.dirty || numberInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"numberInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 'pw' && fl?.is_hidden == 0 && fl?.dta_typ =='pw'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"{{inputtype}}\" class=\"form-control posrel\"\r\n name=\"{{fl?.form_field}}\" [value]=\"fl?.default_value\"\r\n [(ngModel)]=\"fl.default_value\" #passInput=\"ngModel\"\r\n [required]=\"fl?.is_compulsory == '1'\" />\r\n <span class=\"fa {{eveC}} eye\" (click)=\"showHIdePass();\"></span>\r\n </div>\r\n <div *ngIf=\"passInput.invalid && (passInput.dirty || passInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"passInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 't' && fl?.dta_typ =='a'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <div class=\"input-group w-100\">\r\n <tag-input [(ngModel)]=\"fl.default_value\" name=\"{{fl?.form_field}}\"\r\n [modelAsStrings]=\"true\" [allowDupes]=\"true\" [editable]='true'>\r\n </tag-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 't' && fl?.dta_typ =='sa'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <ng-select [options]=\"sqlArray[fl?.form_field]\" style=\"z-index:9;\"\r\n [(ngModel)]=\"fl.default_value\" #safield=\"ngModel\"\r\n [required]=\"fl?.is_compulsory == 1\" name=\"{{fl?.form_field}}\"\r\n [multiple]=\"true\" [allowClear]=\"true\">\r\n <ng-template #optionTemplate let-option=\"option\">\r\n <div class=\"famfamfam-flags {{option?.value.toLowerCase()}}\"></div>\r\n {{option?.label}}\r\n </ng-template>\r\n </ng-select>\r\n <!-- <ng-select [items]=\"sqlArray[fl.form_field]\" [addTag]=\"addTag\" bindValue=\"k\" multiple=\"true\" bindLabel=\"v\" name=\"{{fl?.form_field}}\"\r\n [(ngModel)]=\"fl.default_value\" #safield=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n </ng-select> -->\r\n </div>\r\n <div *ngIf=\"safield.invalid && (safield.dirty || safield.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"safield.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 'ta' && fl?.is_hidden == 0 && fl?.dta_typ =='c'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <textarea class=\"form-control\" rows=\"3\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #textArea=\"ngModel\" (blur)=\"chkFun(fl,fl.default_value);\"\r\n [ngClass]=\"{'uniqErrMsg': fl?.form_field == onErr}\"\r\n [required]=\"fl?.is_compulsory == '1'\"></textarea>\r\n </div>\r\n <div *ngIf=\"textArea.invalid && (textArea.dirty || textArea.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"textArea.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 'hd' || fl?.form_field_typ == 'df' || fl?.form_field_typ == 'fk' && fl?.is_hidden == 0\"\r\n [ngClass]=\"{'mt0': fl?.form_field_typ == 'hd'}\">\r\n <label class=\"col-md-3 control-label\"></label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"hidden\" class=\"form-control\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #hdf=\"ngModel\" />\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'sq' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\"></label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"hidden\" class=\"form-control\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\" />\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'tb' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #tdf=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let dynamic of sqlArray[fl.form_field]\"\r\n value=\"{{dynamic.value}}\">\r\n {{dynamic.label}}</option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"tdf.invalid && (tdf.dirty || tdf.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"tdf.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'l' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #lInput=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let lov of fl.kv\" value=\"{{lov.k}}\">{{lov.v}}</option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"lInput.invalid && (lInput.dirty || lInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"lInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'ld' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #ldInput=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let dynamic of sqlArray[fl.form_field]\"\r\n value=\"{{dynamic.k}}\">{{dynamic.v}}\r\n </option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"ldInput.invalid && (ldInput.dirty || ldInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"ldInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 's' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n (change)=\"chkFun(fl,fl.default_value)\" id=\"{{fl.column_key}}\"\r\n #sfi=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let dynamic of sqlArray[fl.form_field]\"\r\n value=\"{{dynamic.value}}\">{{dynamic.label}}\r\n </option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"sfi.invalid && (sfi.dirty || sfi.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"sfi.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" appAppNoDblClick class=\"btn btn-success\"\r\n (click)=\"onPopupSubmit(fpop,popsubmitBtn)\" #popsubmitBtn>Add</button>\r\n <button type=\"reset\" class=\"btn btn-danger\" (click)=\"reset(f)\">Reset</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal\" id=\"popResmodal\" role=\"dialog\" aria-labelledby=\"defModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\">\r\n <form class=\"form-horizontal\" name=\"appFormres\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\">\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"popModalHead\"> Record</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n <p *ngFor=\"let res of Sysresult\">{{res}}</p>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n <div class=\"modal\" id=\"productMapMasMD\" role=\"dialog\" aria-labelledby=\"smallModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog modal-sm mwidth\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\" #productMapclsbtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Product Mapping of {{attMapModelTitle}}</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-bordered table-hover table-hover-cells\">\r\n <thead>\r\n <tr>\r\n <th>\r\n Name\r\n </th>\r\n <th>\r\n Value\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-container *ngFor=\"let key of attrDtl?.prpList\">\r\n <tr>\r\n <td>\r\n {{key.print}}\r\n </td>\r\n <td>\r\n <input type=\"text\" class=\"form-control\"\r\n [(ngModel)]=\"attrMappingDtl[key?.val]\" />\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\r\n <button type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\"\r\n (click)=\"saveProductMasterMapping();\" #productMapclsbtn>Save</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <button id=\"deletebtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#deletemodal\"></button>\r\n <button id=\"datamdbtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#datamodal\"></button>\r\n <button id=\"clsMd\" [hidden]=\"true\" data-dismiss=\"modal\" data-target=\"#datamodal\"></button>\r\n <button id=\"popdatamdbtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#popdatamodal\"></button>\r\n <button id=\"popResmodalbtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#popResmodal\"></button>\r\n <button id=\"productMapMasMDbtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#productMapMasMD\"></button>", styles: [".btn-default.btn-on-1.active,.btn-default.btn-off-1.active{background-color:#3b5998;color:#fff}.btn.btn-xs,.btn-group-xs>.btn{font-size:12px;padding:5px 15px}.tbactive{background:#3B5998;color:#fff}input[type=radio]{display:none}.content-frame-left{background:transparent!important;width:250px!important}.mt0{margin-bottom:0!important}.headingCls{padding:10px;background:#f0efef;font-size:14px;font-weight:400;margin-bottom:20px}.tooltip{display:none!important}.mwidth{width:500px}\n"], components: [{ type: i6.PaginationControlsComponent, selector: "pagination-controls", inputs: ["maxSize", "previousLabel", "nextLabel", "screenReaderPaginationLabel", "screenReaderPageLabel", "screenReaderCurrentLabel", "directionLinks", "autoHide", "responsive", "id"], outputs: ["pageChange"] }, { type: i7.TagInputComponent, selector: "tag-input", inputs: ["separatorKeys", "separatorKeyCodes", "placeholder", "secondaryPlaceholder", "maxItems", "validators", "asyncValidators", "onlyFromAutocomplete", "errorMessages", "theme", "onTextChangeDebounce", "inputId", "inputClass", "clearOnBlur", "hideForm", "addOnBlur", "addOnPaste", "pasteSplitPattern", "blinkIfDupe", "removable", "editable", "allowDupes", "modelAsStrings", "trimTags", "ripple", "tabindex", "disable", "dragZone", "onRemoving", "onAdding", "animationDuration", "inputText"], outputs: ["onAdd", "onRemove", "onSelect", "onFocus", "onBlur", "onTextChange", "onPaste", "onValidationError", "onTagEdited", "inputTextChange"] }, { type: i8.SelectComponent, selector: "ng-select", inputs: ["options", "allowClear", "disabled", "multiple", "noFilter", "notFoundMsg", "placeholder", "filterPlaceholder", "label", "highlightColor", "highlightTextColor"], outputs: ["opened", "closed", "selected", "deselected", "focus", "blur", "noOptionsFound", "filterInputChanged"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i10.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i10.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i10.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i10.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i10.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i10.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i10.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i11.AppNoDblClickDirective, selector: "[appAppNoDblClick]" }], pipes: { "date": i9.DatePipe, "paginate": i6.PaginatePipe, "orderBy": i12.OrderPipe, "searchPipe": i13.SearchPipePipe, "orderByPipe": i14.OrderByPipePipe } });
|
|
937
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SystemComponent, decorators: [{
|
|
938
|
+
type: Component,
|
|
939
|
+
args: [{ selector: 'app-system', template: "<div class=\"mt\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-heading\">\r\n <h3 class=\"panel-title\">{{pageInfo?.title}}\r\n <span class=\"f-12\">({{cDt | date:'medium'}})</span>\r\n </h3>\r\n <button type=\"button\" id=\"addBtn\" class=\"btn btn-info pull-right\" *ngIf=\"addNew?.is_compulsory == 1\"\r\n (click)=\"userAction(data, 'add', '');f.reset();\">{{addNew?.form_field_title}}</button>\r\n\r\n\r\n </div>\r\n </div>\r\n <div class=\"row\" *ngIf=\"router.url != curl\">\r\n <div class=\"col-md-2\" *ngIf=\"navigation.length > 0\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-body\">\r\n <div class=\"list-group border-bottom\">\r\n <a href=\"javascript:void(0)\" class=\"list-group-item\" [ngClass]=\"{'active' :i == cLink}\"\r\n *ngFor=\"let nav of navigation;let i=index\"\r\n (click)=\"navigationFun(nav,i);\">{{nav.form_field_title}} </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"navigation.length > 0 ? 'col-md-10' : 'col-md-12'\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-body\">\r\n <!-- <div class=\"row\">\r\n <div class=\"col-sm-8\"></div>\r\n <div class=\"col-sm-4\">\r\n <form class=\"form-inline pull-right\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName2\">Search </label>\r\n <input type=\"text\" class=\"form-control\" id=\"exampleInputName2\" name=\"schtxt\" [(ngModel)]=\"searchF\" />\r\n </div>\r\n </form>\r\n </div>\r\n </div> -->\r\n <div class=\"row\">\r\n <div class=\"col-sm-6\">\r\n <form class=\"form-inline pull-left\">\r\n <div class=\"form-group\">\r\n <label for=\"ddlPagesize\">Page Size </label>\r\n <select class=\"form-control\" name=\"pageSize\" [(ngModel)]=\"pageSize\"\r\n (change)=\"onPageSizeChange(pageSize)\">\r\n <option value=\"All\">All</option>\r\n <option value=\"10\">10</option>\r\n <option value=\"25\">25</option>\r\n <option value=\"50\">50</option>\r\n <option value=\"100\">100</option>\r\n </select>\r\n </div>\r\n </form>\r\n <button class=\"btn btn-default\" style=\"padding: 4px 15px 4px 20px;margin-left: 10px;\"\r\n data-toggle=\"tooltip\" data-placement=\"right\" title=\"Refresh\" (click)=\"ngOnInit();\">\r\n <span class=\"fa fa-refresh\"></span>\r\n </button>\r\n <!-- <label>{{datalist.length}}</label> -->\r\n </div>\r\n <div class=\"col-sm-6\">\r\n <form class=\"form-inline pull-right\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName2\">Search </label>\r\n <input type=\"text\" class=\"form-control\" id=\"exampleInputName2\" name=\"schtxt\"\r\n [(ngModel)]=\"searchF\" />\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-bordered table-hover table-hover-cells\">\r\n <thead>\r\n <tr>\r\n <th>SR No</th>\r\n <th>Action</th>\r\n <th *ngFor=\"let tbh of tblH; let i = index \" (click)=\"setOrder(tbh,i)\">\r\n {{tblDesc[tbh]}}\r\n <span [hidden]=\"reverse\" *ngIf=\"showarr === i\">\r\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\r\n </span>\r\n <span [hidden]=\"!reverse\" *ngIf=\"showarr === i\">\r\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\r\n </span>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n *ngFor=\"let data of datalist | searchPipe:searchF | orderBy: order:reverse | paginate: { itemsPerPage: pageSize, currentPage: p }; let i = index;\">\r\n <td>{{i + 1}}</td>\r\n <td>\r\n <div class=\"btn-group\">\r\n <a href=\"#\" data-toggle=\"dropdown\"\r\n class=\"btn btn-info dropdown-toggle\">Action\r\n <span class=\"caret\"></span>\r\n </a>\r\n <ul class=\"dropdown-menu\" role=\"menu\">\r\n <li *ngFor=\"let action of actions\">\r\n <a href=\"javascript:void(0)\"\r\n (click)=\"userAction(data, action.form_field_typ, action);\">\r\n {{action.form_field_title}}\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </td>\r\n <td *ngFor=\"let tbh of tblH; let i=index\" on-mouseover=\"hoveredI=i\"\r\n on-mouseleave=\"hoveredI=-1\">\r\n {{data[tbh]}}\r\n <div class=\"onHoverDiv\" *ngIf=\"i==hoveredI\">\r\n <ul>\r\n <li (click)=\"editCell(data,tbh);\">\r\n <span class=\"fa fa-pencil\"></span>\r\n </li>\r\n </ul>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <pagination-controls (pageChange)=\"p = $event\" class=\"pull-right\"></pagination-controls>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal\" id=\"datamodal\" role=\"dialog\" aria-labelledby=\"defModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\">\r\n <form class=\"form-horizontal\" #f=\"ngForm\" name=\"appForm\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\" #closebtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"defModalHead\">{{btnName}} Record</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\" *ngFor=\"let fl of formFilds | orderByPipe: 'srt': 'asc'\">\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 't' && fl?.is_hidden == 0 && fl?.dta_typ =='c' || fl?.dta_typ =='t'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <!-- (change)=\"removeInvalid(fl)\" -->\r\n <input type=\"text\" class=\"form-control\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #textInput=\"ngModel\" (blur)=\"chkFun(fl,fl.default_value);\"\r\n [ngClass]=\"{'uniqErrMsg': fl?.form_field == onErr}\"\r\n [required]=\"fl?.is_compulsory == 1\" />\r\n </div>\r\n <!-- (blur)=\"this[fl?.validations](fl.default_value)\" -->\r\n <div *ngIf=\"textInput.invalid && (textInput.dirty || textInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"textInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n <!-- <div *ngIf=\"textInput.errors.minlength\">\r\n {{fl.form_field_title}} must be at least {{fl.form_field_min_length}} characters long.\r\n </div>\r\n <div *ngIf=\"textInput.errors.maxlength\">\r\n {{fl.form_field_title}} Maxmimum limit {{fl.form_field_max_length}} characters long.\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 't' && fl?.is_hidden == 0 && fl?.dta_typ =='n'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"number\" class=\"form-control\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #numberInput=\"ngModel\" [required]=\"fl?.is_compulsory == 1\">\r\n <!-- minlength={{fl?.form_field_min_length}} maxlength={{fl?.form_field_max_length}}/ -->\r\n </div>\r\n <div *ngIf=\"numberInput.invalid && (numberInput.dirty || numberInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"numberInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n <!-- <div *ngIf=\"numberInput.errors.minlength\">\r\n {{fl.form_field_title}} must be at least {{fl.form_field_min_length}} characters long.\r\n </div>\r\n <div *ngIf=\"numberInput.errors.maxlength\">\r\n {{fl.form_field_title}} Maxmimum limit {{fl.form_field_max_length}} characters long.\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 'pw' && fl?.is_hidden == 0 && fl?.dta_typ =='pw'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"{{inputtype}}\" class=\"form-control posrel\"\r\n name=\"{{fl?.form_field}}\" [value]=\"fl?.default_value\"\r\n [(ngModel)]=\"fl.default_value\" #passInput=\"ngModel\"\r\n [required]=\"fl?.is_compulsory == 1\" />\r\n <span class=\"fa {{eveC}} eye\" (click)=\"showHIdePass();\"></span>\r\n </div>\r\n <!-- (blur)=\"this[fl?.validations](fl.default_value)\" -->\r\n <div *ngIf=\"passInput.invalid && (passInput.dirty || passInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"passInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 't' && fl?.dta_typ =='a'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <tag-input [(ngModel)]=\"fl.default_value\" name=\"{{fl?.form_field}}\"\r\n [modelAsStrings]=\"true\" [allowDupes]=\"true\" [editable]='true'>\r\n </tag-input>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 't' && fl?.dta_typ =='sa'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <ng-select [options]=\"sqlArray[fl?.form_field]\" style=\"z-index:9;\"\r\n [(ngModel)]=\"fl.default_value\" #safield=\"ngModel\"\r\n [required]=\"fl?.is_compulsory == 1\" name=\"{{fl?.form_field}}\"\r\n [multiple]=\"true\" [allowClear]=\"true\">\r\n <ng-template #optionTemplate let-option=\"option\">\r\n <div class=\"famfamfam-flags {{option?.value}}\"></div>\r\n {{option?.label}}\r\n </ng-template>\r\n </ng-select>\r\n <!-- <ng-select [items]=\"sqlArray[fl?.form_field]\" [addTag]=\"addTag\" bindValue=\"k\" multiple=\"true\" bindLabel=\"v\" name=\"{{fl?.form_field}}\"\r\n [(ngModel)]=\"fl.default_value\" #safield=\"ngModel\" [required]=\"fl?.is_compulsory == 1\">\r\n </ng-select> -->\r\n </div>\r\n <div *ngIf=\"safield.invalid && (safield.dirty || safield.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"safield.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 'ta' && fl?.is_hidden == 0 && fl?.dta_typ =='c'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <textarea class=\"form-control\" rows=\"3\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #textArea=\"ngModel\" (blur)=\"chkFun(fl,fl.default_value);\"\r\n [ngClass]=\"{'uniqErrMsg': fl?.form_field == onErr}\"\r\n [required]=\"fl?.is_compulsory == 1\"></textarea>\r\n </div>\r\n <div *ngIf=\"textArea.invalid && (textArea.dirty || textArea.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"textArea.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 'hd' || fl?.form_field_typ == 'df' || fl?.form_field_typ == 'fk' && fl?.is_hidden == 0\"\r\n [ngClass]=\"{'mt0': fl?.form_field_typ == 'hd'}\">\r\n <label class=\"col-md-3 control-label\"></label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"hidden\" class=\"form-control\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #hdf=\"ngModel\" />\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'sq' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\"></label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"hidden\" class=\"form-control\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\" />\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'tb' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <!-- <div class=\"col-md-9\">\r\n <div class=\"btn-group\" data-toggle=\"buttons\">\r\n <label class=\"btn btn-default btn-on btn-xs\" *ngFor=\"let lov of sqlArray[fl.form_field];let i=index\">\r\n <input type=\"radio\" [value]=\"lov.k\" id=\"{{i}}\" name=\"{{fl?.form_field}}\" [value]=\"\" [(ngModel)]=\"fl.default_value\">{{lov.v}}</label>\r\n </div>\r\n </div> -->\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #tdf=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let dynamic of sqlArray[fl.form_field]\"\r\n value=\"{{dynamic.value}}\">\r\n {{dynamic.label}}</option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"tdf.invalid && (tdf.dirty || tdf.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"tdf.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'l' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #lInput=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let lov of fl.kv\" value=\"{{lov.k}}\">{{lov.v}}</option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"lInput.invalid && (lInput.dirty || lInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"lInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'ld' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #ldInput=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let dynamic of sqlArray[fl.form_field]\"\r\n value=\"{{dynamic.k}}\">{{dynamic.v}}\r\n </option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"ldInput.invalid && (ldInput.dirty || ldInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"ldInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 's' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n (change)=\"chkFun(fl,fl.default_value)\" id=\"{{fl.column_key}}\"\r\n #sfi=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let dynamic of sqlArray[fl.form_field]\"\r\n value=\"{{dynamic.value}}\">\r\n {{dynamic.label}}</option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"sfi.invalid && (sfi.dirty || sfi.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"sfi.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'sb'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-8\">\r\n <div class=\"input-group w-100\">\r\n <ng-select style=\"z-index: 5;\" [options]=\"sqlArray[fl.form_field]\"\r\n #sfi=\"ngModel\" [(ngModel)]=\"fl.default_value\" name=\"{{fl?.form_field}}\"\r\n (selected)=\"chkFun(fl,fl.default_value)\"\r\n (filterInputChanged)=\"loadSuggdata($event,fl.page_item_idn,fl.form_field)\">\r\n </ng-select>\r\n </div>\r\n <div *ngIf=\"sfi.invalid && (sfi.dirty || sfi.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"sfi.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-1\" *ngIf=\"fl?.form_field_icon == 'add'\">\r\n <button type=\"button\" class=\"btn btn-success btn-rounded\"><span><i\r\n class=\"fa fa-plus\"></i></span></button>\r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" appAppNoDblClick class=\"btn btn-success\" (click)=\"onSubmit(f,submitBtn)\"\r\n #submitBtn>{{btnName}}</button>\r\n <button type=\"reset\" class=\"btn btn-danger\" (click)=\"reset(f)\"\r\n *ngIf=\"btnName == 'Add'\">Reset</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal\" id=\"deletemodal\" role=\"dialog\" aria-labelledby=\"smallModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog modal-sm\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\" #deleteclsbtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Warning</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n Are you sure want to delete?\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\r\n <button type=\"button\" class=\"btn btn-danger\" data-dismiss=\"modal\"\r\n (click)=\"deleteDataList();\">Delete</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal\" id=\"popdatamodal\" role=\"dialog\" aria-labelledby=\"defModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\">\r\n <form class=\"form-horizontal\" #fpop=\"ngForm\" name=\"appForm\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\" #popclosebtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"defModalHead\">{{btnName}} Record</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\" *ngFor=\"let fl of formFildsPopup | orderByPipe: 'srt': 'asc'\">\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 't' && fl?.is_hidden == 0 && fl?.dta_typ =='c' || fl?.dta_typ =='t'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"text\" class=\"form-control\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #textInput=\"ngModel\" (blur)=\"chkFun(fl,fl.default_value);\"\r\n [ngClass]=\"{'uniqErrMsg': fl?.form_field == onErr}\"\r\n [required]=\"fl?.is_compulsory == '1'\" />\r\n </div>\r\n <div *ngIf=\"textInput.invalid && (textInput.dirty || textInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"textInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 't' && fl?.is_hidden == 0 && fl?.dta_typ =='n'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"number\" class=\"form-control\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #numberInput=\"ngModel\" [required]=\"fl?.is_compulsory==1\">\r\n <!-- minlength={{fl?.form_field_min_length}} maxlength={{fl?.form_field_max_length}}/ -->\r\n </div>\r\n <div *ngIf=\"numberInput.invalid && (numberInput.dirty || numberInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"numberInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 'pw' && fl?.is_hidden == 0 && fl?.dta_typ =='pw'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"{{inputtype}}\" class=\"form-control posrel\"\r\n name=\"{{fl?.form_field}}\" [value]=\"fl?.default_value\"\r\n [(ngModel)]=\"fl.default_value\" #passInput=\"ngModel\"\r\n [required]=\"fl?.is_compulsory == '1'\" />\r\n <span class=\"fa {{eveC}} eye\" (click)=\"showHIdePass();\"></span>\r\n </div>\r\n <div *ngIf=\"passInput.invalid && (passInput.dirty || passInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"passInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 't' && fl?.dta_typ =='a'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <div class=\"input-group w-100\">\r\n <tag-input [(ngModel)]=\"fl.default_value\" name=\"{{fl?.form_field}}\"\r\n [modelAsStrings]=\"true\" [allowDupes]=\"true\" [editable]='true'>\r\n </tag-input>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 't' && fl?.dta_typ =='sa'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <ng-select [options]=\"sqlArray[fl?.form_field]\" style=\"z-index:9;\"\r\n [(ngModel)]=\"fl.default_value\" #safield=\"ngModel\"\r\n [required]=\"fl?.is_compulsory == 1\" name=\"{{fl?.form_field}}\"\r\n [multiple]=\"true\" [allowClear]=\"true\">\r\n <ng-template #optionTemplate let-option=\"option\">\r\n <div class=\"famfamfam-flags {{option?.value.toLowerCase()}}\"></div>\r\n {{option?.label}}\r\n </ng-template>\r\n </ng-select>\r\n <!-- <ng-select [items]=\"sqlArray[fl.form_field]\" [addTag]=\"addTag\" bindValue=\"k\" multiple=\"true\" bindLabel=\"v\" name=\"{{fl?.form_field}}\"\r\n [(ngModel)]=\"fl.default_value\" #safield=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n </ng-select> -->\r\n </div>\r\n <div *ngIf=\"safield.invalid && (safield.dirty || safield.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"safield.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 'ta' && fl?.is_hidden == 0 && fl?.dta_typ =='c'\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <textarea class=\"form-control\" rows=\"3\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #textArea=\"ngModel\" (blur)=\"chkFun(fl,fl.default_value);\"\r\n [ngClass]=\"{'uniqErrMsg': fl?.form_field == onErr}\"\r\n [required]=\"fl?.is_compulsory == '1'\"></textarea>\r\n </div>\r\n <div *ngIf=\"textArea.invalid && (textArea.dirty || textArea.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"textArea.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\"\r\n *ngIf=\"fl?.form_field_typ == 'hd' || fl?.form_field_typ == 'df' || fl?.form_field_typ == 'fk' && fl?.is_hidden == 0\"\r\n [ngClass]=\"{'mt0': fl?.form_field_typ == 'hd'}\">\r\n <label class=\"col-md-3 control-label\"></label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"hidden\" class=\"form-control\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #hdf=\"ngModel\" />\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'sq' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\"></label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"hidden\" class=\"form-control\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\" />\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'tb' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #tdf=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let dynamic of sqlArray[fl.form_field]\"\r\n value=\"{{dynamic.value}}\">\r\n {{dynamic.label}}</option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"tdf.invalid && (tdf.dirty || tdf.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"tdf.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'l' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #lInput=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let lov of fl.kv\" value=\"{{lov.k}}\">{{lov.v}}</option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"lInput.invalid && (lInput.dirty || lInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"lInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 'ld' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n #ldInput=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let dynamic of sqlArray[fl.form_field]\"\r\n value=\"{{dynamic.k}}\">{{dynamic.v}}\r\n </option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"ldInput.invalid && (ldInput.dirty || ldInput.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"ldInput.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\" *ngIf=\"fl?.form_field_typ == 's' && fl?.is_hidden == 0\">\r\n <label class=\"col-md-3 control-label\">{{fl?.form_field_title}}\r\n <span class=\"text-danger\" *ngIf=\"fl.is_compulsory == 1\">*</span>\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control select\" name=\"{{fl?.form_field}}\"\r\n [value]=\"fl?.default_value\" [(ngModel)]=\"fl.default_value\"\r\n (change)=\"chkFun(fl,fl.default_value)\" id=\"{{fl.column_key}}\"\r\n #sfi=\"ngModel\" [required]=\"fl?.is_compulsory == '1'\">\r\n <option *ngFor=\"let dynamic of sqlArray[fl.form_field]\"\r\n value=\"{{dynamic.value}}\">{{dynamic.label}}\r\n </option>\r\n </select>\r\n </div>\r\n <div *ngIf=\"sfi.invalid && (sfi.dirty || sfi.touched)\"\r\n class=\"alert alert-danger ca\">\r\n <div *ngIf=\"sfi.errors.required\">\r\n {{fl.form_field_title}} is required.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" appAppNoDblClick class=\"btn btn-success\"\r\n (click)=\"onPopupSubmit(fpop,popsubmitBtn)\" #popsubmitBtn>Add</button>\r\n <button type=\"reset\" class=\"btn btn-danger\" (click)=\"reset(f)\">Reset</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal\" id=\"popResmodal\" role=\"dialog\" aria-labelledby=\"defModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\">\r\n <form class=\"form-horizontal\" name=\"appFormres\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\">\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"popModalHead\"> Record</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n <p *ngFor=\"let res of Sysresult\">{{res}}</p>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n <div class=\"modal\" id=\"productMapMasMD\" role=\"dialog\" aria-labelledby=\"smallModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"false\">\r\n <div class=\"modal-dialog modal-sm mwidth\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" (click)=\"closeNull();\" #productMapclsbtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Product Mapping of {{attMapModelTitle}}</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-bordered table-hover table-hover-cells\">\r\n <thead>\r\n <tr>\r\n <th>\r\n Name\r\n </th>\r\n <th>\r\n Value\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-container *ngFor=\"let key of attrDtl?.prpList\">\r\n <tr>\r\n <td>\r\n {{key.print}}\r\n </td>\r\n <td>\r\n <input type=\"text\" class=\"form-control\"\r\n [(ngModel)]=\"attrMappingDtl[key?.val]\" />\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\r\n <button type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\"\r\n (click)=\"saveProductMasterMapping();\" #productMapclsbtn>Save</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <button id=\"deletebtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#deletemodal\"></button>\r\n <button id=\"datamdbtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#datamodal\"></button>\r\n <button id=\"clsMd\" [hidden]=\"true\" data-dismiss=\"modal\" data-target=\"#datamodal\"></button>\r\n <button id=\"popdatamdbtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#popdatamodal\"></button>\r\n <button id=\"popResmodalbtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#popResmodal\"></button>\r\n <button id=\"productMapMasMDbtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#productMapMasMD\"></button>", styles: [".btn-default.btn-on-1.active,.btn-default.btn-off-1.active{background-color:#3b5998;color:#fff}.btn.btn-xs,.btn-group-xs>.btn{font-size:12px;padding:5px 15px}.tbactive{background:#3B5998;color:#fff}input[type=radio]{display:none}.content-frame-left{background:transparent!important;width:250px!important}.mt0{margin-bottom:0!important}.headingCls{padding:10px;background:#f0efef;font-size:14px;font-weight:400;margin-bottom:20px}.tooltip{display:none!important}.mwidth{width:500px}\n"] }]
|
|
940
|
+
}], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.ToastrService }, { type: i3.SystemServiceService }, { type: i4.NgxSpinnerService }, { type: i5.CommanServiceService }]; }, propDecorators: { closebtn: [{
|
|
941
|
+
type: ViewChild,
|
|
942
|
+
args: ['closebtn']
|
|
943
|
+
}], deleteclsbtn: [{
|
|
944
|
+
type: ViewChild,
|
|
945
|
+
args: ['deleteclsbtn']
|
|
946
|
+
}], input: [{
|
|
947
|
+
type: ViewChild,
|
|
948
|
+
args: ['inputs']
|
|
949
|
+
}], popclosebtn: [{
|
|
950
|
+
type: ViewChild,
|
|
951
|
+
args: ['popclosebtn']
|
|
952
|
+
}], submitbtn: [{
|
|
953
|
+
type: ViewChild,
|
|
954
|
+
args: ['submitBtn']
|
|
955
|
+
}], productMapclsbtn: [{
|
|
956
|
+
type: ViewChild,
|
|
957
|
+
args: ['productMapclsbtn']
|
|
958
|
+
}] } });
|
|
959
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V6bGliL3NyYy9saWIvc3lzdGVtLW1vZHVsZS9zeXN0ZW0vc3lzdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V6bGliL3NyYy9saWIvc3lzdGVtLW1vZHVsZS9zeXN0ZW0vc3lzdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RSxPQUFPLEVBQUUsV0FBVyxFQUFHLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQXlCLE1BQU0saUJBQWlCLENBQUM7QUFFaEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBUW5GLE1BQU0sT0FBTyxlQUFlO0lBd0UxQixZQUNTLE1BQWMsRUFDYixLQUFxQixFQUNyQixNQUFxQixFQUNyQixFQUF3QixFQUN4QixjQUFpQyxFQUNsQyxFQUF3QjtRQUx4QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2IsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFDckIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUNyQixPQUFFLEdBQUYsRUFBRSxDQUFzQjtRQUN4QixtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDbEMsT0FBRSxHQUFGLEVB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QUFTO3VCQUFDLFdBQVc7Z0JBQ1MsZ0JBQWdCO3NCQUE5QyxTQUFTO3VCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cEhlYWRlcnMgIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBSb3V0ZXIsIEFjdGl2YXRlZFJvdXRlLCBQYXJhbXMsIE5hdmlnYXRpb25FbmQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XHJcbmltcG9ydCB7IENvb2tpZSB9IGZyb20gJ25nMi1jb29raWVzL25nMi1jb29raWVzJztcclxuaW1wb3J0IHsgTmd4U3Bpbm5lclNlcnZpY2UgfSBmcm9tIFwibmd4LXNwaW5uZXJcIjtcclxuaW1wb3J0IHsgU3lzdGVtU2VydmljZVNlcnZpY2UgfSBmcm9tICcuLi9zeXN0ZW0tc2VydmljZS9zeXN0ZW0tc2VydmljZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tbWFuU2VydmljZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tYW4tc2VydmljZS9jb21tYW4tc2VydmljZS5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXN5c3RlbScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3N5c3RlbS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc3lzdGVtLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIFN5c3RlbUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgLy8gaXRlbXMgPSBbJ1BpenphJywgJ1Bhc3RhJywgJ1Bhcm1lc2FuJ107XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2Nsb3NlYnRuJykgY2xvc2VidG46IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnZGVsZXRlY2xzYnRuJykgZGVsZXRlY2xzYnRuOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2lucHV0cycpIGlucHV0OiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3BvcGNsb3NlYnRuJykgcG9wY2xvc2VidG46IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnc3VibWl0QnRuJykgc3VibWl0YnRuOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3Byb2R1Y3RNYXBjbHNidG4nKSBwcm9kdWN0TWFwY2xzYnRuOiBFbGVtZW50UmVmO1xyXG4gIGNEdCA9IG5ldyBEYXRlKCk7XHJcblxyXG4gIGZvcm1GaWxkcyA9IFtdO1xyXG4gIGZvcm1GaWxkc1BvcHVwID0gW107XHJcbiAgZGF0YWxpc3QgPSBbXTtcclxuICBhY3Rpb25zID0gW107XHJcbiAgbG92cyA9IFtdO1xyXG4gIGFkZE5ldzogYW55ID0gW107XHJcbiAgdGJsSCA9IFtdO1xyXG4gIHRibERlc2MgPSBbXTtcclxuICBuYXZpZ2F0aW9uID0gW107XHJcbiAgU3lzcmVzdWx0ID0gW107XHJcbiAgZGF0YTtcclxuXHJcbiAgd2hlcmVNYXAgPSB7fTtcclxuICBwYXJhT2JqID0ge307XHJcbiAgY3Vyck9iaiA9IHt9O1xyXG4gIHNxbEFycmF5ID0ge307XHJcbiAgZ2xiT2JqID0ge31cclxuXHJcbiAgcGFnZVNpemUgPSAxMDtcclxuICBjTGluayA9IDA7XHJcbiAgcCA9IDE7XHJcblxyXG4gIGV2ZUMgPSAnZmEtZXllLXNsYXNoJztcclxuICBpbnB1dHR5cGUgPSAncGFzc3dvcmQnO1xyXG4gIG9yZGVyID0gJyc7XHJcblxyXG4gIHJldmVyc2UgPSBmYWxzZTtcclxuICBzdWJmb3JtID0gZmFsc2U7XHJcbiAgZXN0c3QgPSBmYWxzZTtcclxuXHJcbiAgc2hvd2FycjtcclxuICBwYWdlSW5mbztcclxuICBwb3B1cHBhZ2VJbmZvO1xyXG4gIGhlYWRlcjtcclxuICBidG5OYW1lO1xyXG4gIHBpZDtcclxuICBzZWFyY2hGO1xyXG4gIHdocks7XHJcbiAgd2hyVjtcclxuICBzdWJGcm1XaztcclxuICBzdWJGcm1XdjtcclxuICBuYXZmb3JtO1xyXG4gIG9uRXJyO1xyXG4gIGhvdmVyZWRJO1xyXG4gIHRiQ2VsbDtcclxuICB0aXRsZVxyXG4gIHBrZjtcclxuICBjdXJsO1xyXG4gIHVpR3JwTGlzdDtcclxuICB1aUdycExpc3REdGw7XHJcbiAgZGF0YUR0bFxyXG4gIGFkZEZybU5tZTtcclxuICBjb2lkbjtcclxuICBjdXJyc3RhdDtcclxuICBjVXJsO1xyXG4gIGFjdGlvbjtcclxuICBhdHRyRHRsO1xyXG4gIGF0dHJNYXBwaW5nRHRsO1xyXG4gIHByb2R1Y3RNYXNBdHRySWQ7XHJcbiAgYXR0TWFwTW9kZWxUaXRsZTtcclxuICBjb250YWN0TmFtZSA9IFwiXCI7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzczogU3lzdGVtU2VydmljZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNwaW5uZXJTZXJ2aWNlOiBOZ3hTcGlubmVyU2VydmljZSAsXHJcbiAgICBwdWJsaWMgY3M6IENvbW1hblNlcnZpY2VTZXJ2aWNlXHJcblxyXG4gICkge1xyXG5cclxuICB9XHJcblxyXG4gIC8vbG9hZCBwYWdlIGRlZmluYXRpb25cclxuICBnZXRQYWdlRGVmaW5hdGlvbigpIHtcclxuICAgIHRoaXMuZGF0YWxpc3QgPSBbXTtcclxuICAgIHRoaXMud2hlcmVNYXAgPSBbXTtcclxuICAgIHRoaXMuc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG5cclxuICAgIGxldCBhY3Rpb24gPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtc1snYWN0aW9uJ10gfHwgJyc7XHJcbiAgICBpZiAodGhpcy53aHJWICE9IG51bGwgJiYgdGhpcy5zdWJGcm1XayA9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMucGFyYU9ialsnd2hlcmVLZXlzJ10gPSB0aGlzLndocks7XHJcbiAgICAgIHRoaXMucGFyYU9ialsnd2hlcmVWbHVzJ10gPSAnJyArIHRoaXMud2hyVjtcclxuICAgICAgdGhpcy53aGVyZU1hcFt0aGlzLndocktdID0gdGhpcy53aHJWO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wYXJhT2JqWyd3aGVyZUtleXMnXSA9ICcxJztcclxuICAgICAgdGhpcy5wYXJhT2JqWyd3aGVyZVZsdXMnXSA9ICcxJztcclxuICAgIH1cclxuICAgIHRoaXMuaGVhZGVyWydtZXRob2QnXSA9ICdsb2FkTGlzdCc7XHJcbiAgICBpZiAodGhpcy5wYWdlSW5mbyAhPSBudWxsKSB7XHJcbiAgICAgIHZhciBwYWdlVFAgPSB0aGlzLnBhZ2VJbmZvLnBhZ2VfdHlwO1xyXG4gICAgICBpZiAocGFnZVRQID09ICdqc29uRm9ybScpIHtcclxuICAgICAgICB0aGlzLnBhcmFPYmpbJ3doZXJlS2V5cyddID0gdGhpcy5wYWdlSW5mby53aGVyZV9jbGF1c2U7XHJcbiAgICAgICAgdGhpcy5wYXJhT2JqWyd3aGVyZVZsdXMnXSA9IHRoaXMud2hlcmVNYXBbdGhpcy5wYWdlSW5mby53aGVyZV9jbGF1c2VdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoYWN0aW9uID09ICduZXdjb250YWN0Jykge1xyXG4gICAgICB0aGlzLnBhcmFPYmpbJ3doZXJlS2V5cyddID0gXCJubWVfaWRuXCI7XHJcbiAgICAgIHRoaXMucGFyYU9ialsnd2hlcmVWbHVzJ10gPSBcIjBcIjtcclxuXHJcbiAgICB9XHJcbiAgICBpZiAoYWN0aW9uID09ICduZXdhY2Njb250YWN0Jykge1xyXG4gICAgICB0aGlzLnBhcmFPYmpbJ3doZXJlS2V5cyddID0gXCJubWVfaWRuXCI7XHJcbiAgICAgIHRoaXMucGFyYU9ialsnd2hlcmVWbHVzJ10gPSBcIjBcIjtcclxuXHJcbiAgICB9XHJcbiAgICBpZiAoYWN0aW9uID09ICduZXdsZWRnZXInKSB7XHJcbiAgICAgIHRoaXMucGFyYU9ialsnd2hlcmVLZXlzJ10gPSBcImxlZGdlcl9pZG5cIjtcclxuICAgICAgdGhpcy5wYXJhT2JqWyd3aGVyZVZsdXMnXSA9IFwiMFwiO1xyXG5cclxuICAgIH1cclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIGNvbnNvbGUubG9nKG9wdGlvbnMpO1xyXG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkodGhpcy5wYXJhT2JqKSk7XHJcbiAgICB0aGlzLnNzLmdldERhdGEodGhpcy5wYXJhT2JqLCBvcHRpb25zKS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpO1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudGJsSCA9IHJlc3BvbnNlLmRhdGFIZWFkZXI7XHJcbiAgICAgICAgdGhpcy50YmxEZXNjID0gcmVzcG9uc2UuZGF0YUhlYWRlclByaW50O1xyXG4gICAgICAgIHRoaXMuYWRkTmV3ID0gcmVzcG9uc2UuYnV0dG9uc1swXSB8fCB7fTtcclxuICAgICAgICB0aGlzLnBhZ2VJbmZvID0gcmVzcG9uc2UucGFnZUluZm87XHJcbiAgICAgICAgdGhpcy5wa2YgPSByZXNwb25zZS5wYWdlSW5mby5wcmltYXJ5X2tleV9maWVsZDtcclxuICAgICAgICB0aGlzLmRhdGFsaXN0ID0gcmVzcG9uc2UuZGF0YUxpc3QgfHwgW107XHJcbiAgICAgICAgdGhpcy5hY3Rpb25zID0gcmVzcG9uc2UuYWN0aW9ucztcclxuICAgICAgICB0aGlzLm5hdmlnYXRpb24gPSByZXNwb25zZS5uYXZpZ2F0aW9uO1xyXG4gICAgICAgIGRlYnVnZ2VyXHJcblxyXG5cclxuXHJcbiAgICAgICAgaWYgKGFjdGlvbiA9PSAnbmV3Y29udGFjdCcgfHwgYWN0aW9uID09ICduZXdsZWRnZXInIHx8IGFjdGlvbiA9PSAnbmV3YWNjY29udGFjdCcpIHtcclxuICAgICAgICAgIHRoaXMuYWN0aW9uID0gYWN0aW9uO1xyXG4gICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uID0gcmVzcG9uc2UubmF2aWdhdGlvblswXTtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmZvcm1GaWxkcyA9IFtdO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGF0YW1kYnRuJykuY2xpY2soKTtcclxuICAgICAgICAgICAgdGhpcy5wYXJhT2JqWydmb3JtTm1lJ10gPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtc1snZnJtbm1lJ107XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Rm9ybUZpZWxkcygpO1xyXG4gICAgICAgICAgICB0aGlzLmJ0bk5hbWUgPSAnQWRkJztcclxuICAgICAgICAgIH0sIDUwMClcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSlcclxuICAgICAgfVxyXG4gICAgfSkuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSlcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy9sb2FkIGZvcm0gZmllbGRzXHJcbiAgZ2V0Rm9ybUZpZWxkcygpIHtcclxuICAgIHRoaXMuc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG4gICAgaWYgKHRoaXMud2hyViAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMucGFyYU9ialsnd2hlcmVLZXlzJ10gPSB0aGlzLndocks7XHJcbiAgICAgIHRoaXMucGFyYU9ialsnd2hlcmVWbHVzJ10gPSB0aGlzLndoclY7XHJcbiAgICB9XHJcbiAgICB0aGlzLmhlYWRlclsnbWV0aG9kJ10gPSAnbG9hZEFkZEVkaXQnO1xyXG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkodGhpcy5wYXJhT2JqKSlcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHRoaXMuaGVhZGVyKSlcclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIHRoaXMuc3MuZ2V0Rm9ybUYodGhpcy5wYXJhT2JqLCBvcHRpb25zKS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gJ1NVQ0NFU1MnICYmIHJlc3BvbnNlLm1lc3NhZ2UgIT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSlcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH07XHJcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpO1xyXG4gICAgICAgIHRoaXMuZm9ybUZpbGRzID0gcmVzcG9uc2UuZm9ybUZpZWxkcztcclxuICAgICAgICBkZWJ1Z2dlclxyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMuZm9ybUZpbGRzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICBpZiAoZWxlbWVudC5mb3JtX2ZpZWxkX3R5cCA9PSAndGInKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0TG92TGlzdChlbGVtZW50LmZvcm1fZmllbGQsIGVsZW1lbnQucGFnZV9pdGVtX2lkbik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZWxlbWVudC5mb3JtX2ZpZWxkX3R5cCA9PSAncycpIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRMb3ZMaXN0KGVsZW1lbnQuZm9ybV9maWVsZCwgZWxlbWVudC5wYWdlX2l0ZW1faWRuKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChlbGVtZW50LmZvcm1fZmllbGRfdHlwID09ICdoZCcpIHtcclxuICAgICAgICAgICAgZWxlbWVudC5kZWZhdWx0X3ZhbHVlID0gdGhpcy53aGVyZU1hcFtlbGVtZW50LmZvcm1fZmllbGRdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGVsZW1lbnQuZm9ybV9maWVsZF90eXAgPT0gJ3NxJykge1xyXG4gICAgICAgICAgICB0aGlzLmdldFNlcXVlbmNlKGVsZW1lbnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGVsZW1lbnQuZHRhX3R5cCA9PSAnc2EnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0TG92TGlzdChlbGVtZW50LmZvcm1fZmllbGQsIGVsZW1lbnQucGFnZV9pdGVtX2lkbik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSlcclxuICAgICAgfVxyXG4gICAgfSkuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSlcclxuICAgIH0pO1xyXG4gIH1cclxuICAvL2xvYWQgZm9ybSBmaWVsZHNcclxuICBnZXRGb3JtRmllbGRzUG9wdXAoKSB7XHJcbiAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIGlmICh0aGlzLndoclYgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnBhcmFPYmpbJ3doZXJlS2V5cyddID0gdGhpcy53aHJLO1xyXG4gICAgICB0aGlzLnBhcmFPYmpbJ3doZXJlVmx1cyddID0gdGhpcy53aHJWO1xyXG5cclxuICAgICAgdGhpcy53aGVyZU1hcFt0aGlzLndocktdID0gdGhpcy53aHJWO1xyXG4gICAgfVxyXG4gICAgdGhpcy5oZWFkZXJbJ21ldGhvZCddID0gJ2xvYWRBZGRFZGl0JztcclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIHRoaXMuc3MuZ2V0Rm9ybUYodGhpcy5wYXJhT2JqLCBvcHRpb25zKS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gJ1NVQ0NFU1MnICYmIHJlc3BvbnNlLm1lc3NhZ2UgIT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSlcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH07XHJcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpO1xyXG4gICAgICAgIGRlYnVnZ2VyO1xyXG4gICAgICAgIHRoaXMuZm9ybUZpbGRzUG9wdXAgPSByZXNwb25zZS5mb3JtRmllbGRzO1xyXG4gICAgICAgIHRoaXMucG9wdXBwYWdlSW5mbyA9IHJlc3BvbnNlLnBhZ2VJbmZvO1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMuZm9ybUZpbGRzUG9wdXAuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgIGRlYnVnZ2VyO1xyXG4gICAgICAgICAgaWYgKGVsZW1lbnQuZm9ybV9maWVsZF90eXAgPT0gJ3RiJykge1xyXG4gICAgICAgICAgICB0aGlzLmdldExvdkxpc3QoZWxlbWVudC5mb3JtX2ZpZWxkLCBlbGVtZW50LnBhZ2VfaXRlbV9pZG4pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGVsZW1lbnQuZm9ybV9maWVsZF90eXAgPT0gJ3MnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0TG92TGlzdChlbGVtZW50LmZvcm1fZmllbGQsIGVsZW1lbnQucGFnZV9pdGVtX2lkbik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZWxlbWVudC5mb3JtX2ZpZWxkX3R5cCA9PSAnaGQnKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuZGVmYXVsdF92YWx1ZSA9IHRoaXMud2hlcmVNYXBbZWxlbWVudC5mb3JtX2ZpZWxkXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChlbGVtZW50LmZvcm1fZmllbGRfdHlwID09ICdzcScpIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRTZXF1ZW5jZShlbGVtZW50KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChlbGVtZW50LmZvcm1fZmllbGRfdHlwID09ICdmaycpIHtcclxuICAgICAgICAgICAgZWxlbWVudC5kZWZhdWx0X3ZhbHVlID0gdGhpcy53aHJWO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGVsZW1lbnQuZHRhX3R5cCA9PSAnc2EnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0TG92TGlzdChlbGVtZW50LmZvcm1fZmllbGQsIGVsZW1lbnQucGFnZV9pdGVtX2lkbik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSlcclxuICAgICAgfVxyXG4gICAgfSkuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSlcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gZnVuY3Rpb24gdG8gcmVtb3ZlIGludmFsaWQgY2hhcmFjdGVyc1xyXG4gIC8vIHJlbW92ZUludmFsaWQoZmwpIHtcclxuICAvLyAgIGlmIChmbC5mb3JtX2ZpZWxkID09IFwibm1lXCIgfHwgZmwuZm9ybV9maWVsZCA9PSBcInByaW50X25tZVwiKSB7XHJcbiAgLy8gICAgIGZsLmRlZmF1bHRfdmFsdWUgPSBmbC5kZWZhdWx0X3ZhbHVlLnJlcGxhY2UoL1teYS16IF0vZ2ksICcnKTtcclxuICAvLyAgIH1cclxuICAvLyB9O1xyXG5cclxuICAvL3VzZXJzIGFjdGlvbiBsaWtlICdhZGQnLCAnZWRpdCcsICdkZWxldGUnIGFuZCAnYWQgSXRlbSdcclxuICB1c2VyQWN0aW9uKHVhLCBjLCBhKSB7XHJcbiAgICBkZWJ1Z2dlclxyXG4gICAgY29uc29sZS5sb2codWEsIGMsIGEpO1xyXG4gICAgaWYgKGMgPT0gJ2FkZCcpIHtcclxuICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICAgIHRoaXMuZm9ybUZpbGRzID0gW107XHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXRhbWRidG4nKS5jbGljaygpO1xyXG4gICAgICB0aGlzLnBhcmFPYmpbJ2Zvcm1ObWUnXSA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zWydmcm1ubWUnXTtcclxuICAgICAgdGhpcy5nZXRGb3JtRmllbGRzKCk7XHJcbiAgICAgIHRoaXMuYnRuTmFtZSA9ICdBZGQnO1xyXG4gICAgfSBlbHNlIGlmICh1YSAmJiBjLnRyaW0oKSA9PSAnZWRpdCcpIHtcclxuICAgICAgdGhpcy5nbGJPYmogPSB1YTtcclxuICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICAgIHRoaXMuZm9ybUZpbGRzID0gW107XHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXRhbWRidG4nKS5jbGljaygpO1xyXG4gICAgICB0aGlzLnBpZCA9IHVhW3RoaXMucGtmXTtcclxuICAgICAgdGhpcy5wYXJhT2JqWydmb3JtTm1lJ10gPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtc1snZnJtbm1lJ107XHJcbiAgICAgIHRoaXMuZ2V0RWRpdERhdGEodWFbdGhpcy5wa2ZdKTtcclxuICAgICAgdGhpcy5idG5OYW1lID0gJ0VkaXQnO1xyXG4gICAgfSBlbHNlIGlmIChhLmZvcm1fZmllbGQgPT0gJ2FkZEF0dHInKSB7XHJcbiAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG4gICAgICB0aGlzLmZvcm1GaWxkcyA9IFtdO1xyXG4gICAgICB0aGlzLmN1cmwgPSBhLmxvdl9xcnk7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFthLmxvdl9xcnkudHJpbSgpLCB0aGlzLnBrZiwgdWFbdGhpcy5wa2ZdXSk7XHJcbiAgICAgIHRoaXMud2hySyA9IHRoaXMucGtmO1xyXG4gICAgICB0aGlzLndoclYgPSB1YVt0aGlzLnBrZl07XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh1YSAmJiBjLnRyaW0oKSA9PSAnc3ViZm9ybScgJiYgYS5mb3JtX2ZpZWxkICE9IFwib3V0X21hcHBpbmdcIikge1xyXG4gICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgICAgdGhpcy5mb3JtRmlsZHMgPSBbXTtcclxuICAgICAgdGhpcy5jdXJsID0gYS5sb3ZfcXJ5O1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYS5sb3ZfcXJ5LnRyaW0oKSwgdGhpcy5wa2YsIHVhW3RoaXMucGtmXV0pO1xyXG4gICAgICB0aGlzLndocksgPSB0aGlzLnBrZjtcclxuICAgICAgdGhpcy53aHJWID0gdWFbdGhpcy5wa2ZdO1xyXG4gICAgfSBlbHNlIGlmICh1YSAmJiBjLnRyaW0oKSA9PSAnZGVsZXRlJykge1xyXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlYnRuJykuY2xpY2soKTtcclxuICAgICAgdGhpcy5waWQgPSB1YVt0aGlzLnBrZl07XHJcbiAgICAgIHRoaXMucGFyYU9ialsnZm9ybU5tZSddID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ2ZybW5tZSddO1xyXG4gICAgfSBlbHNlIGlmIChjLnRyaW0oKSA9PSAncG9wdXAnKSB7XHJcbiAgICAgIGRlYnVnZ2VyO1xyXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9wZGF0YW1kYnRuJykuY2xpY2soKTtcclxuICAgICAgdGhpcy5wYXJhT2JqWydmb3JtTm1lJ10gPSBhLmxvdl9xcnkuc3BsaXQoJy8nKVsyXTtcclxuICAgICAgdGhpcy53aHJLID0gdGhpcy5wa2Y7XHJcbiAgICAgIHRoaXMud2hyViA9IHVhW3RoaXMucGtmXTtcclxuICAgICAgdGhpcy5nZXRGb3JtRmllbGRzUG9wdXAoKTtcclxuICAgICAgdGhpcy5waWQgPSB1YVt0aGlzLnBrZl07XHJcbiAgICAgIHRoaXMuYnRuTmFtZSA9ICdBZGQnO1xyXG4gICAgfSBlbHNlIGlmIChjLnRyaW0oKSA9PSAnZGVmaW5hdGlvbicpIHtcclxuICAgICAgY29uc29sZS5sb2coYS5sb3ZfcXJ5LnRyaW0oKSwgdWFbdGhpcy5wa2ZdKVxyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYS5sb3ZfcXJ5LnRyaW0oKSwgdWFbdGhpcy5wa2ZdXSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChjLnRyaW0oKSA9PSAnc3ViZm9ybScgJiYgYS5mb3JtX2ZpZWxkID09IFwib3V0X21hcHBpbmdcIikge1xyXG4gICAgICB0aGlzLmxvYWRQcm9kdWN0TWFzdGVyTWFwcGluZyh1YVsnYXR0cl9pZG4nXSk7XHJcbiAgICAgIHRoaXMuYXR0TWFwTW9kZWxUaXRsZSA9IHVhLmRpc3BsYXk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsb2FkUHJvZHVjdE1hc3Rlck1hcHBpbmcoYXR0cklkbikge1xyXG4gICAgdGhpcy5wcm9kdWN0TWFzQXR0cklkID0gYXR0cklkbjtcclxuICAgIHRoaXMuc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG4gICAgbGV0IG9iaiA9IHt9O1xyXG4gICAgb2JqWydmb3JtTm1lJ10gPSAnZmlsZVVwbG9hZCc7XHJcbiAgICBvYmpbJ2F0dHJfaWRuJ10gPSBhdHRySWRuO1xyXG4gICAgdGhpcy5oZWFkZXJbJ21ldGhvZCddID0gJ2xvYWRQcmRNYXN0ZXJNYXBwaW5nJ1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5zcy5TYXZlKG9iaiwgb3B0aW9ucywgJ2ZpbGVVcGxvYWQvbG9hZCcpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhyZXNwb25zZSk7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdDtcclxuICAgICAgICB0aGlzLmF0dHJEdGwgPSByZXN1bHQuYXR0ckR0bDtcclxuICAgICAgICB0aGlzLmF0dHJNYXBwaW5nRHRsID0gcmVzdWx0LmF0dHJNYXBwaW5nRHRsO1xyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9kdWN0TWFwTWFzTURidG4nKS5jbGljaygpO1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpXHJcbiAgICAgIH1cclxuICAgIH0pLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNhdmVQcm9kdWN0TWFzdGVyTWFwcGluZygpIHtcclxuICAgIHRoaXMuc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG4gICAgbGV0IG9iaiA9IHt9O1xyXG4gICAgb2JqWydmb3JtTm1lJ10gPSAnZmlsZVVwbG9hZCc7XHJcbiAgICBvYmpbJ2F0dHJfaWRuJ10gPSB0aGlzLnByb2R1Y3RNYXNBdHRySWQ7XHJcbiAgICBvYmpbJ2F0dHJEdGxNYXAnXSA9IHRoaXMuYXR0ck1hcHBpbmdEdGw7XHJcbiAgICB0aGlzLmhlYWRlclsnbWV0aG9kJ10gPSAndXBkYXRlUHJvZHVjdEF0dHInXHJcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShvYmopKTtcclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIHRoaXMuc3MuU2F2ZShvYmosIG9wdGlvbnMsICdmaWxlVXBsb2FkL2xvYWQnKS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy5wcm9kdWN0TWFwY2xzYnRuLm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihyZXNwb25zZS5tZXNzYWdlKVxyXG4gICAgICB9XHJcbiAgICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgIHRoaXMudG9hc3RyLmVycm9yKGVyci5tZXNzYWdlKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy9zaWRlIG5ldmlnYXRpb24gXHJcbiAgbmF2aWdhdGlvbkZ1bihuYXYsIGkpIHtcclxuICAgIHRoaXMuY0xpbmsgPSBpO1xyXG4gICAgdGhpcy53aHJLID0gbmF2LmNvbHVtbl9rZXkudHJpbSgpO1xyXG4gICAgdGhpcy53aHJWID0gbmF2LmZvcm1fZmllbGQudHJpbSgpO1xyXG4gICAgdGhpcy5uYXZmb3JtID0gbmF2Lmxvdl9xcnkudHJpbSgpO1xyXG4gICAgaWYgKHRoaXMuc3ViRnJtV3YgPT0gJycpIHtcclxuICAgICAgdGhpcy5zdWJGcm1XayA9IG51bGw7XHJcbiAgICAgIHRoaXMuc3ViRnJtV3YgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubmF2Zm9ybSAhPSAnJykge1xyXG4gICAgICBpZiAodGhpcy5uYXZmb3JtID09ICdhZGR0aW9uYWxEdGxNYXN0ZXInKSB7XHJcbiAgICAgICAgdGhpcy5hZGRGcm1ObWUgPSB0aGlzLm5hdmZvcm07XHJcbiAgICAgICAgdGhpcy5nZXROYW1lQXR0cih0aGlzLmFkZEZybU5tZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wYXJhT2JqWydmb3JtTm1lJ10gPSB0aGlzLm5hdmZvcm07XHJcbiAgICAgICAgdGhpcy5nZXRQYWdlRGVmaW5hdGlvbigpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmdldFBhZ2VEZWZpbmF0aW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vbG9hZCBlZGl0IHRhYmxlIGRhdGEgd2l0aCBkZWZhdWx0IHZhbHVlXHJcbiAgZ2V0RWRpdERhdGEocGlkKSB7XHJcbiAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIHRoaXMuZm9ybUZpbGRzID0gW107XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICB2YXIgcGFnZVRQID0gdGhpcy5wYWdlSW5mby5wYWdlX3R5cDtcclxuICAgIHJlcU9ialsnZm9ybU5tZSddID0gdGhpcy5wYWdlSW5mby5mb3JtX25tZTtcclxuICAgIHJlcU9ialsncHJpbWFyeUtleSddID0gdGhpcy5wYWdlSW5mby5wcmltYXJ5X2tleV9maWVsZDtcclxuICAgIHJlcU9ialsncGFnZVR5cCddID0gdGhpcy5wYWdlSW5mby5wYWdlX3R5cDtcclxuICAgIHJlcU9ialsnc2Vjb25kS2V5RmllbGQnXSA9IHRoaXMucGFnZUluZm8uc2Vjb25kX2tleV9maWVsZDtcclxuICAgIGlmICh0aGlzLnRiQ2VsbCAhPSBudWxsKSB7XHJcbiAgICAgIHJlcU9ialsnaW5MaW5lRWRpdENvbHVtbiddID0gdGhpcy50YkNlbGw7XHJcbiAgICB9XHJcbiAgICByZXFPYmpbJ3ByaW1hcnlJZCddID0gcGlkO1xyXG4gICAgaWYgKHBhZ2VUUCA9PSAnanNvbkZvcm0nKSB7XHJcbiAgICAgIHJlcU9ialsnd2hlcmVLZXlzJ10gPSB0aGlzLnBhZ2VJbmZvLndoZXJlX2NsYXVzZTtcclxuICAgICAgcmVxT2JqWyd3aGVyZVZsdXMnXSA9IHRoaXMud2hlcmVNYXBbdGhpcy5wYWdlSW5mby53aGVyZV9jbGF1c2VdO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVxT2JqKSk7XHJcbiAgICB0aGlzLmhlYWRlclsnbWV0aG9kJ10gPSAnbG9hZEFkZEVkaXQnO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5zcy5nZXRFZGl0RChyZXFPYmosIG9wdGlvbnMpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpO1xyXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09ICdTVUNDRVNTJyAmJiByZXNwb25zZS5tZXNzYWdlICE9ICdTVUNDRVNTJykge1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9O1xyXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09ICdTVUNDRVNTJykge1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIGlmICh0aGlzLnRiQ2VsbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGF0YW1kYnRuJykuY2xpY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mb3JtRmlsZHMgPSByZXNwb25zZS5mb3JtRmllbGRzO1xyXG4gICAgICAgIHRoaXMuZm9ybUZpbGRzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICBpZiAoZWxlbWVudC5mb3JtX2ZpZWxkX3R5cCA9PSAndGInKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0TG92TGlzdChlbGVtZW50LmZvcm1fZmllbGQsIGVsZW1lbnQucGFnZV9pdGVtX2lkbik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZWxlbWVudC5mb3JtX2ZpZWxkX3R5cCA9PSAncycpIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRMb3ZMaXN0KGVsZW1lbnQuZm9ybV9maWVsZCwgZWxlbWVudC5wYWdlX2l0ZW1faWRuKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChlbGVtZW50LmZvcm1fZmllbGRfdHlwID09ICdoZCcpIHtcclxuICAgICAgICAgICAgZWxlbWVudC5kZWZhdWx0X3ZhbHVlID0gdGhpcy53aGVyZU1hcFtlbGVtZW50LmZvcm1fZmllbGRdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGVsZW1lbnQuZm9ybV9maWVsZF90eXAgPT0gJ3NxJykge1xyXG4gICAgICAgICAgICB0aGlzLmdldFNlcXVlbmNlKGVsZW1lbnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGVsZW1lbnQuZHRhX3R5cCA9PSAnc2EnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0TG92TGlzdChlbGVtZW50LmZvcm1fZmllbGQsIGVsZW1lbnQucGFnZV9pdGVtX2lkbik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSlcclxuICAgICAgfVxyXG4gICAgfSkuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSlcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VxdWVuY2UoZWxlbWVudCkge1xyXG4gICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqWydzZXEnXSA9IGVsZW1lbnQubG92X3FyeTtcclxuICAgIHRoaXMuaGVhZGVyWydtZXRob2QnXSA9ICdnZXRTZXEnO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5zcy5nZXREYXRhKHJlcU9iaiwgb3B0aW9ucykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09ICdTVUNDRVNTJykge1xyXG4gICAgICAgIHZhciBzZXEgPSByZXNwb25zZS5zZXE7XHJcbiAgICAgICAgZWxlbWVudC5kZWZhdWx0X3ZhbHVlID0gc2VxO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpXHJcbiAgICAgIH1cclxuICAgIH0pLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSlcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy9sb2FkIGxvdiBkYXRhIGJ5IHBhc3NpbmcgcXVlcnkgdG8gaXRcclxuICBnZXRMb3ZMaXN0KHRibEYsIHBhZ2VfaXRlbV9pZG4pIHtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialsncGFnZV9pdGVtX2lkbiddID0gcGFnZV9pdGVtX2lkbjtcclxuICAgIHRoaXMuaGVhZGVyWydtZXRob2QnXSA9ICdnZXREYXRhQnlJdGVtSWRuJztcclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIHRoaXMuc3MuZ2V0RGF0YShyZXFPYmosIG9wdGlvbnMpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgICBkZWJ1Z2dlcjtcclxuICAgICAgICB0aGlzLmxvdnMgPSByZXNwb25zZS5rdi5tYXAob3B0aW9uID0+ICh7XHJcbiAgICAgICAgICB2YWx1ZTogb3B0aW9uLmssXHJcbiAgICAgICAgICBsYWJlbDogb3B0aW9uLnZcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgdGhpcy5zcWxBcnJheVt0YmxGXSA9IHRoaXMubG92cztcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyh0YmxGLCBzcWwsIHRoaXMubG92cyk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5zcWxBcnJheVt0YmxGXSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihyZXNwb25zZS5tZXNzYWdlKVxyXG4gICAgICB9XHJcbiAgICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vZGVsZXRlIHNwZWZpY2VmaWMgZGF0YSBsaXN0XHJcbiAgZGVsZXRlRGF0YUxpc3QoKSB7XHJcbiAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialsnZm9ybU5tZSddID0gdGhpcy5wYWdlSW5mby5mb3JtX25tZTtcclxuICAgIHJlcU9ialsncGFnZVR5cCddID0gdGhpcy5wYWdlSW5mby5wYWdlX3R5cDtcclxuICAgIHJlcU9ialsncHJpbWFyeUtleSddID0gdGhpcy5wYWdlSW5mby5wcmltYXJ5X2tleV9maWVsZDtcclxuICAgIHJlcU9ialsncHJpbWFyeUlkJ10gPSB0aGlzLnBpZDtcclxuICAgIHJlcU9ialsndGFibGVOYW1lJ10gPSB0aGlzLnBhZ2VJbmZvLnRhYmxlX25hbWU7XHJcbiAgICByZXFPYmpbJ3RybnNUeXBlJ10gPSAnREVMRVRFJztcclxuXHJcbiAgICB0aGlzLmhlYWRlclsnbWV0aG9kJ10gPSAnc2F2ZSc7XHJcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXFPYmopKTtcclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIHRoaXMuc3MuZGVsZXRlRGF0YShyZXFPYmosIG9wdGlvbnMpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgICB0aGlzLmdldFBhZ2VEZWZpbmF0aW9uKCk7XHJcbiAgICAgICAgdGhpcy5kZWxldGVjbHNidG4ubmF0aXZlRWxlbWVudC5jbGljaygpO1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpXHJcbiAgICAgIH1cclxuICAgIH0pLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vZHlhbmFtaWMgZnVuY2F0aW9uXHJcbiAgY2hrRnVuKGZsLCBmRGF0YSkge1xyXG4gICAgaWYgKGZsLnZhbGlkYXRpb25zID09ICcnIHx8IGZsLnZhbGlkYXRpb25zID09IG51bGwpIHsgcmV0dXJuIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoZmwudmFsaWRhdGlvbnMgPT0gJ3ZhbGlkYXRlUXVlcnknKSB7XHJcbiAgICAgICAgdGhpcy52YWxpZGF0ZVF1ZXJ5KGZsLCBmRGF0YSlcclxuICAgICAgfSBlbHNlIGlmIChmbC52YWxpZGF0aW9ucyA9PSAnaXNVbmlxdWUnKSB7XHJcbiAgICAgICAgdGhpcy5pc1VuaXF1ZShmbCwgZkRhdGEpO1xyXG4gICAgICB9IGVsc2UgaWYgKGZsLnZhbGlkYXRpb25zID09ICdzZXRuYW1lcHJpbnQnKSB7XHJcbiAgICAgICAgdGhpcy5zZXRuYW1lcHJpbnQoZmwsIGZEYXRhKTtcclxuICAgICAgfSBlbHNlIGlmIChmbC52YWxpZGF0aW9ucyA9PSAnc2V0ZmFjdG9yJykge1xyXG4gICAgICAgIHRoaXMuc2V0ZmFjdG9yKGZsLCBmRGF0YSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZmwuZm9ybV9maWVsZF90eXAgPT0gJ3MnKSB7XHJcbiAgICAgICAgaWYgKGZsLnZhbGlkYXRpb25zID09IG51bGwpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgbGV0IHNxID0gZmwudmFsaWRhdGlvbnMucmVwbGFjZSgvI1FWQUwvZywgZkRhdGEpO1xyXG4gICAgICAgIC8vIHRoaXMuZ2V0TG92TGlzdChmbC5jb2x1bW5fa2V5LCBzcSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vb24gc3VibWl0IGFjdGlvbiBjaGVja3MgdmFsaWRhdGlvblxyXG4gIG9uU3VibWl0KGZvcm1WYWwsIGJ0bikge1xyXG4gICAgZGVidWdnZXJcclxuICAgIHZhciB0ID0gT2JqZWN0LmtleXMoZm9ybVZhbC5mb3JtLmNvbnRyb2xzKS5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgZGVidWdnZXJcclxuICAgICAgY29uc3QgY29udHJvbCA9IGZvcm1WYWwuZm9ybS5nZXQoZmllbGQpO1xyXG4gICAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoeyBvbmx5U2VsZjogdHJ1ZSB9KTtcclxuICAgIH0pO1xyXG4gICAgaWYgKGZvcm1WYWwuZm9ybS52YWxpZCA9PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuYWRkZWRpdChmb3JtVmFsLnZhbHVlLCBidG4pO1xyXG4gICAgICAvLyAgdGhpcy5sb3dlcihmb3JtVmFsLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRuYW1lcHJpbnQoZmwsIGZEYXRhKSB7XHJcbiAgICBkZWJ1Z2dlclxyXG4gICAgbGV0IG5tZUlkbiA9IGZEYXRhO1xyXG4gICAgbGV0IGxpc3QgPSB0aGlzLnNxbEFycmF5W2ZsLmZvcm1fZmllbGRdIHx8IFtdO1xyXG4gICAgbGV0IG5td0R0bCA9IGxpc3QuZmluZCh4ID0+IHgudmFsdWUgPT0gbm1lSWRuKSB8fCAnJztcclxuICAgIGlmIChubXdEdGwgIT0gJycpIHtcclxuICAgICAgdGhpcy5mb3JtRmlsZHMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICBpZiAoZWxlbWVudC5mb3JtX2ZpZWxkID09ICdubWUnKVxyXG4gICAgICAgICAgZWxlbWVudC5kZWZhdWx0X3ZhbHVlID0gbm13RHRsLmxhYmVsXHJcbiAgICAgICAgaWYgKGVsZW1lbnQuZm9ybV9maWVsZCA9PSAncHJpbnRfbm1lJylcclxuICAgICAgICAgIGVsZW1lbnQuZGVmYXVsdF92YWx1ZSA9IG5td0R0bC5sYWJlbFxyXG5cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRmYWN0b3IoZmwsIGZEYXRhKSB7XHJcbiAgICBsZXQgZmN0ciA9IC0xO1xyXG4gICAgaWYgKGZEYXRhID09ICdpbmNvbWUnIHx8IGZEYXRhID09ICdhc3NldHMnKVxyXG4gICAgICBmY3RyID0gMTtcclxuICAgIHRoaXMuZm9ybUZpbGRzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIGlmIChlbGVtZW50LmZvcm1fZmllbGQgPT0gJ2ZjdHInKVxyXG4gICAgICAgIGVsZW1lbnQuZGVmYXVsdF92YWx1ZSA9IGZjdHJcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25Qb3B1cFN1Ym1pdChmb3JtVmFsLCBidG4pIHtcclxuICAgIGRlYnVnZ2VyXHJcbiAgICB2YXIgdCA9IE9iamVjdC5rZXlzKGZvcm1WYWwuZm9ybS5jb250cm9scykuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtVmFsLmZvcm0uZ2V0KGZpZWxkKTtcclxuICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKHsgb25seVNlbGY6IHRydWUgfSk7XHJcbiAgICB9KTtcclxuICAgIGlmIChmb3JtVmFsLmZvcm0udmFsaWQgPT0gdHJ1ZSkge1xyXG4gICAgICBkZWJ1Z2dlclxyXG4gICAgICB0aGlzLmFkZFBvcHVwRnJtKGZvcm1WYWwudmFsdWUsIGJ0bik7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG93ZXIodikge1xyXG4gICAgdmFyIGtleSwga2V5cyA9IE9iamVjdC5rZXlzKHYpO1xyXG4gICAgdmFyIG4gPSBrZXlzLmxlbmd0aDtcclxuICAgIHZhciBuZXdvYmogPSB7fVxyXG4gICAgd2hpbGUgKG4tLSkge1xyXG4gICAgICBrZXkgPSBrZXlzW25dO1xyXG4gICAgICBuZXdvYmpba2V5XSA9IHR5cGVvZiB2W2tleV0gPT0gXCJzdHJpbmdcIiA/IHZba2V5XS50b0xvd2VyQ2FzZSgpIDogdltrZXldO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy9zdWJtaXQgZGF0YVxyXG4gIGFkZGVkaXQodiwgYnRuKSB7XHJcbiAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHZhciBwYWdlVFAgPSB0aGlzLnBhZ2VJbmZvLnBhZ2VfdHlwLnRyaW0oKTtcclxuICAgIHJlcU9ialsnZm9ybU5tZSddID0gdGhpcy5wYWdlSW5mby5mb3JtX25tZTtcclxuICAgIHJlcU9ialsncHJpbWFyeUtleSddID0gdGhpcy5wYWdlSW5mby5wcmltYXJ5X2tleV9maWVsZDtcclxuICAgIHJlcU9ialsncGFnZVR5cCddID0gdGhpcy5wYWdlSW5mby5wYWdlX3R5cDtcclxuICAgIHJlcU9ialsnc2Vjb25kS2V5RmllbGQnXSA9IHRoaXMucGFnZUluZm8uc2Vjb25kX2tleV9maWVsZDtcclxuICAgIHJlcU9ialsncHJpbWFyeUlkJ10gPSB0aGlzLmJ0bk5hbWUgPT0gJ0FkZCcgPyAnJyA6IFwiXCIgKyB0aGlzLnBpZDtcclxuICAgIHJlcU9ialsndGFibGVOYW1lJ10gPSB0aGlzLnBhZ2VJbmZvLnRhYmxlX25hbWU7XHJcbiAgICByZXFPYmpbJ3RybnNUeXBlJ10gPSB0aGlzLmJ0bk5hbWUgPT0gJ0FkZCcgPyAnQUREJyA6ICdFRElUJztcclxuICAgIHJlcU9ialsnZGF0YVRybnNEdGwnXSA9IHY7XHJcbiAgICBpZiAocGFnZVRQID09ICdqc29uRm9ybScpIHtcclxuICAgICAgcmVxT2JqWyd3aGVyZUtleXMnXSA9IHRoaXMucGFnZUluZm8ud2hlcmVfY2xhdXNlO1xyXG4gICAgICByZXFPYmpbJ3doZXJlVmx1cyddID0gdGhpcy53aGVyZU1hcFt0aGlzLnBhZ2VJbmZvLndoZXJlX2NsYXVzZV07XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXFPYmopKTtcclxuICAgIHRoaXMuaGVhZGVyWydtZXRob2QnXSA9ICdzYXZlJztcclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHRoaXMuaGVhZGVyKSk7XHJcbiAgICB0aGlzLnNzLmFkZERhdGEocmVxT2JqLCBvcHRpb25zKS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICBkZWJ1Z2dlcjtcclxuICAgICAgICBpZiAodGhpcy5hY3Rpb24gPT0gJ25ld2NvbnRhY3QnKSB7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9jb250YWN0L21hc3Rlci9uYW1lTWFzdGVyL25tZV9pZG4vJyArIHJlc3BvbnNlLl9pZF0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hY3Rpb24gPT0gJ25ld2FjY2NvbnRhY3QnKSB7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9hY2NvdW50cy9jb250YWN0L21hc3Rlci9hY2NOYW1lTWFzdGVyL25tZV9pZG4vJyArIHJlc3BvbnNlLl9pZF0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hY3Rpb24gPT0gJ25ld2xlZGdlcicpIHtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2FjY291bnRzL2FkbWluL21hc3Rlci9sZWRnZXJNYXN0ZXIvbGVkZ2VyX2lkbi8nICsgcmVzcG9uc2UuX2lkXSk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnRiQ2VsbCA9IG51bGw7IHRoaXMuc2VhcmNoRiA9IG51bGw7XHJcbiAgICAgICAgICB0aGlzLmNsb3NlYnRuLm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcclxuICAgICAgICAgIGlmICh0aGlzLmFkZE5ldy5sb3ZfcXJ5ID09IG51bGwgfHwgdGhpcy5hZGROZXcubG92X3FyeSA9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJzdGF0ID09IFwicG9wdXBcIikge1xyXG4gICAgICAgICAgICAgIC8vIHRoaXMuc2V0U3lzU2V0dXAodGhpcy5jb2lkbik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5nZXRQYWdlRGVmaW5hdGlvbigpO1xyXG4gICAgICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuYWRkTmV3Lmxvdl9xcnksIHJlc3BvbnNlLl9pZF0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRiQ2VsbCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSlcclxuICAgICAgfVxyXG4gICAgfSkuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnRiQ2VsbCA9IG51bGw7XHJcbiAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSlcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkUG9wdXBGcm0odiwgYnRuKSB7XHJcbiAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIGRlYnVnZ2VyO1xyXG5cclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHZhciBwYWdlVFAgPSB0aGlzLnBvcHVwcGFnZUluZm8ucGFnZV90eXAudHJpbSgpO1xyXG4gICAgcmVxT2JqWydmb3JtTm1lJ10gPSB0aGlzLnBvcHVwcGFnZUluZm8uZm9ybV9ubWU7XHJcbiAgICByZXFPYmpbJ3ByaW1hcnlLZXknXSA9IHRoaXMucG9wdXBwYWdlSW5mby5wcmltYXJ5X2tleV9maWVsZDtcclxuICAgIHJlcU9ialsncGFnZVR5cCddID0gdGhpcy5wb3B1cHBhZ2VJbmZvLnBhZ2VfdHlwO1xyXG4gICAgcmVxT2JqWydzZWNvbmRLZXlGaWVsZCddID0gdGhpcy5wb3B1cHBhZ2VJbmZvLnNlY29uZF9rZXlfZmllbGQ7XHJcbiAgICByZXFPYmpbJ3ByaW1hcnlJZCddID0gJyc7Ly90aGlzLmJ0bk5hbWUgPT0gJ0FkZCcgPyAnJyA6IFwiXCIgKyB0aGlzLnBpZDtcclxuICAgIHJlcU9ialsndGFibGVOYW1lJ10gPSB0aGlzLnBvcHVwcGFnZUluZm8udGFibGVfbmFtZTtcclxuICAgIHJlcU9ialsndHJuc1R5cGUnXSA9ICdBREQnO1xyXG4gICAgcmVxT2JqWydkYXRhVHJuc0R0bCddID0gdjtcclxuICAgIGNvbnNvbGUubG9nKFwiYWRkXCIsIEpTT04uc3RyaW5naWZ5KHJlcU9iaikpO1xyXG4gICAgdGhpcy5oZWFkZXJbJ21ldGhvZCddID0gJ3NhdmUnO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5zcy5hZGREYXRhKHJlcU9iaiwgb3B0aW9ucykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09ICdTVUNDRVNTJykge1xyXG4gICAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIGRlYnVnZ2VyO1xyXG4gICAgICAgIHRoaXMuc2V0U3lzU2V0dXAodGhpcy5waWQpO1xyXG4gICAgICAgIHRoaXMucG9wY2xvc2VidG4ubmF0aXZlRWxlbWVudC5jbGljaygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpXHJcbiAgICAgIH1cclxuICAgIH0pLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgIHRoaXMudG9hc3RyLmVycm9yKGVyci5tZXNzYWdlKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRTeXNTZXR1cChjb0lkbikge1xyXG4gICAgZGVidWdnZXI7XHJcblxyXG4gICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqWydjb0lkbiddID0gY29JZG47XHJcbiAgICB0aGlzLmhlYWRlclsnbWV0aG9kJ10gPSAnY2xpZW50U2V0dXAnO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5zcy52YWxpZGF0ZShyZXFPYmosIG9wdGlvbnMsICdzeXN0ZW0vc2V0dXAnKS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BvcFJlc21vZGFsYnRuJykuY2xpY2soKTtcclxuICAgICAgICB0aGlzLlN5c3Jlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgfSkuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSlcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy92YWxpZGF0ZSBxdWVyeVxyXG4gIHZhbGlkYXRlUXVlcnkodGJsT2JqLCBmKSB7XHJcbiAgICBpZiAoZiA9PSAnJyB8fCBmID09IG51bGwpIHJldHVybjtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialsnc3FsJ10gPSBmO1xyXG4gICAgdGhpcy5oZWFkZXJbJ21ldGhvZCddID0gJ3ZhbGlkYXRlUXVlcnknO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVxT2JqKSk7XHJcbiAgICB0aGlzLnNzLnZhbGlkYXRlKHJlcU9iaiwgb3B0aW9ucywgJ3N5c3RlbS9hcHBwYWdlcycpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgICB0aGlzLm9uRXJyID0gJyc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy5vbkVyciA9IHRibE9iai5mb3JtX2ZpZWxkO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpXHJcbiAgICAgIH1cclxuICAgIH0pLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vdmFsaWRhdGUgdGhpcyBmaWVsZCB2YWx1ZSBpcyB1bmlxdWVcclxuICBpc1VuaXF1ZShkdGFPYmosIGlucHVWYWwpIHtcclxuICAgIGlmIChpbnB1VmFsID09ICcnIHx8IGlucHVWYWwgPT0gbnVsbCkgcmV0dXJuO1xyXG4gICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqWyd0YWJsZU5hbWUnXSA9IHRoaXMucGFnZUluZm8udGFibGVfbmFtZTtcclxuICAgIHJlcU9ialsnd2hlcmVLZXlzJ10gPSBkdGFPYmouZm9ybV9maWVsZDtcclxuICAgIHJlcU9ialsnd2hlcmVWbHVzJ10gPSBpbnB1VmFsO1xyXG4gICAgcmVxT2JqWydwcmltYXJ5S2V5J10gPSB0aGlzLnBhZ2VJbmZvLnByaW1hcnlfa2V5X2ZpZWxkO1xyXG4gICAgcmVxT2JqWydwcmltYXJ5SWQnXSA9IHRoaXMuYnRuTmFtZSA9PSAnQWRkJyA/ICcnIDogdGhpcy5waWQ7XHJcbiAgICB0aGlzLmhlYWRlclsnbWV0aG9kJ10gPSAndW5pcXVlQ29uUSc7XHJcbiAgICBsZXQgb3B0aW9ucyA9ICh7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcikgfSk7XHJcbiAgICB0aGlzLnNzLnZhbGlkYXRlKHJlcU9iaiwgb3B0aW9ucywgJ3N5c3RlbS9hcHBwYWdlcycpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgICB0aGlzLm9uRXJyID0gJyc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy5vbkVyciA9IGR0YU9iai5mb3JtX2ZpZWxkO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpXHJcbiAgICAgIH1cclxuICAgIH0pLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uUGFnZVNpemVDaGFuZ2UocCkge1xyXG4gICAgaWYgKHAgPT0gJ0FsbCcpIHtcclxuICAgICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMuZGF0YWxpc3QubGVuZ3RoO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wYWdlU2l6ZSA9IHA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL3NvcnRpbmdcclxuICBzZXRPcmRlcih2YWx1ZTogc3RyaW5nLCBpKSB7XHJcbiAgICB0aGlzLnNob3dhcnIgPSBpO1xyXG4gICAgaWYgKHRoaXMub3JkZXIgPT09IHZhbHVlKSB7XHJcbiAgICAgIHRoaXMucmV2ZXJzZSA9ICF0aGlzLnJldmVyc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLm9yZGVyID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvL2ZvciBzZXQgbnVsbCB0byB0YWJsZSBjZWxsXHJcbiAgY2xvc2VOdWxsID0gKCkgPT4gdGhpcy50YkNlbGwgPSBudWxsO1xyXG5cclxuICAvL2VkaXQgY2VsbCBvcGVuIG1vZGVsXHJcbiAgZWRpdENlbGwoZCwgdGJoKSB7XHJcbiAgICB0aGlzLmdsYk9iaiA9IGQ7XHJcbiAgICB0aGlzLnRiQ2VsbCA9IHRiaDtcclxuICAgIHRoaXMudGl0bGUgPSBkLnRpdGxlO1xyXG4gICAgdGhpcy5idG5OYW1lID0gJ0VkaXQnO1xyXG4gICAgdGhpcy5waWQgPSBkW3RoaXMucGtmXTtcclxuICAgIHRoaXMuZ2V0RWRpdERhdGEoZFt0aGlzLnBrZl0pO1xyXG4gIH1cclxuXHJcbiAgLy9sb2FkIG5tZSBhdHRyIGRhdGFcclxuICBnZXROYW1lQXR0cihmcm1ubWUpIHtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIGxldCBjdXN0T2JqID0ge307XHJcbiAgICByZXFPYmpbJ2Zvcm1ObWUnXSA9IGZybW5tZTtcclxuICAgIHJlcU9ialsnbm1lSWRuJ10gPSB0aGlzLndoclY7XHJcbiAgICB0aGlzLmhlYWRlclsnbWV0aG9kJ10gPSAnbG9hZE5tZUF0dHInO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5zcy52YWxpZGF0ZShyZXFPYmosIG9wdGlvbnMsICdzeXN0ZW0vYXBwcGFnZXMnKS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgdGhpcy51aUdycExpc3QgPSByZXNwb25zZS51aUdycExpc3Q7XHJcbiAgICAgICAgdGhpcy51aUdycExpc3REdGwgPSByZXNwb25zZS51aUdycExpc3REdGw7XHJcbiAgICAgICAgdGhpcy5kYXRhRHRsID0gcmVzcG9uc2UuZGF0YUR0bDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihyZXNwb25zZS5tZXNzYWdlKVxyXG4gICAgICB9XHJcbiAgICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgIHRoaXMudG9hc3RyLmVycm9yKGVyci5tZXNzYWdlKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvL3NhdmUgbm1lIGRhdGEgXHJcbiAgc2F2ZUZ1bihrLCB2KSB7XHJcbiAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIGxldCBzdWJPYmogPSB7fTtcclxuICAgIHN1Yk9ialtrXSA9IHY7XHJcbiAgICByZXFPYmpbJ2Zvcm1ObWUnXSA9IHRoaXMuYWRkRnJtTm1lO1xyXG4gICAgcmVxT2JqWydubWVJZG4nXSA9IHRoaXMud2hyVjtcclxuICAgIHJlcU9ialsnZGF0YVRybnNEdGwnXSA9IHN1Yk9iajtcclxuICAgIHRoaXMuaGVhZGVyWydtZXRob2QnXSA9ICdzYXZlTm1lQXR0cic7XHJcbiAgICBsZXQgb3B0aW9ucyA9ICh7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcikgfSk7XHJcbiAgICB0aGlzLnNzLmFkZERhdGEocmVxT2JqLCBvcHRpb25zKS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcyhyZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihyZXNwb25zZS5tZXNzYWdlKVxyXG4gICAgICB9XHJcbiAgICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgIHRoaXMudG9hc3RyLmVycm9yKGVyci5tZXNzYWdlKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBsb2FkU3VnZ2RhdGEoc3RyLCBwYWdlX2l0ZW1faWRuLCBmb3JtX2ZpZWxkKSB7XHJcbiAgICBpZiAoc3RyID09IHVuZGVmaW5lZCB8fCBzdHIgPT0gJycgfHwgc3RyLmxlbmd0aCA8IDMpIHJldHVybjtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialtcImZvcm1ObWVcIl0gPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtc1tcImZybW5tZVwiXSB8fCAnbG9hZFN1Z2dlc3Rpb25EYXRhJztcclxuICAgIHJlcU9ialsncGFnZV9pdGVtX2lkbiddID0gcGFnZV9pdGVtX2lkbjtcclxuICAgIHJlcU9ialsnbGlrZVN0ciddID0gc3RyO1xyXG4gICAgdGhpcy5oZWFkZXJbJ21ldGhvZCddID0gJ2xvYWRTdWdnZXN0aW9uRGF0YUJ5SXRlbUlkbic7XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLmhlYWRlcik7XHJcbiAgICBsZXQgb3B0aW9ucyA9ICh7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcikgfSk7XHJcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXFPYmopKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuaGVhZGVyKTtcclxuICAgIHRoaXMuY3MubG9hZChyZXFPYmosIG9wdGlvbnMsIFwiY29udGFjdC9yZWdpc3RlckRhdGFcIikudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhyZXNwb25zZSk7XHJcbiAgICAgIGxldCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQ7XHJcbiAgICAgIGxldCBzdWdnZXN0aW9uRGF0YSA9IHJlc3VsdC5zdWdnZXN0aW9uRGF0YSB8fCBbXTtcclxuICAgICAgbGV0IGxpc3QgPSBzdWdnZXN0aW9uRGF0YS5tYXAob3B0aW9uID0+ICh7XHJcbiAgICAgICAgdmFsdWU6IG9wdGlvbi5rLFxyXG4gICAgICAgIGxhYmVsOiBvcHRpb24udlxyXG4gICAgICB9KSk7XHJcbiAgICAgIHRoaXMuc3FsQXJyYXlbZm9ybV9maWVsZF0gPSBsaXN0O1xyXG4gICAgfSlcclxuXHJcbiAgfVxyXG5cclxuICAvLyBmbCA9IFwic2VsZWN0IHRhYmxlX2NhdGFsb2d8fCcgJ3x8dGFibGVfbmFtZSBrICwgdGFibGVfbmFtZSB2IGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyB3aGVyZSB0YWJsZV9zY2hlbWEgPSAncHVibGljJyBhbmQgdGFibGVfdHlwZSA9ICdCQVNFIFRBQkxFJyAgYW5kIHRhYmxlX25hbWUgbGlrZSAnI0lOUFVUJScgYW5kIHRhYmxlX25hbWU9Q09BTEVTQ0UobnVsbCx0YWJsZV9uYW1lKSBvcmRlciBieSAxO1wiXHJcblxyXG4gIC8vIHN1Z2dlc3REYXRhOmFueSA9IFtdO1xyXG5cclxuICAvLyBnZXRTdWdnZXRpb24oc2NUKSB7XHJcbiAgLy8gICBpZiAoc2NUID09ICcnIHx8IHNjVCA9PSBudWxsKSByZXR1cm47XHJcbiAgLy8gICBsZXQgc3EgPSB0aGlzLmZsLnJlcGxhY2UoLyNJTlBVVC9nLCBzY1QpO1xyXG4gIC8vICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gIC8vICAgcmVxT2JqWydzcWwnXSA9IHNxO1xyXG4gIC8vICAgdGhpcy5oZWFkZXJbJ21ldGhvZCddID0gJ2dldERhdGEnO1xyXG4gIC8vICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gIC8vICAgdGhpcy5zcy52YWxpZGF0ZShyZXFPYmosIG9wdGlvbnMpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAvLyAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAvLyAgICAgICB0aGlzLnN1Z2dlc3REYXRhID0gcmVzcG9uc2Uua3Y7XHJcbiAgLy8gICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgLy8gICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSlcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfSkuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgLy8gICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gIC8vICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSlcclxuICAvLyAgIH0pO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gbmEoKXtcclxuICAvLyAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gIC8vICAgdGhpcy5zdWdnZXN0RGF0YSA9IFtdO1xyXG4gIC8vIH1cclxuXHJcblxyXG4gIC8vaGlkZSBzaG93IHBhc3N3b3JkIGZpZWxkIHRleHRcclxuXHJcbiAgc2hvd0hJZGVQYXNzKCkge1xyXG4gICAgdGhpcy5lc3RzdCA9ICF0aGlzLmVzdHN0O1xyXG4gICAgaWYgKHRoaXMuZXN0c3QpIHtcclxuICAgICAgdGhpcy5ldmVDID0gJ2ZhLWV5ZSc7XHJcbiAgICAgIHRoaXMuaW5wdXR0eXBlID0gJ3RleHQnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ldmVDID0gJ2ZhLWV5ZS1zbGFzaCc7XHJcbiAgICAgIHRoaXMuaW5wdXR0eXBlID0gJ3Bhc3N3b3JkJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vcmVzZXRpbmcgZm9ybVxyXG4gIHJlc2V0ID0gdiA9PiB2LmZvcm0ucmVzZXQoKTtcclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvL2dsb2JsZSBoZWFkZXIgcGFyYW1ldGVyXHJcbiAgICBsZXQgbWRsayA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21kbEtleScpKTtcclxuICAgIGxldCBtZGxLZXkgPSBPYmplY3Qua2V5cyhtZGxrKTtcclxuICAgIHRoaXMuY1VybCA9IHRoaXMucm91dGVyLnVybDtcclxuICAgIHRoaXMuaGVhZGVyID0ge1xyXG4gICAgICAnY2xpZW50a2V5JzogQ29va2llLmdldCgnX2NrJyksXHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdtb2R1bGVrZXknOiBtZGxrW3RoaXMuY1VybC5zcGxpdCgnLycpWzFdXSxcclxuICAgICAgJ2xvZ2luaWQnOiBDb29raWUuZ2V0KCdfbG9naWQnKSxcclxuICAgICAgJ3NvdXJjZSc6ICdxcydcclxuICAgIH07XHJcbiAgICBsZXQgY29tcGFueUR0bCA9IEpTT04ucGFyc2UoQ29va2llLmdldCgnX2FjY0NvbXBhbnknKSkgfHwge307XHJcbiAgICBsZXQgeWVhckR0bCA9IEpTT04ucGFyc2UoQ29va2llLmdldCgnX2FjY3llYXInKSkgfHwge307XHJcbiAgICBsZXQgc3ViX2NvX2lkbiA9IChjb21wYW55RHRsW1wic3ViX2NvX2lkblwiXSB8fCAnJykudG9TdHJpbmcoKTtcclxuICAgIGxldCBmaW5feWVhcl9pZG4gPSAoeWVhckR0bFtcImZpbl95ZWFyX2lkblwiXSB8fCAnJykudG9TdHJpbmcoKTtcclxuICAgIGlmIChzdWJfY29faWRuICE9ICcnKSB7XHJcbiAgICAgIHRoaXMuaGVhZGVyWydzdWJjb21pZG4nXSA9IHN1Yl9jb19pZG47XHJcbiAgICAgIHRoaXMuaGVhZGVyWyd5ZWFyaWRuJ10gPSBmaW5feWVhcl9pZG47XHJcbiAgICB9XHJcbiAgICAvL29uIGZvcm0gbmFtZSBjaGFuZ2VcclxuICAgIHRoaXMucm91dGUucGFyYW1zLnN1YnNjcmliZSgocGFyYW1zOiBQYXJhbXMpID0+IHtcclxuICAgICAgdGhpcy5zdWJGcm1XayA9IG51bGw7XHJcbiAgICAgIHRoaXMud2hySyA9IFwiMVwiO1xyXG4gICAgICB0aGlzLndoclYgPSBcIjFcIjtcclxuICAgICAgdGhpcy5wYXJhT2JqWydmb3JtTm1lJ10gPSBwYXJhbXNbJ2ZybW5tZSddO1xyXG4gICAgICB0aGlzLnNlYXJjaEYgPSBudWxsO1xyXG4gICAgICB0aGlzLmdldFBhZ2VEZWZpbmF0aW9uKCk7XHJcbiAgICAgIHRoaXMuY0xpbmsgPSAwO1xyXG4gICAgICB0aGlzLnAgPSAxO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxufVxyXG4vLyBpZiAodGhpcy53aHJWICE9IG51bGwgJiYgdGhpcy5zdWJGcm1XayAhPSBudWxsKSB7XHJcbi8vICAgaWYgKHRoaXMuc3ViRnJtV3YgIT0gJ0FMTCcpIHtcclxuLy8gICAgIHRoaXMucGFyYU9ialsnd2hlcmVLZXlzJ10gPSB0aGlzLndocksgKyAnficgKyB0aGlzLnN1YkZybVdrO1xyXG4vLyAgICAgdGhpcy5wYXJhT2JqWyd3aGVyZVZsdXMnXSA9ICcnICsgdGhpcy53aHJWICsgJ34nICsgdGhpcy5zdWJGcm1XdjtcclxuLy8gICB9IGVsc2Uge1xyXG4vLyAgICAgdGhpcy5wYXJhT2JqWyd3aGVyZUtleXMnXSA9IHRoaXMud2hySztcclxuLy8gICAgIHRoaXMucGFyYU9ialsnd2hlcmVWbHVzJ10gPSAnJyArIHRoaXMud2hyVjtcclxuLy8gICB9XHJcbi8vICAgdGhpcy53aGVyZU1hcFt0aGlzLnN1YkZybVdrXSA9IHRoaXMuc3ViRnJtV3Y7XHJcbi8vIH0iLCI8ZGl2IGNsYXNzPVwibXRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJwYW5lbCBwYW5lbC1kZWZhdWx0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmdcIj5cclxuICAgICAgICAgICAgPGgzIGNsYXNzPVwicGFuZWwtdGl0bGVcIj57e3BhZ2VJbmZvPy50aXRsZX19XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImYtMTJcIj4oe3tjRHQgfCBkYXRlOidtZWRpdW0nfX0pPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2gzPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cImFkZEJ0blwiIGNsYXNzPVwiYnRuIGJ0bi1pbmZvIHB1bGwtcmlnaHRcIiAqbmdJZj1cImFkZE5ldz8uaXNfY29tcHVsc29yeSA9PSAxXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ1c2VyQWN0aW9uKGRhdGEsICdhZGQnLCAnJyk7Zi5yZXNldCgpO1wiPnt7YWRkTmV3Py5mb3JtX2ZpZWxkX3RpdGxlfX08L2J1dHRvbj5cclxuXHJcblxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nSWY9XCJyb3V0ZXIudXJsICE9IGN1cmxcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIiAqbmdJZj1cIm5hdmlnYXRpb24ubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwgcGFuZWwtZGVmYXVsdFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cCBib3JkZXItYm90dG9tXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlJyA6aSA9PSBjTGlua31cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG5hdiBvZiBuYXZpZ2F0aW9uO2xldCBpPWluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0aW9uRnVuKG5hdixpKTtcIj57e25hdi5mb3JtX2ZpZWxkX3RpdGxlfX0gPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgW25nQ2xhc3NdPVwibmF2aWdhdGlvbi5sZW5ndGggPiAwID8gJ2NvbC1tZC0xMCcgOiAnY29sLW1kLTEyJ1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwgcGFuZWwtZGVmYXVsdFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNFwiPlxyXG4gICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwiZm9ybS1pbmxpbmUgcHVsbC1yaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4YW1wbGVJbnB1dE5hbWUyXCI+U2VhcmNoICZuYnNwOyZuYnNwOzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJleGFtcGxlSW5wdXROYW1lMlwiIG5hbWU9XCJzY2h0eHRcIiBbKG5nTW9kZWwpXT1cInNlYXJjaEZcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWlubGluZSBwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZGRsUGFnZXNpemVcIj5QYWdlIFNpemUgJm5ic3A7ICZuYnNwOzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBuYW1lPVwicGFnZVNpemVcIiBbKG5nTW9kZWwpXT1cInBhZ2VTaXplXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZShwYWdlU2l6ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJBbGxcIj5BbGw8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxMFwiPjEwPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMjVcIj4yNTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjUwXCI+NTA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxMDBcIj4xMDA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTVweCA0cHggMjBweDttYXJnaW4tbGVmdDogMTBweDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdG9nZ2xlPVwidG9vbHRpcFwiIGRhdGEtcGxhY2VtZW50PVwicmlnaHRcIiB0aXRsZT1cIlJlZnJlc2hcIiAoY2xpY2spPVwibmdPbkluaXQoKTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXJlZnJlc2hcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGxhYmVsPnt7ZGF0YWxpc3QubGVuZ3RofX08L2xhYmVsPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWlubGluZSBwdWxsLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4YW1wbGVJbnB1dE5hbWUyXCI+U2VhcmNoICZuYnNwOyZuYnNwOzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJleGFtcGxlSW5wdXROYW1lMlwiIG5hbWU9XCJzY2h0eHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtYm9yZGVyZWQgdGFibGUtaG92ZXIgdGFibGUtaG92ZXItY2VsbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5TUiBObzwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb248L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IHRiaCBvZiB0YmxIOyBsZXQgaSA9IGluZGV4IFwiIChjbGljayk9XCJzZXRPcmRlcih0YmgsaSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dGJsRGVzY1t0YmhdfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtoaWRkZW5dPVwicmV2ZXJzZVwiICpuZ0lmPVwic2hvd2FyciA9PT0gaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctZG93blwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtoaWRkZW5dPVwiIXJldmVyc2VcIiAqbmdJZj1cInNob3dhcnIgPT09IGlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFycm93LXVwXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0clxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF0YSBvZiBkYXRhbGlzdCB8IHNlYXJjaFBpcGU6c2VhcmNoRiB8IG9yZGVyQnk6IG9yZGVyOnJldmVyc2UgfCBwYWdpbmF0ZTogeyBpdGVtc1BlclBhZ2U6IHBhZ2VTaXplLCBjdXJyZW50UGFnZTogcCB9OyBsZXQgaSA9IGluZGV4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tpICsgMX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgZGF0YS10b2dnbGU9XCJkcm9wZG93blwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1pbmZvIGRyb3Bkb3duLXRvZ2dsZVwiPkFjdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmV0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgcm9sZT1cIm1lbnVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVzZXJBY3Rpb24oZGF0YSwgYWN0aW9uLmZvcm1fZmllbGRfdHlwLCBhY3Rpb24pO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YWN0aW9uLmZvcm1fZmllbGRfdGl0bGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCB0Ymggb2YgdGJsSDsgbGV0IGk9aW5kZXhcIiBvbi1tb3VzZW92ZXI9XCJob3ZlcmVkST1pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uLW1vdXNlbGVhdmU9XCJob3ZlcmVkST0tMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tkYXRhW3RiaF19fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uSG92ZXJEaXZcIiAqbmdJZj1cImk9PWhvdmVyZWRJXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKGNsaWNrKT1cImVkaXRDZWxsKGRhdGEsdGJoKTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtcGVuY2lsXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8cGFnaW5hdGlvbi1jb250cm9scyAocGFnZUNoYW5nZSk9XCJwID0gJGV2ZW50XCIgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+PC9wYWdpbmF0aW9uLWNvbnRyb2xzPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cImRhdGFtb2RhbFwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWxhYmVsbGVkYnk9XCJkZWZNb2RhbEhlYWRcIiBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgIGRhdGEtYmFja2Ryb3A9XCJzdGF0aWNcIiBkYXRhLWtleWJvYXJkPVwiZmFsc2VcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8Zm9ybSBjbGFzcz1cImZvcm0taG9yaXpvbnRhbFwiICNmPVwibmdGb3JtXCIgbmFtZT1cImFwcEZvcm1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIChjbGljayk9XCJjbG9zZU51bGwoKTtcIiAjY2xvc2VidG4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwiZGVmTW9kYWxIZWFkXCI+e3tidG5OYW1lfX0gUmVjb3JkPC9oND5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCIgKm5nRm9yPVwibGV0IGZsIG9mIGZvcm1GaWxkcyB8IG9yZGVyQnlQaXBlOiAnc3J0JzogJ2FzYydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmw/LmZvcm1fZmllbGRfdHlwID09ICd0JyAmJiBmbD8uaXNfaGlkZGVuID09IDAgJiYgZmw/LmR0YV90eXAgPT0nYycgfHwgZmw/LmR0YV90eXAgPT0ndCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTMgY29udHJvbC1sYWJlbFwiPnt7Zmw/LmZvcm1fZmllbGRfdGl0bGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiZmwuaXNfY29tcHVsc29yeSA9PSAxXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIChjaGFuZ2UpPVwicmVtb3ZlSW52YWxpZChmbClcIiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIG5hbWU9XCJ7e2ZsPy5mb3JtX2ZpZWxkfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZmw/LmRlZmF1bHRfdmFsdWVcIiBbKG5nTW9kZWwpXT1cImZsLmRlZmF1bHRfdmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdGV4dElucHV0PVwibmdNb2RlbFwiIChibHVyKT1cImNoa0Z1bihmbCxmbC5kZWZhdWx0X3ZhbHVlKTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3VuaXFFcnJNc2cnOiBmbD8uZm9ybV9maWVsZCA9PSBvbkVycn1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZmw/LmlzX2NvbXB1bHNvcnkgPT0gMVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gKGJsdXIpPVwidGhpc1tmbD8udmFsaWRhdGlvbnNdKGZsLmRlZmF1bHRfdmFsdWUpXCIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidGV4dElucHV0LmludmFsaWQgJiYgKHRleHRJbnB1dC5kaXJ0eSB8fCB0ZXh0SW5wdXQudG91Y2hlZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyIGNhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInRleHRJbnB1dC5lcnJvcnMucmVxdWlyZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tmbC5mb3JtX2ZpZWxkX3RpdGxlfX0gaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPVwidGV4dElucHV0LmVycm9ycy5taW5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7e2ZsLmZvcm1fZmllbGRfdGl0bGV9fSBtdXN0IGJlIGF0IGxlYXN0IHt7ZmwuZm9ybV9maWVsZF9taW5fbGVuZ3RofX0gY2hhcmFjdGVycyBsb25nLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInRleHRJbnB1dC5lcnJvcnMubWF4bGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3tmbC5mb3JtX2ZpZWxkX3RpdGxlfX0gTWF4bWltdW0gbGltaXQge3tmbC5mb3JtX2ZpZWxkX21heF9sZW5ndGh9fSBjaGFyYWN0ZXJzIGxvbmcuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmw/LmZvcm1fZmllbGRfdHlwID09ICd0JyAmJiBmbD8uaXNfaGlkZGVuID09IDAgJiYgZmw/LmR0YV90eXAgPT0nbidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTMgY29udHJvbC1sYWJlbFwiPnt7Zmw/LmZvcm1fZmllbGRfdGl0bGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiZmwuaXNfY29tcHVsc29yeSA9PSAxXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgbmFtZT1cInt7Zmw/LmZvcm1fZmllbGR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmbD8uZGVmYXVsdF92YWx1ZVwiIFsobmdNb2RlbCldPVwiZmwuZGVmYXVsdF92YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNudW1iZXJJbnB1dD1cIm5nTW9kZWxcIiBbcmVxdWlyZWRdPVwiZmw/LmlzX2NvbXB1bHNvcnkgPT0gMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gbWlubGVuZ3RoPXt7Zmw/LmZvcm1fZmllbGRfbWluX2xlbmd0aH19IG1heGxlbmd0aD17e2ZsPy5mb3JtX2ZpZWxkX21heF9sZW5ndGh9fS8gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJudW1iZXJJbnB1dC5pbnZhbGlkICYmIChudW1iZXJJbnB1dC5kaXJ0eSB8fCBudW1iZXJJbnB1dC50b3VjaGVkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXIgY2FcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibnVtYmVySW5wdXQuZXJyb3JzLnJlcXVpcmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZmwuZm9ybV9maWVsZF90aXRsZX19IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cIm51bWJlcklucHV0LmVycm9ycy5taW5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7e2ZsLmZvcm1fZmllbGRfdGl0bGV9fSBtdXN0IGJlIGF0IGxlYXN0IHt7ZmwuZm9ybV9maWVsZF9taW5fbGVuZ3RofX0gY2hhcmFjdGVycyBsb25nLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm51bWJlcklucHV0LmVycm9ycy5tYXhsZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7e2ZsLmZvcm1fZmllbGRfdGl0bGV9fSBNYXhtaW11bSBsaW1pdCB7e2ZsLmZvcm1fZmllbGRfbWF4X2xlbmd0aH19IGNoYXJhY3RlcnMgbG9uZy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmbD8uZm9ybV9maWVsZF90eXAgPT0gJ3B3JyAmJiBmbD8uaXNfaGlkZGVuID09IDAgJiYgZmw/LmR0YV90eXAgPT0ncHcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcIj57e2ZsPy5mb3JtX2ZpZWxkX3RpdGxlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImZsLmlzX2NvbXB1bHNvcnkgPT0gMVwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ7e2lucHV0dHlwZX19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcG9zcmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInt7Zmw/LmZvcm1fZmllbGR9fVwiIFt2YWx1ZV09XCJmbD8uZGVmYXVsdF92YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmwuZGVmYXVsdF92YWx1ZVwiICNwYXNzSW5wdXQ9XCJuZ01vZGVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImZsPy5pc19jb21wdWxzb3J5ID09IDFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEge3tldmVDfX0gZXllXCIgKGNsaWNrKT1cInNob3dISWRlUGFzcygpO1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAoYmx1cik9XCJ0aGlzW2ZsPy52YWxpZGF0aW9uc10oZmwuZGVmYXVsdF92YWx1ZSlcIiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwYXNzSW5wdXQuaW52YWxpZCAmJiAocGFzc0lucHV0LmRpcnR5IHx8IHBhc3NJbnB1dC50b3VjaGVkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXIgY2FcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGFzc0lucHV0LmVycm9ycy5yZXF1aXJlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2ZsLmZvcm1fZmllbGRfdGl0bGV9fSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiICpuZ0lmPVwiZmw/LmZvcm1fZmllbGRfdHlwID09ICd0JyAmJiBmbD8uZHRhX3R5cCA9PSdhJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXCI+e3tmbD8uZm9ybV9maWVsZF90aXRsZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJmbC5pc19jb21wdWxzb3J5ID09IDFcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWctaW5wdXQgWyhuZ01vZGVsKV09XCJmbC5kZWZhdWx0X3ZhbHVlXCIgbmFtZT1cInt7Zmw/LmZvcm1fZmllbGR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2RlbEFzU3RyaW5nc109XCJ0cnVlXCIgW2FsbG93RHVwZXNdPVwidHJ1ZVwiIFtlZGl0YWJsZV09J3RydWUnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFnLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiICpuZ0lmPVwiZmw/LmZvcm1fZmllbGRfdHlwID09ICd0JyAmJiBmbD8uZHRhX3R5cCA9PSdzYSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTMgY29udHJvbC1sYWJlbFwiPnt7Zmw/LmZvcm1fZmllbGRfdGl0bGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiZmwuaXNfY29tcHVsc29yeSA9PSAxXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctc2VsZWN0IFtvcHRpb25zXT1cInNxbEFycmF5W2ZsPy5mb3JtX2ZpZWxkXVwiIHN0eWxlPVwiei1pbmRleDo5O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmwuZGVmYXVsdF92YWx1ZVwiICNzYWZpZWxkPVwibmdNb2RlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmbD8uaXNfY29tcHVsc29yeSA9PSAxXCIgbmFtZT1cInt7Zmw/LmZvcm1fZmllbGR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCIgW2FsbG93Q2xlYXJdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI29wdGlvblRlbXBsYXRlIGxldC1vcHRpb249XCJvcHRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmYW1mYW1mYW0tZmxhZ3Mge3tvcHRpb24/LnZhbHVlfX1cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9uPy5sYWJlbH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bmctc2VsZWN0IFtpdGVtc109XCJzcWxBcnJheVtmbD8uZm9ybV9maWVsZF1cIiBbYWRkVGFnXT1cImFkZFRhZ1wiIGJpbmRWYWx1ZT1cImtcIiBtdWx0aXBsZT1cInRydWVcIiBiaW5kTGFiZWw9XCJ2XCIgbmFtZT1cInt7Zmw/LmZvcm1fZmllbGR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmwuZGVmYXVsdF92YWx1ZVwiICNzYWZpZWxkPVwibmdNb2RlbFwiIFtyZXF1aXJlZF09XCJmbD8uaXNfY29tcHVsc29yeSA9PSAxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzYWZpZWxkLmludmFsaWQgJiYgKHNhZmllbGQuZGlydHkgfHwgc2FmaWVsZC50b3VjaGVkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXIgY2FcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2FmaWVsZC5lcnJvcnMucmVxdWlyZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tmbC5mb3JtX2ZpZWxkX3RpdGxlfX0gaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZsPy5mb3JtX2ZpZWxkX3R5cCA9PSAndGEnICYmIGZsPy5pc19oaWRkZW4gPT0gMCAmJiBmbD8uZHRhX3R5cCA9PSdjJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXCI+e3tmbD8uZm9ybV9maWVsZF90aXRsZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJmbC5pc19jb21wdWxzb3J5ID09IDFcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJvd3M9XCIzXCIgbmFtZT1cInt7Zmw/LmZvcm1fZmllbGR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmbD8uZGVmYXVsdF92YWx1ZVwiIFsobmdNb2RlbCldPVwiZmwuZGVmYXVsdF92YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN0ZXh0QXJlYT1cIm5nTW9kZWxcIiAoYmx1cik9XCJjaGtGdW4oZmwsZmwuZGVmYXVsdF92YWx1ZSk7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyd1bmlxRXJyTXNnJzogZmw/LmZvcm1fZmllbGQgPT0gb25FcnJ9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImZsPy5pc19jb21wdWxzb3J5ID09IDFcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidGV4dEFyZWEuaW52YWxpZCAmJiAodGV4dEFyZWEuZGlydHkgfHwgdGV4dEFyZWEudG91Y2hlZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyIGNhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInRleHRBcmVhLmVycm9ycy5yZXF1aXJlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2ZsLmZvcm1fZmllbGRfdGl0bGV9fSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmw/LmZvcm1fZmllbGRfdHlwID09ICdoZCcgfHwgZmw/LmZvcm1fZmllbGRfdHlwID09ICdkZicgfHwgZmw/LmZvcm1fZmllbGRfdHlwID09ICdmaycgJiYgZmw/LmlzX2hpZGRlbiA9PSAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydtdDAnOiBmbD8uZm9ybV9maWVsZF90eXAgPT0gJ2hkJ31cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTMgY29udHJvbC1sYWJlbFwiPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIG5hbWU9XCJ7e2ZsPy5mb3JtX2ZpZWxkfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZmw/LmRlZmF1bHRfdmFsdWVcIiBbKG5nTW9kZWwpXT1cImZsLmRlZmF1bHRfdmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaGRmPVwibmdNb2RlbFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiAqbmdJZj1cImZsPy5mb3JtX2ZpZWxkX3R5cCA9PSAnc3EnICYmIGZsPy5pc19oaWRkZW4gPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXCI+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgbmFtZT1cInt7Zmw/LmZvcm1fZmllbGR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmbD8uZGVmYXVsdF92YWx1ZVwiIFsobmdNb2RlbCldPVwiZmwuZGVmYXVsdF92YWx1ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiAqbmdJZj1cImZsPy5mb3JtX2ZpZWxkX3R5cCA9PSAndGInICYmIGZsPy5pc19oaWRkZW4gPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXCI+e3tmbD8uZm9ybV9maWVsZF90aXRsZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJmbC5pc19jb21wdWxzb3J5ID09IDFcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjb2wtbWQtOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiIGRhdGEtdG9nZ2xlPVwiYnV0dG9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLW9uIGJ0bi14c1wiICpuZ0Zvcj1cImxldCBsb3Ygb2Ygc3FsQXJyYXlbZmwuZm9ybV9maWVsZF07bGV0IGk9aW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgW3ZhbHVlXT1cImxvdi5rXCIgaWQ9XCJ7e2l9fVwiIG5hbWU9XCJ7e2ZsPy5mb3JtX2ZpZWxkfX1cIiBbdmFsdWVdPVwiXCIgWyhuZ01vZGVsKV09XCJmbC5kZWZhdWx0X3ZhbHVlXCI+e3tsb3Yudn19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sIHNlbGVjdFwiIG5hbWU9XCJ7e2ZsPy5mb3JtX2ZpZWxkfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZmw/LmRlZmF1bHRfdmFsdWVcIiBbKG5nTW9kZWwpXT1cImZsLmRlZmF1bHRfdmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdGRmPVwibmdNb2RlbFwiIFtyZXF1aXJlZF09XCJmbD8uaXNfY29tcHVsc29yeSA9PSAnMSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgZHluYW1pYyBvZiBzcWxBcnJheVtmbC5mb3JtX2ZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cInt7ZHluYW1pYy52YWx1ZX19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2R5bmFtaWMubGFiZWx9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidGRmLmludmFsaWQgJiYgKHRkZi5kaXJ0eSB8fCB0ZGYudG91Y2hlZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyIGNhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInRkZi5lcnJvcnMucmVxdWlyZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tmbC5mb3JtX2ZpZWxkX3RpdGxlfX0gaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiAqbmdJZj1cImZsPy5mb3JtX2ZpZWxkX3R5cCA9PSAnbCcgJiYgZmw/LmlzX2hpZGRlbiA9PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcIj57e2ZsPy5mb3JtX2ZpZWxkX3RpdGxlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImZsLmlzX2NvbXB1bHNvcnkgPT0gMVwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbCBzZWxlY3RcIiBuYW1lPVwie3tmbD8uZm9ybV9maWVsZH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImZsPy5kZWZhdWx0X3ZhbHVlXCIgWyhuZ01vZGVsKV09XCJmbC5kZWZhdWx0X3ZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2xJbnB1dD1cIm5nTW9kZWxcIiBbcmVxdWlyZWRdPVwiZmw/LmlzX2NvbXB1bHNvcnkgPT0gJzEnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGxvdiBvZiBmbC5rdlwiIHZhbHVlPVwie3tsb3Yua319XCI+e3tsb3Yudn19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJsSW5wdXQuaW52YWxpZCAmJiAobElucHV0LmRpcnR5IHx8IGxJbnB1dC50b3VjaGVkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXIgY2FcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibElucHV0LmVycm9ycy5yZXF1aXJlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2ZsLmZvcm1fZmllbGRfdGl0bGV9fSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiICpuZ0lmPVwiZmw/LmZvcm1fZmllbGRfdHlwID09ICdsZCcgICYmIGZsPy5pc19oaWRkZW4gPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXCI+e3tmbD8uZm9ybV9maWVsZF90aXRsZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJmbC5pc19jb21wdWxzb3J5ID09IDFcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VsZWN0XCIgbmFtZT1cInt7Zmw/LmZvcm1fZmllbGR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmbD8uZGVmYXVsdF92YWx1ZVwiIFsobmdNb2RlbCldPVwiZmwuZGVmYXVsdF92YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNsZElucHV0PVwibmdNb2RlbFwiIFtyZXF1aXJlZF09XCJmbD8uaXNfY29tcHVsc29yeSA9PSAnMSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgZHluYW1pYyBvZiBzcWxBcnJheVtmbC5mb3JtX2ZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cInt7ZHluYW1pYy5rfX1cIj57e2R5bmFtaWMudn19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibGRJbnB1dC5pbnZhbGlkICYmIChsZElucHV0LmRpcnR5IHx8IGxkSW5wdXQudG91Y2hlZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyIGNhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImxkSW5wdXQuZXJyb3JzLnJlcXVpcmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZmwuZm9ybV9maWVsZF90aXRsZX19IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgKm5nSWY9XCJmbD8uZm9ybV9maWVsZF90eXAgPT0gJ3MnICYmIGZsPy5pc19oaWRkZW4gPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXCI+e3tmbD8uZm9ybV9maWVsZF90aXRsZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJmbC5pc19jb21wdWxzb3J5ID09IDFcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VsZWN0XCIgbmFtZT1cInt7Zmw/LmZvcm1fZmllbGR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmbD8uZGVmYXVsdF92YWx1ZVwiIFsobmdNb2RlbCldPVwiZmwuZGVmYXVsdF92YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiY2hrRnVuKGZsLGZsLmRlZmF1bHRfdmFsdWUpXCIgaWQ9XCJ7e2ZsLmNvbHVtbl9rZXl9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNzZmk9XCJuZ01vZGVsXCIgW3JlcXVpcmVkXT1cImZsPy5pc19jb21wdWxzb3J5ID09ICcxJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBkeW5hbWljIG9mIHNxbEFycmF5W2ZsLmZvcm1fZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwie3tkeW5hbWljLnZhbHVlfX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZHluYW1pYy5sYWJlbH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZmkuaW52YWxpZCAmJiAoc2ZpLmRpcnR5IHx8IHNmaS50b3VjaGVkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXIgY2FcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2ZpLmVycm9ycy5yZXF1aXJlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2ZsLmZvcm1fZmllbGRfdGl0bGV9fSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiAqbmdJZj1cImZsPy5mb3JtX2ZpZWxkX3R5cCA9PSAnc2InXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcIj57e2ZsPy5mb3JtX2ZpZWxkX3RpdGxlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImZsLmlzX2NvbXB1bHNvcnkgPT0gMVwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXNlbGVjdCBzdHlsZT1cInotaW5kZXg6IDU7XCIgW29wdGlvbnNdPVwic3FsQXJyYXlbZmwuZm9ybV9maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc2ZpPVwibmdNb2RlbFwiIFsobmdNb2RlbCldPVwiZmwuZGVmYXVsdF92YWx1ZVwiIG5hbWU9XCJ7e2ZsPy5mb3JtX2ZpZWxkfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwiY2hrRnVuKGZsLGZsLmRlZmF1bHRfdmFsdWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbHRlcklucHV0Q2hhbmdlZCk9XCJsb2FkU3VnZ2RhdGEoJGV2ZW50LGZsLnBhZ2VfaXRlbV9pZG4sZmwuZm9ybV9maWVsZClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNmaS5pbnZhbGlkICYmIChzZmkuZGlydHkgfHwgc2ZpLnRvdWNoZWQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlciBjYVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZmkuZXJyb3JzLnJlcXVpcmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZmwuZm9ybV9maWVsZF90aXRsZX19IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTFcIiAqbmdJZj1cImZsPy5mb3JtX2ZpZWxkX2ljb24gPT0gJ2FkZCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzIGJ0bi1yb3VuZGVkXCI+PHNwYW4+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtcGx1c1wiPjwvaT48L3NwYW4+PC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgYXBwQXBwTm9EYmxDbGljayBjbGFzcz1cImJ0biBidG4tc3VjY2Vzc1wiIChjbGljayk9XCJvblN1Ym1pdChmLHN1Ym1pdEJ0bilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgI3N1Ym1pdEJ0bj57e2J0bk5hbWV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJyZXNldFwiIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIiAoY2xpY2spPVwicmVzZXQoZilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJidG5OYW1lID09ICdBZGQnXCI+UmVzZXQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbFwiIGlkPVwiZGVsZXRlbW9kYWxcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1sYWJlbGxlZGJ5PVwic21hbGxNb2RhbEhlYWRcIiBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgIGRhdGEtYmFja2Ryb3A9XCJzdGF0aWNcIiBkYXRhLWtleWJvYXJkPVwiZmFsc2VcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLXNtXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgKGNsaWNrKT1cImNsb3NlTnVsbCgpO1wiICNkZWxldGVjbHNidG4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPkNsb3NlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCIgaWQ9XCJzbWFsbE1vZGFsSGVhZFwiPldhcm5pbmc8L2g0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIEFyZSB5b3Ugc3VyZSB3YW50IHRvIGRlbGV0ZT9cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5DbG9zZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVEYXRhTGlzdCgpO1wiPkRlbGV0ZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJwb3BkYXRhbW9kYWxcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1sYWJlbGxlZGJ5PVwiZGVmTW9kYWxIZWFkXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICBkYXRhLWJhY2tkcm9wPVwic3RhdGljXCIgZGF0YS1rZXlib2FyZD1cImZhbHNlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZ1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWhvcml6b250YWxcIiAjZnBvcD1cIm5nRm9ybVwiIG5hbWU9XCJhcHBGb3JtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiAoY2xpY2spPVwiY2xvc2VOdWxsKCk7XCIgI3BvcGNsb3NlYnRuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPkNsb3NlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cImRlZk1vZGFsSGVhZFwiPnt7YnRuTmFtZX19IFJlY29yZDwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiICpuZ0Zvcj1cImxldCBmbCBvZiBmb3JtRmlsZHNQb3B1cCB8IG9yZGVyQnlQaXBlOiAnc3J0JzogJ2FzYydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmw/LmZvcm1fZmllbGRfdHlwID09ICd0JyAmJiBmbD8uaXNfaGlkZGVuID09IDAgJiYgZmw/LmR0YV90eXAgPT0nYycgfHwgZmw/LmR0YV90eXAgPT0ndCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTMgY29udHJvbC1sYWJlbFwiPnt7Zmw/LmZvcm1fZmllbGRfdGl0bGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiZmwuaXNfY29tcHVsc29yeSA9PSAxXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIG5hbWU9XCJ7e2ZsPy5mb3JtX2ZpZWxkfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZmw/LmRlZmF1bHRfdmFsdWVcIiBbKG5nTW9kZWwpXT1cImZsLmRlZmF1bHRfdmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdGV4dElucHV0PVwibmdNb2RlbFwiIChibHVyKT1cImNoa0Z1bihmbCxmbC5kZWZhdWx0X3ZhbHVlKTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3VuaXFFcnJNc2cnOiBmbD8uZm9ybV9maWVsZCA9PSBvbkVycn1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZmw/LmlzX2NvbXB1bHNvcnkgPT0gJzEnXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInRleHRJbnB1dC5pbnZhbGlkICYmICh0ZXh0SW5wdXQuZGlydHkgfHwgdGV4dElucHV0LnRvdWNoZWQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlciBjYVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0ZXh0SW5wdXQuZXJyb3JzLnJlcXVpcmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZmwuZm9ybV9maWVsZF90aXRsZX19IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmw/LmZvcm1fZmllbGRfdHlwID09ICd0JyAmJiBmbD8uaXNfaGlkZGVuID09IDAgJiYgZmw/LmR0YV90eXAgPT0nbidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTMgY29udHJvbC1sYWJlbFwiPnt7Zmw/LmZvcm1fZmllbGRfdGl0bGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiZmwuaXNfY29tcHVsc29yeSA9PSAxXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgbmFtZT1cInt7Zmw/LmZvcm1fZmllbGR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmbD8uZGVmYXVsdF92YWx1ZVwiIFsobmdNb2RlbCldPVwiZmwuZGVmYXVsdF92YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNudW1iZXJJbnB1dD1cIm5nTW9kZWxcIiBbcmVxdWlyZWRdPVwiZmw/LmlzX2NvbXB1bHNvcnk9PTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIG1pbmxlbmd0aD17e2ZsPy5mb3JtX2ZpZWxkX21pbl9sZW5ndGh9fSBtYXhsZW5ndGg9e3tmbD8uZm9ybV9maWVsZF9tYXhfbGVuZ3RofX0vIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibnVtYmVySW5wdXQuaW52YWxpZCAmJiAobnVtYmVySW5wdXQuZGlydHkgfHwgbnVtYmVySW5wdXQudG91Y2hlZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyIGNhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm51bWJlcklucHV0LmVycm9ycy5yZXF1aXJlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2ZsLmZvcm1fZmllbGRfdGl0bGV9fSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmw/LmZvcm1fZmllbGRfdHlwID09ICdwdycgJiYgZmw/LmlzX2hpZGRlbiA9PSAwICYmIGZsPy5kdGFfdHlwID09J3B3J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXCI+e3tmbD8uZm9ybV9maWVsZF90aXRsZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJmbC5pc19jb21wdWxzb3J5ID09IDFcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwie3tpbnB1dHR5cGV9fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHBvc3JlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ7e2ZsPy5mb3JtX2ZpZWxkfX1cIiBbdmFsdWVdPVwiZmw/LmRlZmF1bHRfdmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZsLmRlZmF1bHRfdmFsdWVcIiAjcGFzc0lucHV0PVwibmdNb2RlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmbD8uaXNfY29tcHVsc29yeSA9PSAnMSdcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEge3tldmVDfX0gZXllXCIgKGNsaWNrKT1cInNob3dISWRlUGFzcygpO1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInBhc3NJbnB1dC5pbnZhbGlkICYmIChwYXNzSW5wdXQuZGlydHkgfHwgcGFzc0lucHV0LnRvdWNoZWQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlciBjYVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwYXNzSW5wdXQuZXJyb3JzLnJlcXVpcmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZmwuZm9ybV9maWVsZF90aXRsZX19IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgKm5nSWY9XCJmbD8uZm9ybV9maWVsZF90eXAgPT0gJ3QnICYmIGZsPy5kdGFfdHlwID09J2EnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcIj57e2ZsPy5mb3JtX2ZpZWxkX3RpdGxlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImZsLmlzX2NvbXB1bHNvcnkgPT0gMVwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWctaW5wdXQgWyhuZ01vZGVsKV09XCJmbC5kZWZhdWx0X3ZhbHVlXCIgbmFtZT1cInt7Zmw/LmZvcm1fZmllbGR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbW9kZWxBc1N0cmluZ3NdPVwidHJ1ZVwiIFthbGxvd0R1cGVzXT1cInRydWVcIiBbZWRpdGFibGVdPSd0cnVlJz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWctaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiAqbmdJZj1cImZsPy5mb3JtX2ZpZWxkX3R5cCA9PSAndCcgJiYgZmw/LmR0YV90eXAgPT0nc2EnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcIj57e2ZsPy5mb3JtX2ZpZWxkX3RpdGxlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImZsLmlzX2NvbXB1bHNvcnkgPT0gMVwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXNlbGVjdCBbb3B0aW9uc109XCJzcWxBcnJheVtmbD8uZm9ybV9maWVsZF1cIiBzdHlsZT1cInotaW5kZXg6OTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZsLmRlZmF1bHRfdmFsdWVcIiAjc2FmaWVsZD1cIm5nTW9kZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZmw/LmlzX2NvbXB1bHNvcnkgPT0gMVwiIG5hbWU9XCJ7e2ZsPy5mb3JtX2ZpZWxkfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwidHJ1ZVwiIFthbGxvd0NsZWFyXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNvcHRpb25UZW1wbGF0ZSBsZXQtb3B0aW9uPVwib3B0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmFtZmFtZmFtLWZsYWdzIHt7b3B0aW9uPy52YWx1ZS50b0xvd2VyQ2FzZSgpfX1cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9uPy5sYWJlbH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bmctc2VsZWN0IFtpdGVtc109XCJzcWxBcnJheVtmbC5mb3JtX2ZpZWxkXVwiIFthZGRUYWddPVwiYWRkVGFnXCIgYmluZFZhbHVlPVwia1wiIG11bHRpcGxlPVwidHJ1ZVwiIGJpbmRMYWJlbD1cInZcIiBuYW1lPVwie3tmbD8uZm9ybV9maWVsZH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmbC5kZWZhdWx0X3ZhbHVlXCIgI3NhZmllbGQ9XCJuZ01vZGVsXCIgW3JlcXVpcmVkXT1cImZsPy5pc19jb21wdWxzb3J5ID09ICcxJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2FmaWVsZC5pbnZhbGlkICYmIChzYWZpZWxkLmRpcnR5IHx8IHNhZmllbGQudG91Y2hlZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyIGNhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNhZmllbGQuZXJyb3JzLnJlcXVpcmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZmwuZm9ybV9maWVsZF90aXRsZX19IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmbD8uZm9ybV9maWVsZF90eXAgPT0gJ3RhJyAmJiBmbD8uaXNfaGlkZGVuID09IDAgJiYgZmw/LmR0YV90eXAgPT0nYydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTMgY29udHJvbC1sYWJlbFwiPnt7Zmw/LmZvcm1fZmllbGRfdGl0bGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiZmwuaXNfY29tcHVsc29yeSA9PSAxXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByb3dzPVwiM1wiIG5hbWU9XCJ7e2ZsPy5mb3JtX2ZpZWxkfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZmw/LmRlZmF1bHRfdmFsdWVcIiBbKG5nTW9kZWwpXT1cImZsLmRlZmF1bHRfdmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdGV4dEFyZWE9XCJuZ01vZGVsXCIgKGJsdXIpPVwiY2hrRnVuKGZsLGZsLmRlZmF1bHRfdmFsdWUpO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsndW5pcUVyck1zZyc6IGZsPy5mb3JtX2ZpZWxkID09IG9uRXJyfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmbD8uaXNfY29tcHVsc29yeSA9PSAnMSdcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidGV4dEFyZWEuaW52YWxpZCAmJiAodGV4dEFyZWEuZGlydHkgfHwgdGV4dEFyZWEudG91Y2hlZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyIGNhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInRleHRBcmVhLmVycm9ycy5yZXF1aXJlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2ZsLmZvcm1fZmllbGRfdGl0bGV9fSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmw/LmZvcm1fZmllbGRfdHlwID09ICdoZCcgfHwgZmw/LmZvcm1fZmllbGRfdHlwID09ICdkZicgfHwgZmw/LmZvcm1fZmllbGRfdHlwID09ICdmaycgJiYgZmw/LmlzX2hpZGRlbiA9PSAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydtdDAnOiBmbD8uZm9ybV9maWVsZF90eXAgPT0gJ2hkJ31cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTMgY29udHJvbC1sYWJlbFwiPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIG5hbWU9XCJ7e2ZsPy5mb3JtX2ZpZWxkfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZmw/LmRlZmF1bHRfdmFsdWVcIiBbKG5nTW9kZWwpXT1cImZsLmRlZmF1bHRfdmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaGRmPVwibmdNb2RlbFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiAqbmdJZj1cImZsPy5mb3JtX2ZpZWxkX3R5cCA9PSAnc3EnICYmIGZsPy5pc19oaWRkZW4gPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXCI+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgbmFtZT1cInt7Zmw/LmZvcm1fZmllbGR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmbD8uZGVmYXVsdF92YWx1ZVwiIFsobmdNb2RlbCldPVwiZmwuZGVmYXVsdF92YWx1ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiAqbmdJZj1cImZsPy5mb3JtX2ZpZWxkX3R5cCA9PSAndGInICYmIGZsPy5pc19oaWRkZW4gPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXCI+e3tmbD8uZm9ybV9maWVsZF90aXRsZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJmbC5pc19jb21wdWxzb3J5ID09IDFcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VsZWN0XCIgbmFtZT1cInt7Zmw/LmZvcm1fZmllbGR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmbD8uZGVmYXVsdF92YWx1ZVwiIFsobmdNb2RlbCldPVwiZmwuZGVmYXVsdF92YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN0ZGY9XCJuZ01vZGVsXCIgW3JlcXVpcmVkXT1cImZsPy5pc19jb21wdWxzb3J5ID09ICcxJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBkeW5hbWljIG9mIHNxbEFycmF5W2ZsLmZvcm1fZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwie3tkeW5hbWljLnZhbHVlfX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZHluYW1pYy5sYWJlbH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0ZGYuaW52YWxpZCAmJiAodGRmLmRpcnR5IHx8IHRkZi50b3VjaGVkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXIgY2FcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidGRmLmVycm9ycy5yZXF1aXJlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2ZsLmZvcm1fZmllbGRfdGl0bGV9fSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiICpuZ0lmPVwiZmw/LmZvcm1fZmllbGRfdHlwID09ICdsJyAmJiBmbD8uaXNfaGlkZGVuID09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTMgY29udHJvbC1sYWJlbFwiPnt7Zmw/LmZvcm1fZmllbGRfdGl0bGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiZmwuaXNfY29tcHVsc29yeSA9PSAxXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sIHNlbGVjdFwiIG5hbWU9XCJ7e2ZsPy5mb3JtX2ZpZWxkfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZmw/LmRlZmF1bHRfdmFsdWVcIiBbKG5nTW9kZWwpXT1cImZsLmRlZmF1bHRfdmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjbElucHV0PVwibmdNb2RlbFwiIFtyZXF1aXJlZF09XCJmbD8uaXNfY29tcHVsc29yeSA9PSAnMSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbG92IG9mIGZsLmt2XCIgdmFsdWU9XCJ7e2xvdi5rfX1cIj57e2xvdi52fX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImxJbnB1dC5pbnZhbGlkICYmIChsSW5wdXQuZGlydHkgfHwgbElucHV0LnRvdWNoZWQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlciBjYVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJsSW5wdXQuZXJyb3JzLnJlcXVpcmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZmwuZm9ybV9maWVsZF90aXRsZX19IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgKm5nSWY9XCJmbD8uZm9ybV9maWVsZF90eXAgPT0gJ2xkJyAgJiYgZmw/LmlzX2hpZGRlbiA9PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcIj57e2ZsPy5mb3JtX2ZpZWxkX3RpdGxlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImZsLmlzX2NvbXB1bHNvcnkgPT0gMVwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbCBzZWxlY3RcIiBuYW1lPVwie3tmbD8uZm9ybV9maWVsZH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImZsPy5kZWZhdWx0X3ZhbHVlXCIgWyhuZ01vZGVsKV09XCJmbC5kZWZhdWx0X3ZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2xkSW5wdXQ9XCJuZ01vZGVsXCIgW3JlcXVpcmVkXT1cImZsPy5pc19jb21wdWxzb3J5ID09ICcxJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBkeW5hbWljIG9mIHNxbEFycmF5W2ZsLmZvcm1fZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwie3tkeW5hbWljLmt9fVwiPnt7ZHluYW1pYy52fX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJsZElucHV0LmludmFsaWQgJiYgKGxkSW5wdXQuZGlydHkgfHwgbGRJbnB1dC50b3VjaGVkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXIgY2FcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibGRJbnB1dC5lcnJvcnMucmVxdWlyZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tmbC5mb3JtX2ZpZWxkX3RpdGxlfX0gaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiAqbmdJZj1cImZsPy5mb3JtX2ZpZWxkX3R5cCA9PSAncycgJiYgZmw/LmlzX2hpZGRlbiA9PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcIj57e2ZsPy5mb3JtX2ZpZWxkX3RpdGxlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImZsLmlzX2NvbXB1bHNvcnkgPT0gMVwiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbCBzZWxlY3RcIiBuYW1lPVwie3tmbD8uZm9ybV9maWVsZH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImZsPy5kZWZhdWx0X3ZhbHVlXCIgWyhuZ01vZGVsKV09XCJmbC5kZWZhdWx0X3ZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGtGdW4oZmwsZmwuZGVmYXVsdF92YWx1ZSlcIiBpZD1cInt7ZmwuY29sdW1uX2tleX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3NmaT1cIm5nTW9kZWxcIiBbcmVxdWlyZWRdPVwiZmw/LmlzX2NvbXB1bHNvcnkgPT0gJzEnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGR5bmFtaWMgb2Ygc3FsQXJyYXlbZmwuZm9ybV9maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJ7e2R5bmFtaWMudmFsdWV9fVwiPnt7ZHluYW1pYy5sYWJlbH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2ZpLmludmFsaWQgJiYgKHNmaS5kaXJ0eSB8fCBzZmkudG91Y2hlZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyIGNhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNmaS5lcnJvcnMucmVxdWlyZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tmbC5mb3JtX2ZpZWxkX3RpdGxlfX0gaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBhcHBBcHBOb0RibENsaWNrIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblBvcHVwU3VibWl0KGZwb3AscG9wc3VibWl0QnRuKVwiICNwb3BzdWJtaXRCdG4+QWRkPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInJlc2V0XCIgY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIChjbGljayk9XCJyZXNldChmKVwiPlJlc2V0PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJwb3BSZXNtb2RhbFwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWxhYmVsbGVkYnk9XCJkZWZNb2RhbEhlYWRcIiBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgIGRhdGEtYmFja2Ryb3A9XCJzdGF0aWNcIiBkYXRhLWtleWJvYXJkPVwiZmFsc2VcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8Zm9ybSBjbGFzcz1cImZvcm0taG9yaXpvbnRhbFwiIG5hbWU9XCJhcHBGb3JtcmVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiAoY2xpY2spPVwiY2xvc2VOdWxsKCk7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwicG9wTW9kYWxIZWFkXCI+IFJlY29yZDwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgKm5nRm9yPVwibGV0IHJlcyBvZiBTeXNyZXN1bHRcIj57e3Jlc319PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5DbG9zZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuXHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJwcm9kdWN0TWFwTWFzTURcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1sYWJlbGxlZGJ5PVwic21hbGxNb2RhbEhlYWRcIiBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgIGRhdGEtYmFja2Ryb3A9XCJzdGF0aWNcIiBkYXRhLWtleWJvYXJkPVwiZmFsc2VcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLXNtIG13aWR0aFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIChjbGljayk9XCJjbG9zZU51bGwoKTtcIiAjcHJvZHVjdE1hcGNsc2J0bj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cInNtYWxsTW9kYWxIZWFkXCI+UHJvZHVjdCBNYXBwaW5nIG9mJm5ic3A7e3thdHRNYXBNb2RlbFRpdGxlfX08L2g0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLWJvcmRlcmVkIHRhYmxlLWhvdmVyIHRhYmxlLWhvdmVyLWNlbGxzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQga2V5IG9mIGF0dHJEdGw/LnBycExpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7a2V5LnByaW50fX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImF0dHJNYXBwaW5nRHRsW2tleT8udmFsXVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5DbG9zZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc3VjY2Vzc1wiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzYXZlUHJvZHVjdE1hc3Rlck1hcHBpbmcoKTtcIiAjcHJvZHVjdE1hcGNsc2J0bj5TYXZlPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgPGJ1dHRvbiBpZD1cImRlbGV0ZWJ0blwiIFtoaWRkZW5dPVwidHJ1ZVwiIGRhdGEtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLXRhcmdldD1cIiNkZWxldGVtb2RhbFwiPjwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBpZD1cImRhdGFtZGJ0blwiIFtoaWRkZW5dPVwidHJ1ZVwiIGRhdGEtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLXRhcmdldD1cIiNkYXRhbW9kYWxcIj48L2J1dHRvbj5cclxuICAgIDxidXR0b24gaWQ9XCJjbHNNZFwiIFtoaWRkZW5dPVwidHJ1ZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgZGF0YS10YXJnZXQ9XCIjZGF0YW1vZGFsXCI+PC9idXR0b24+XHJcbiAgICA8YnV0dG9uIGlkPVwicG9wZGF0YW1kYnRuXCIgW2hpZGRlbl09XCJ0cnVlXCIgZGF0YS10b2dnbGU9XCJtb2RhbFwiIGRhdGEtdGFyZ2V0PVwiI3BvcGRhdGFtb2RhbFwiPjwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBpZD1cInBvcFJlc21vZGFsYnRuXCIgW2hpZGRlbl09XCJ0cnVlXCIgZGF0YS10b2dnbGU9XCJtb2RhbFwiIGRhdGEtdGFyZ2V0PVwiI3BvcFJlc21vZGFsXCI+PC9idXR0b24+XHJcbiAgICA8YnV0dG9uIGlkPVwicHJvZHVjdE1hcE1hc01EYnRuXCIgW2hpZGRlbl09XCJ0cnVlXCIgZGF0YS10b2dnbGU9XCJtb2RhbFwiIGRhdGEtdGFyZ2V0PVwiI3Byb2R1Y3RNYXBNYXNNRFwiPjwvYnV0dG9uPiJdfQ==
|