nsc-react-component 3.2.21 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,857 +0,0 @@
1
- const _excluded = ["children", "pageType", "onClick", "icon", "show"],
2
- _excluded2 = ["children", "pageType", "onClick", "icon", "recordShow"],
3
- _excluded3 = ["children", "pageType", "onClick", "recordShow", "icon", "show"],
4
- _excluded4 = ["children", "pageType", "onClick", "recordShow", "icon"],
5
- _excluded5 = ["store", "filterColumn", "actionColumn", "showRowSelection", "columnOrder", "expandable", "parantSelect"],
6
- _excluded6 = ["store", "showSearch", "titleAlias"];
7
- function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
8
- function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
9
- function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
10
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
11
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
12
- function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
13
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
14
- function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
15
- import React, { PureComponent } from "react";
16
- import Table from "../../base/table";
17
- import Tree from "../../base/tree";
18
- import Button from "../../base/button";
19
- import Modal from "../../base/modal";
20
- import Popover from "../../base/popover";
21
- import message from "../../base/message";
22
- import EditorForm from "./Form";
23
- import cls from "classnames";
24
- import "./index.module.less";
25
- import { utils } from "@bj-nsc/msn/lib/utils";
26
- import { DownOutlined, EyeOutlined, EditOutlined, RightOutlined, PlusOutlined, EllipsisOutlined, DeleteOutlined } from "@ant-design/icons";
27
- import { getLess } from "../../utils";
28
- import request from "nsc-request";
29
- import config from "../../config";
30
- import { getStorage } from "@bj-nsc/functions";
31
- import HeaderSearch from "../HeaderSearch";
32
- const styles = null;
33
- class BasePage extends PureComponent {
34
- constructor(props) {
35
- var _type, _size;
36
- super(props);
37
- _defineProperty(this, "tableRef", /*#__PURE__*/React.createRef());
38
- _defineProperty(this, "treeRef", /*#__PURE__*/React.createRef());
39
- _defineProperty(this, "searchRef", /*#__PURE__*/React.createRef());
40
- _defineProperty(this, "editorRef", /*#__PURE__*/React.createRef());
41
- _defineProperty(this, "dateFormat", {});
42
- _defineProperty(this, "onSelect", checkedTreeKeys => {
43
- const {
44
- name,
45
- userType,
46
- account
47
- } = this.state;
48
- const value = {
49
- name,
50
- userType,
51
- account,
52
- deptId: checkedTreeKeys[0]
53
- };
54
- if (this.props.onSearch) {
55
- this.props.onSearch(value);
56
- }
57
- // this.tableLoad(value);
58
- });
59
- _defineProperty(this, "getSelectedKey", selected => {
60
- let res = [];
61
- for (let key in selected) {
62
- const keys = selected[key];
63
- if (keys.length > 0) {
64
- res = [...res, ...keys];
65
- }
66
- }
67
- return res;
68
- });
69
- let {
70
- storePrefix
71
- } = config();
72
- let type = getStorage(storePrefix ? storePrefix + "-" + "formType" : "formType");
73
- type = (_type = type) === null || _type === void 0 ? void 0 : _type.content;
74
- let size = getStorage(storePrefix ? storePrefix + "-" + "tableSize" : "tableSize");
75
- size = (_size = size) === null || _size === void 0 ? void 0 : _size.content;
76
- this.state = {
77
- type: "add",
78
- selectedRowKeys: [],
79
- selectedRowDatas: [],
80
- treeSelectedKey: "",
81
- expand: false,
82
- formType: type || "modal",
83
- tableSize: size || "default",
84
- treeSearchPrams: {}
85
- };
86
- }
87
- componentDidMount() {
88
- const {
89
- initData
90
- } = this.props;
91
- initData && initData();
92
- }
93
- setSearchParams(params, callBack) {
94
- var _this$searchRef$curre;
95
- (_this$searchRef$curre = this.searchRef.current) === null || _this$searchRef$curre === void 0 || _this$searchRef$curre.setSearchParams(params);
96
- callBack && callBack(params);
97
- }
98
- //显示表单
99
- showForm(value) {
100
- var _this$editorRef$curre;
101
- let editorflag = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "add";
102
- (_this$editorRef$curre = this.editorRef.current) === null || _this$editorRef$curre === void 0 || _this$editorRef$curre.show(value, editorflag);
103
- }
104
-
105
- //关闭表单
106
- hideForm() {
107
- var _this$editorRef$curre2;
108
- (_this$editorRef$curre2 = this.editorRef.current) === null || _this$editorRef$curre2 === void 0 || _this$editorRef$curre2.hideForm();
109
- }
110
- setLoading(loading) {
111
- var _this$editorRef$curre3;
112
- (_this$editorRef$curre3 = this.editorRef.current) === null || _this$editorRef$curre3 === void 0 || _this$editorRef$curre3.setLoading(loading);
113
- }
114
- setEditFormValues(value) {
115
- var _this$editorRef$curre4;
116
- (_this$editorRef$curre4 = this.editorRef.current) === null || _this$editorRef$curre4 === void 0 || _this$editorRef$curre4.setFieldsValue(value);
117
- }
118
- getEditFormValues() {
119
- var _this$editorRef$curre5;
120
- return (_this$editorRef$curre5 = this.editorRef.current) === null || _this$editorRef$curre5 === void 0 ? void 0 : _this$editorRef$curre5.getFieldsValue();
121
- }
122
-
123
- //批量删除
124
- onDelete(data) {
125
- var _this$tableRef$curren;
126
- const {
127
- deleteUrl,
128
- onDelete,
129
- deleteParams,
130
- deletePosition = "toolbar"
131
- } = this.props;
132
- let _this = this;
133
- const selectedRowKeys = (_this$tableRef$curren = this.tableRef.current) === null || _this$tableRef$curren === void 0 ? void 0 : _this$tableRef$curren.getSelectedRowKeys();
134
- if (deletePosition == "toolbar") {
135
- if (selectedRowKeys.length == 0) {
136
- message.warning("请选择要删除的数据!");
137
- return;
138
- }
139
- }
140
- Modal.confirm({
141
- content: "是否确认删除所选项?",
142
- // centered:true,
143
- onOk: () => {
144
- if (onDelete) {
145
- onDelete && onDelete(deletePosition == "toolbar" ? selectedRowKeys : data);
146
- return;
147
- }
148
- if (!deleteUrl) {
149
- throw new Error("url不能为空!");
150
- }
151
- const defaultParams = {
152
- method: "post",
153
- autoPrefix: true,
154
- params: {
155
- ids: deletePosition == "toolbar" ? selectedRowKeys.join() : data.id
156
- }
157
- };
158
- let requestParams = {};
159
- if (defaultParams) {
160
- requestParams = _objectSpread({}, deleteParams);
161
- }
162
- requestParams = _objectSpread({}, defaultParams);
163
- request(deleteUrl, _objectSpread({}, requestParams)).then(function (res) {
164
- const {
165
- code
166
- } = res;
167
- if (code === 200) {
168
- var _this$searchRef, _this$props$onCallBac, _this$props$onCallBac2;
169
- message.success("删除成功!");
170
- let value = (_this$searchRef = _this.searchRef) === null || _this$searchRef === void 0 || (_this$searchRef = _this$searchRef.current) === null || _this$searchRef === void 0 ? void 0 : _this$searchRef.getSearchValues();
171
- ((_this$props$onCallBac = _this.props.onCallBacks) === null || _this$props$onCallBac === void 0 ? void 0 : _this$props$onCallBac.onDeleteCallBack) && ((_this$props$onCallBac2 = _this.props.onCallBacks) === null || _this$props$onCallBac2 === void 0 ? void 0 : _this$props$onCallBac2.onDeleteCallBack());
172
- _this.tableLoad(value);
173
- } else {
174
- message.error("删除失败!");
175
- }
176
- }).catch(function (error) {
177
- console.log("error", error);
178
- });
179
- }
180
- });
181
- }
182
- tableLoad(params) {
183
- var _this$tableRef$curren2;
184
- let requestConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
185
- (_this$tableRef$curren2 = this.tableRef.current) === null || _this$tableRef$curren2 === void 0 || _this$tableRef$curren2.store.load(_objectSpread(_objectSpread({}, requestConfig), {}, {
186
- params: params
187
- }));
188
- }
189
- //查询
190
- onSearch(params) {
191
- const {
192
- onSearch,
193
- onCallBacks
194
- } = this.props;
195
- if (onSearch) {
196
- onSearch(_objectSpread(_objectSpread({}, params), this.state.treeSearchPrams));
197
- return;
198
- }
199
- this.tableLoad(_objectSpread(_objectSpread({}, params), this.state.treeSearchPrams));
200
- (onCallBacks === null || onCallBacks === void 0 ? void 0 : onCallBacks.onSearchCallBack) && utils.callback(onCallBacks === null || onCallBacks === void 0 ? void 0 : onCallBacks.onSearchCallBack, this, [params]);
201
- }
202
- //表格重新加载
203
- tableReload() {
204
- var _this$tableRef$curren3;
205
- let params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
206
- let autoLoad = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
207
- (_this$tableRef$curren3 = this.tableRef.current) === null || _this$tableRef$curren3 === void 0 || (_this$tableRef$curren3 = _this$tableRef$curren3.store) === null || _this$tableRef$curren3 === void 0 || _this$tableRef$curren3.reload({
208
- callback: res => {
209
- var _res$data;
210
- if (autoLoad && (res === null || res === void 0 || (_res$data = res.data) === null || _res$data === void 0 || (_res$data = _res$data.records) === null || _res$data === void 0 ? void 0 : _res$data.length) == 0 && this.state.currentPage !== 1) {
211
- var _this$tableRef$curren4;
212
- (_this$tableRef$curren4 = this.tableRef.current) === null || _this$tableRef$curren4 === void 0 || (_this$tableRef$curren4 = _this$tableRef$curren4.store) === null || _this$tableRef$curren4 === void 0 || _this$tableRef$curren4.reload({
213
- params: _objectSpread({
214
- current: 1
215
- }, params)
216
- });
217
- }
218
- }
219
- });
220
- }
221
- getSelectedRowKeys() {
222
- var _this$tableRef$curren5;
223
- return (_this$tableRef$curren5 = this.tableRef.current) === null || _this$tableRef$curren5 === void 0 ? void 0 : _this$tableRef$curren5.getSelectedRowKeys();
224
- }
225
- getSelectedRowDatas() {
226
- var _this$tableRef$curren6;
227
- return (_this$tableRef$curren6 = this.tableRef.current) === null || _this$tableRef$curren6 === void 0 ? void 0 : _this$tableRef$curren6.getSelectedRowDatas();
228
- }
229
- resetSelectedRowKeys() {
230
- var _this$tableRef$curren7;
231
- return (_this$tableRef$curren7 = this.tableRef.current) === null || _this$tableRef$curren7 === void 0 ? void 0 : _this$tableRef$curren7.resetSelectedRowKeys();
232
- }
233
- getSearchValues() {
234
- var _this$searchRef2;
235
- const fromValue = (_this$searchRef2 = this.searchRef) === null || _this$searchRef2 === void 0 || (_this$searchRef2 = _this$searchRef2.current) === null || _this$searchRef2 === void 0 ? void 0 : _this$searchRef2.getSearchValues();
236
- return _objectSpread(_objectSpread({}, fromValue), this.state.treeSearchPrams);
237
- }
238
- getChildrenData(data) {
239
- let keys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
240
- const {
241
- tableProps
242
- } = this.props;
243
- const {
244
- rowKey = "id"
245
- } = tableProps;
246
- let resKey = [];
247
- if (data.childNodes) {
248
- const children = data.childNodes;
249
- children.map((item, index) => {
250
- if (item.childNodes) {
251
- this.getChildrenData(item.childNodes, keys);
252
- } else {
253
- resKey = [...keys, item[rowKey]];
254
- }
255
- });
256
- } else {
257
- resKey = [...keys, data[rowKey]];
258
- }
259
- return resKey;
260
- }
261
- renderToolButtons(toolbuttons) {
262
- let marginflag = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
263
- const flag = toolbuttons.length > 5;
264
- const {
265
- showSearch = true
266
- } = this.props;
267
- const content = toolbuttons.map((item, index) => {
268
- const _item$props = item.props,
269
- {
270
- children,
271
- pageType,
272
- onClick,
273
- icon,
274
- show
275
- } = _item$props,
276
- params = _objectWithoutProperties(_item$props, _excluded);
277
- if (index > 3) {
278
- return /*#__PURE__*/React.createElement("div", _extends({
279
- className: cls(getLess(styles, "nsc-basepage-editor"), getLess(styles, "nsc-basepage-content-item")),
280
- key: index,
281
- onClick: () => {
282
- onClick && onClick();
283
- }
284
- }, params), /*#__PURE__*/React.createElement("span", {
285
- className: getLess(styles, "nsc-basepage-icon")
286
- }, icon), /*#__PURE__*/React.createElement("span", {
287
- className: getLess(styles, "nsc-basepage-text")
288
- }, children));
289
- }
290
- });
291
- return /*#__PURE__*/React.createElement("div", {
292
- className: cls(getLess(styles, "nsc-basepage-tool-buttons"), {
293
- [getLess(styles, "nsc-basepage-tool-buttons-margin")]: !showSearch || marginflag
294
- }),
295
- style: {
296
- marginLeft: 0
297
- }
298
- }, toolbuttons.map((item, index) => {
299
- if (flag) {
300
- if (index < 4) {
301
- return /*#__PURE__*/React.createElement("div", {
302
- key: index
303
- }, item);
304
- } else if (index == 4) {
305
- return /*#__PURE__*/React.createElement(Popover, {
306
- content: content,
307
- title: null,
308
- placement: "bottom",
309
- trigger: ["click"],
310
- key: index
311
- // overlayClassName={styles['pop-box']}
312
- }, /*#__PURE__*/React.createElement(Button, {
313
- type: "primary"
314
- }, "\u66F4\u591A ", /*#__PURE__*/React.createElement(DownOutlined, null)));
315
- } else {
316
- return null;
317
- }
318
- } else {
319
- return /*#__PURE__*/React.createElement("div", {
320
- key: index
321
- }, item);
322
- }
323
- }));
324
- }
325
- renderCloumnButton(columnButtons, record) {
326
- const {
327
- actionPorps
328
- } = this.props;
329
- const {
330
- baseActionColumn
331
- } = config();
332
- const newButtons = [];
333
- let showIcon = true;
334
- if ((actionPorps === null || actionPorps === void 0 ? void 0 : actionPorps.showIcon) === false) showIcon = false;else if (baseActionColumn.showIcon === false) showIcon = false;
335
- columnButtons.map((item, index) => {
336
- const _item$props2 = item.props,
337
- {
338
- children,
339
- pageType,
340
- onClick,
341
- icon,
342
- recordShow
343
- } = _item$props2,
344
- params = _objectWithoutProperties(_item$props2, _excluded2);
345
- if (recordShow) {
346
- if (typeof recordShow == "string") {
347
- if (eval(recordShow)) {
348
- newButtons.push(item);
349
- }
350
- } else if (typeof recordShow == "function") {
351
- const show = recordShow(record);
352
- show && newButtons.push(item);
353
- }
354
- } else {
355
- newButtons.push(item);
356
- }
357
- });
358
- const flag = newButtons.length > 3;
359
- const content = newButtons.map((item, index) => {
360
- const _item$props3 = item.props,
361
- {
362
- children,
363
- pageType,
364
- onClick,
365
- recordShow,
366
- icon,
367
- show
368
- } = _item$props3,
369
- params = _objectWithoutProperties(_item$props3, _excluded3);
370
- if (index > 2) {
371
- return /*#__PURE__*/React.createElement("div", _extends({
372
- className: cls(getLess(styles, "nsc-basepage-editor"), getLess(styles, "nsc-basepage-content-item")),
373
- key: index,
374
- onClick: () => {
375
- onClick && onClick(record);
376
- }
377
- }, params), showIcon !== false && /*#__PURE__*/React.createElement("span", {
378
- className: getLess(styles, "nsc-basepage-icon")
379
- }, icon), /*#__PURE__*/React.createElement("span", {
380
- className: getLess(styles, "nsc-basepage-text")
381
- }, children));
382
- }
383
- });
384
- return newButtons.map((item, index) => {
385
- const _item$props4 = item.props,
386
- {
387
- children,
388
- pageType,
389
- onClick,
390
- recordShow,
391
- icon
392
- } = _item$props4,
393
- params = _objectWithoutProperties(_item$props4, _excluded4);
394
- if (flag) {
395
- if (index < 3) {
396
- return /*#__PURE__*/React.createElement("div", _extends({
397
- className: cls(getLess(styles, "nsc-basepage-editor"), {
398
- [getLess(styles, "nsc-basepage-editor-first")]: index === 0
399
- }),
400
- key: index,
401
- onClick: () => {
402
- onClick && onClick(record);
403
- }
404
- }, params), showIcon !== false && /*#__PURE__*/React.createElement("span", {
405
- className: getLess(styles, "nsc-basepage-icon")
406
- }, icon), /*#__PURE__*/React.createElement("span", {
407
- className: getLess(styles, "nsc-basepage-text")
408
- }, children));
409
- } else if (index == 3) {
410
- return /*#__PURE__*/React.createElement(Popover, {
411
- placement: "bottom",
412
- title: null,
413
- content: content,
414
- trigger: ["click"],
415
- key: index
416
- // overlayClassName={styles['pop']}
417
- }, /*#__PURE__*/React.createElement("div", {
418
- className: getLess(styles, "nsc-basepage-editor")
419
- }, /*#__PURE__*/React.createElement(EllipsisOutlined, null)));
420
- } else {
421
- return null;
422
- }
423
- } else {
424
- return /*#__PURE__*/React.createElement("div", _extends({
425
- className: cls(getLess(styles, "nsc-basepage-editor"), {
426
- [getLess(styles, "nsc-basepage-editor-first")]: index === 0
427
- }),
428
- key: index,
429
- onClick: () => {
430
- onClick && onClick(record);
431
- }
432
- }, params), showIcon !== false && /*#__PURE__*/React.createElement("span", {
433
- className: getLess(styles, "nsc-basepage-icon")
434
- }, icon), /*#__PURE__*/React.createElement("span", {
435
- className: getLess(styles, "nsc-basepage-text")
436
- }, children));
437
- }
438
- });
439
- // }
440
- }
441
- //树点击事件
442
- treeSelect(selectedKeys, obj) {
443
- var _this$searchRef3, _this$props$onCallBac3, _this$props$onCallBac4;
444
- let keyword = "";
445
- const {
446
- searchKey = "key",
447
- searchField = "",
448
- parantSelect = true
449
- } = this.props.treeProps;
450
- const {
451
- treeSelectedKey
452
- } = this.state;
453
- const {
454
- selected,
455
- selectedNodes
456
- } = obj;
457
- if (selected) {
458
- keyword = selectedNodes[0].dataref.attribute[searchKey];
459
- if (parantSelect) {
460
- this.setState({
461
- treeSelectedKey: selectedKeys[0],
462
- treeSearchPrams: {
463
- [searchField]: keyword
464
- }
465
- });
466
- } else {
467
- if (selectedNodes[0].isLeaf || !selectedNodes[0].children) {
468
- if (selectedKeys[0] !== treeSelectedKey) {
469
- this.setState({
470
- treeSelectedKey: selectedKeys[0],
471
- treeSearchPrams: {
472
- [searchField]: keyword
473
- }
474
- });
475
- }
476
- }
477
- }
478
- } else {
479
- this.setState({
480
- treeSelectedKey: keyword,
481
- treeSearchPrams: {}
482
- });
483
- }
484
- if (this.props.onTreeSelect) {
485
- this.props.onTreeSelect(selectedKeys, obj);
486
- return;
487
- }
488
- const fromValue = ((_this$searchRef3 = this.searchRef) === null || _this$searchRef3 === void 0 || (_this$searchRef3 = _this$searchRef3.current) === null || _this$searchRef3 === void 0 ? void 0 : _this$searchRef3.getSearchValues()) || {};
489
- searchField && this.tableLoad(_objectSpread(_objectSpread({}, fromValue), {}, {
490
- [searchField]: keyword
491
- }));
492
- ((_this$props$onCallBac3 = this.props.onCallBacks) === null || _this$props$onCallBac3 === void 0 ? void 0 : _this$props$onCallBac3.treeSelectCallBack) && utils.callback((_this$props$onCallBac4 = this.props.onCallBacks) === null || _this$props$onCallBac4 === void 0 ? void 0 : _this$props$onCallBac4.treeSelectCallBack, this, [selectedKeys, obj]);
493
- }
494
- resetSearch() {
495
- var _this$searchRef$curre2;
496
- (_this$searchRef$curre2 = this.searchRef.current) === null || _this$searchRef$curre2 === void 0 || _this$searchRef$curre2.resetFields();
497
- }
498
- getText(props, text) {
499
- var _props$data;
500
- let newText = text;
501
- if (props !== null && props !== void 0 && props.data && (props === null || props === void 0 || (_props$data = props.data) === null || _props$data === void 0 ? void 0 : _props$data.length) > 0) {
502
- let data = props.data;
503
- for (let i = 0; i < (data === null || data === void 0 ? void 0 : data.length); i++) {
504
- if (data[i].value == text) {
505
- newText = data[i].label;
506
- }
507
- }
508
- }
509
- return newText;
510
- }
511
- setTableData(data) {
512
- var _this$tableRef$curren8;
513
- (_this$tableRef$curren8 = this.tableRef.current) === null || _this$tableRef$curren8 === void 0 || (_this$tableRef$curren8 = _this$tableRef$curren8.store) === null || _this$tableRef$curren8 === void 0 || _this$tableRef$curren8.setData(data);
514
- }
515
- setTreeData(data) {
516
- var _this$treeRef$current;
517
- (_this$treeRef$current = this.treeRef.current) === null || _this$treeRef$current === void 0 || (_this$treeRef$current = _this$treeRef$current.store) === null || _this$treeRef$current === void 0 || _this$treeRef$current.setData(data);
518
- }
519
- render() {
520
- var _tableProps$toolbar, _tableProps$toolbar2;
521
- const {
522
- columns = [],
523
- showSearch = true,
524
- children,
525
- submitUrl = "",
526
- tableProps = {},
527
- treeProps = {},
528
- formProps = {},
529
- showLeft = false,
530
- submitParams = {},
531
- showToolButton = true,
532
- buttons = [],
533
- editorForm = true,
534
- onShowForm,
535
- formChangeValid = true,
536
- className,
537
- toolButtonPosition = "buttom",
538
- actionPorps,
539
- deletePosition = "toolbar"
540
- } = this.props;
541
- const {
542
- store,
543
- filterColumn = true,
544
- actionColumn = true,
545
- showRowSelection = true,
546
- columnOrder = true,
547
- expandable = {},
548
- parantSelect = true
549
- } = tableProps,
550
- othertableParams = _objectWithoutProperties(tableProps, _excluded5);
551
- const {
552
- store: treeStore = {},
553
- showSearch: treeSearch = true,
554
- titleAlias = "title"
555
- } = treeProps,
556
- othertreeParams = _objectWithoutProperties(treeProps, _excluded6);
557
- let tableParams = _objectSpread({
558
- filterColumn,
559
- store
560
- }, othertableParams);
561
- let tableColumn = [];
562
- const searchForms = [];
563
- const editorForms = [];
564
- const defaultValue = {};
565
- const columnButtons = [];
566
- columns.map(item => {
567
- var _temp$search, _temp$props, _temp$props2, _temp;
568
- let temp = _objectSpread({}, item);
569
- if (temp.search === true || ((_temp$search = temp.search) === null || _temp$search === void 0 ? void 0 : _temp$search.show) === true) {
570
- var _temp$search2, _temp$search3, _temp$search4;
571
- searchForms.push({
572
- name: temp.field || temp.dataIndex,
573
- label: ((_temp$search2 = temp.search) === null || _temp$search2 === void 0 ? void 0 : _temp$search2.label) || temp.title,
574
- type: temp.type,
575
- props: temp.props,
576
- labelCol: (_temp$search3 = temp.search) === null || _temp$search3 === void 0 ? void 0 : _temp$search3.labelCol,
577
- wrapperCol: (_temp$search4 = temp.search) === null || _temp$search4 === void 0 ? void 0 : _temp$search4.wrapperCol,
578
- rules: temp.searchRules ? temp.searchRules : []
579
- });
580
- }
581
- delete temp.search;
582
- temp.editor !== false && editorForms.push({
583
- name: temp.field || temp.dataIndex,
584
- label: temp.title,
585
- rules: temp.rules ? temp.rules : [],
586
- type: temp.type,
587
- span: temp.span,
588
- dictName: temp.dictName,
589
- props: _objectSpread({}, temp.props)
590
- });
591
- if (((_temp$props = temp.props) === null || _temp$props === void 0 ? void 0 : _temp$props.defaultValue) !== undefined && ((_temp$props2 = temp.props) === null || _temp$props2 === void 0 ? void 0 : _temp$props2.defaultValue) !== null) {
592
- var _temp$props3;
593
- const name = temp.field || temp.dataIndex;
594
- defaultValue[name] = (_temp$props3 = temp.props) === null || _temp$props3 === void 0 ? void 0 : _temp$props3.defaultValue;
595
- }
596
- delete temp.rules;
597
- delete temp.span;
598
- if (temp.columnSearch) {
599
- temp.filterProps = {
600
- type: temp.type,
601
- props: temp.props
602
- };
603
- }
604
- delete temp.type;
605
- let tempProp = _objectSpread({}, temp.props);
606
- if (temp.style) {
607
- temp = _objectSpread({
608
- render: text => {
609
- return /*#__PURE__*/React.createElement(React.Fragment, null, text !== "" && text !== null && text !== undefined && /*#__PURE__*/React.createElement("div", {
610
- className: getLess(styles, "nsc-basepage-col-back")
611
- }, /*#__PURE__*/React.createElement("span", {
612
- className: getLess(styles, "nsc-basepage-col-text")
613
- }, this.getText(tempProp, text))));
614
- }
615
- }, temp);
616
- } else if (!temp.ellipsis) {
617
- temp = _objectSpread({
618
- render: text => {
619
- return /*#__PURE__*/React.createElement(React.Fragment, null, this.getText(tempProp, text));
620
- }
621
- }, temp);
622
- } else {
623
- temp = _objectSpread({}, temp);
624
- }
625
- delete temp.props;
626
- if (((_temp = temp) === null || _temp === void 0 ? void 0 : _temp.columnShow) !== false) tableColumn.push(temp);
627
- });
628
- const selfButtons = [];
629
- const {
630
- baseActionColumn
631
- } = config();
632
- let showIcon = true;
633
- if ((actionPorps === null || actionPorps === void 0 ? void 0 : actionPorps.showIcon) === false) showIcon = false;else if (baseActionColumn.showIcon === false) showIcon = false;
634
- if (editorForm == true) {
635
- if (buttons.indexOf("search") > -1) {
636
- columnButtons.push( /*#__PURE__*/React.createElement(Button, {
637
- onClick: record => {
638
- if (onShowForm) {
639
- onShowForm(record.attribute || record, "detail");
640
- return;
641
- }
642
- this.showForm(record.attribute || record, "detail");
643
- },
644
- icon: /*#__PURE__*/React.createElement(EyeOutlined, null)
645
- }, "\u67E5\u770B"));
646
- }
647
- if (buttons.indexOf("editor") > -1) {
648
- columnButtons.push( /*#__PURE__*/React.createElement(Button, {
649
- onClick: record => {
650
- if (onShowForm) {
651
- onShowForm(record.attribute || record, "editor");
652
- return;
653
- }
654
- this.showForm(record.attribute || record, "editor");
655
- },
656
- icon: /*#__PURE__*/React.createElement(EditOutlined, null)
657
- }, "\u7F16\u8F91"));
658
- }
659
- }
660
- if (buttons.indexOf("add") > -1) {
661
- selfButtons.push( /*#__PURE__*/React.createElement(Button, {
662
- type: "primary",
663
- onClick: () => {
664
- const {
665
- onShowForm
666
- } = this.props;
667
- if (onShowForm) {
668
- onShowForm();
669
- return;
670
- }
671
- this.showForm();
672
- },
673
- icon: /*#__PURE__*/React.createElement(PlusOutlined, null)
674
- }, "\u6DFB\u52A0"));
675
- }
676
- if (buttons.indexOf("delete") > -1) {
677
- if (deletePosition == "toolbar") {
678
- selfButtons.push( /*#__PURE__*/React.createElement(Button
679
- // type={"primary"}
680
- , {
681
- onClick: this.onDelete.bind(this),
682
- icon: /*#__PURE__*/React.createElement(DeleteOutlined, null),
683
- danger: true
684
- }, "\u5220\u9664"));
685
- } else if (deletePosition == "row") {
686
- columnButtons.push( /*#__PURE__*/React.createElement(Button
687
- // type={"primary"}
688
- , {
689
- onClick: record => {
690
- this.onDelete(record);
691
- },
692
- icon: /*#__PURE__*/React.createElement(DeleteOutlined, null),
693
- danger: true
694
- }, "\u5220\u9664"));
695
- }
696
- }
697
- if (Array.isArray(children)) {
698
- children.map(item => {
699
- if (Array.isArray(item)) {
700
- item.map(child => {
701
- var _child$props, _child$props2;
702
- if ((child === null || child === void 0 || (_child$props = child.props) === null || _child$props === void 0 ? void 0 : _child$props.pageType) == "toolButton") {
703
- selfButtons.push(child);
704
- } else if ((child === null || child === void 0 || (_child$props2 = child.props) === null || _child$props2 === void 0 ? void 0 : _child$props2.pageType) == "cloumnButton") {
705
- columnButtons.push(child);
706
- }
707
- });
708
- } else {
709
- var _item$props5, _item$props6;
710
- if ((item === null || item === void 0 || (_item$props5 = item.props) === null || _item$props5 === void 0 ? void 0 : _item$props5.pageType) == "toolButton") {
711
- selfButtons.push(item);
712
- } else if ((item === null || item === void 0 || (_item$props6 = item.props) === null || _item$props6 === void 0 ? void 0 : _item$props6.pageType) == "cloumnButton") {
713
- columnButtons.push(item);
714
- }
715
- }
716
- });
717
- } else if (children) {
718
- const {
719
- props
720
- } = children;
721
- if ((props === null || props === void 0 ? void 0 : props.pageType) == "toolButton") {
722
- selfButtons.push(children);
723
- } else if ((props === null || props === void 0 ? void 0 : props.pageType) == "cloumnButton") {
724
- columnButtons.push(children);
725
- }
726
- }
727
- actionColumn && tableColumn.push({
728
- title: "操作",
729
- dataIndex: "action",
730
- align: actionPorps !== null && actionPorps !== void 0 && actionPorps.textAlign ? actionPorps === null || actionPorps === void 0 ? void 0 : actionPorps.textAlign : baseActionColumn.textAlign ? baseActionColumn.textAlign : "center",
731
- width: actionPorps !== null && actionPorps !== void 0 && actionPorps.width ? actionPorps === null || actionPorps === void 0 ? void 0 : actionPorps.width : baseActionColumn.width ? baseActionColumn.width : 200,
732
- fixed: "right",
733
- render: (text, record) => {
734
- return /*#__PURE__*/React.createElement("div", {
735
- className: getLess(styles, "nsc-basepage-action")
736
- }, this.renderCloumnButton(columnButtons, record));
737
- }
738
- });
739
- if (columnOrder) tableColumn = [{
740
- title: "序号",
741
- width: 80,
742
- align: "center",
743
- render: (text, reacord, index) => {
744
- return /*#__PURE__*/React.createElement(React.Fragment, null, index + 1);
745
- }
746
- }, ...tableColumn];
747
- let searchFlag = showSearch && searchForms.length > 0;
748
- let {
749
- tableTool
750
- } = config();
751
- let toolFlag = showToolButton && selfButtons.length > 0;
752
- let toolbarFlag = !(tableProps.toolbar == false || ((_tableProps$toolbar = tableProps.toolbar) === null || _tableProps$toolbar === void 0 ? void 0 : _tableProps$toolbar.show) == false || ((_tableProps$toolbar2 = tableProps.toolbar) === null || _tableProps$toolbar2 === void 0 || (_tableProps$toolbar2 = _tableProps$toolbar2.tools) === null || _tableProps$toolbar2 === void 0 ? void 0 : _tableProps$toolbar2.length) == 0 || (tableTool === null || tableTool === void 0 ? void 0 : tableTool.show) == false);
753
- if (tableProps.pagination !== false) {
754
- const scroll = tableParams.scroll;
755
- tableParams = _objectSpread(_objectSpread({}, tableParams), {}, {
756
- scroll: _objectSpread({
757
- x: "max-content"
758
- }, scroll)
759
- });
760
- }
761
- return /*#__PURE__*/React.createElement("div", {
762
- className: cls(getLess(styles, "nsc-basepage"), className)
763
- }, this.props.pageTitle && /*#__PURE__*/React.createElement("div", {
764
- className: cls(getLess(styles, "nsc-basepage-title"))
765
- }, this.props.pageTitle), /*#__PURE__*/React.createElement("div", {
766
- className: cls(getLess(styles, "nsc-basepage-pane")),
767
- style: {
768
- display: "flex"
769
- }
770
- }, showLeft && /*#__PURE__*/React.createElement("div", {
771
- className: getLess(styles, "nsc-basepage-left")
772
- }, /*#__PURE__*/React.createElement(Tree, _extends({
773
- store: _objectSpread({}, treeStore),
774
- showIcon: false,
775
- checkable: false,
776
- searchable: treeSearch,
777
- onSelect: this.treeSelect.bind(this),
778
- selectedKeys: [this.state.treeSelectedKey],
779
- titleAlias: titleAlias
780
- }, othertreeParams))), /*#__PURE__*/React.createElement("div", {
781
- className: cls(getLess(styles, "nsc-basepage-right"), {
782
- [getLess(styles, "nsc-basepage-no-left-right")]: !showLeft
783
- })
784
- }, showSearch && searchForms.length > 0 && /*#__PURE__*/React.createElement(HeaderSearch, {
785
- searchForms: searchForms,
786
- toolButtonPosition: toolButtonPosition,
787
- onSearch: this.onSearch.bind(this),
788
- onReset: this.props.onReset,
789
- ref: this.searchRef,
790
- searchFormProps: this.props.searchFormProps
791
- }), showToolButton && selfButtons.length > 0 && toolButtonPosition == "buttom" && this.renderToolButtons(selfButtons, searchForms.length == 0), /*#__PURE__*/React.createElement("div", {
792
- className: cls(getLess(styles, "nsc-basepage-table"), {
793
- [getLess(styles, "nsc-basepage-table-top")]: searchFlag && !toolFlag || !toolbarFlag
794
- }, {
795
- [getLess(styles, "nsc-basepage-table-top2")]: !searchFlag && !toolFlag
796
- })
797
- }, /*#__PURE__*/React.createElement(Table, _extends({
798
- ref: this.tableRef,
799
- columns: tableColumn,
800
- expandable: _objectSpread({
801
- expandIcon: _ref => {
802
- let {
803
- expanded,
804
- onExpand,
805
- record
806
- } = _ref;
807
- return /*#__PURE__*/React.createElement(React.Fragment, null, expanded ? /*#__PURE__*/React.createElement(DownOutlined, {
808
- onClick: e => onExpand(record, e),
809
- className: getLess(styles, "nsc-basepage-expand-icon")
810
- }) : record.childNodes && /*#__PURE__*/React.createElement(RightOutlined, {
811
- onClick: e => onExpand(record, e),
812
- className: getLess(styles, "nsc-basepage-expand-icon")
813
- }));
814
- }
815
- }, expandable),
816
- columnOrder: true,
817
- onChange: pagination => {
818
- const {
819
- currentPage
820
- } = this.state;
821
- if (currentPage !== pagination.current) {
822
- this.setState({
823
- currentPage: pagination.current
824
- });
825
- }
826
- },
827
- toolbar: _objectSpread({
828
- onToolClick: {
829
- onRefresh: () => {
830
- const params = this.getSearchValues();
831
- this.tableLoad(params);
832
- }
833
- }
834
- }, tableProps.toolbar),
835
- showRowSelection: showRowSelection
836
- }, tableParams)))), editorForm && /*#__PURE__*/React.createElement(EditorForm, {
837
- ref: this.editorRef,
838
- callBack: () => {
839
- var _this$props$onCallBac5, _this$props$onCallBac6;
840
- ((_this$props$onCallBac5 = this.props.onCallBacks) === null || _this$props$onCallBac5 === void 0 ? void 0 : _this$props$onCallBac5.onSumbitCallBack) && ((_this$props$onCallBac6 = this.props.onCallBacks) === null || _this$props$onCallBac6 === void 0 ? void 0 : _this$props$onCallBac6.onSumbitCallBack());
841
- this.tableReload.bind(this);
842
- },
843
- formProps: editorForms,
844
- submitUrl: submitUrl,
845
- submitParams: submitParams,
846
- onSubmit: this.props.onSubmit,
847
- defaultValue: defaultValue,
848
- onHideForm: this.props.onHideForm,
849
- onFormChange: this.props.onFormChange,
850
- formType: this.props.formType || "auto",
851
- changeValid: formChangeValid,
852
- otherProps: _objectSpread({}, formProps)
853
- })));
854
- }
855
- }
856
- export default BasePage;
857
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIlB1cmVDb21wb25lbnQiLCJUYWJsZSIsIlRyZWUiLCJCdXR0b24iLCJNb2RhbCIsIlBvcG92ZXIiLCJtZXNzYWdlIiwiRWRpdG9yRm9ybSIsImNscyIsInV0aWxzIiwiRG93bk91dGxpbmVkIiwiRXllT3V0bGluZWQiLCJFZGl0T3V0bGluZWQiLCJSaWdodE91dGxpbmVkIiwiUGx1c091dGxpbmVkIiwiRWxsaXBzaXNPdXRsaW5lZCIsIkRlbGV0ZU91dGxpbmVkIiwiZ2V0TGVzcyIsInJlcXVlc3QiLCJjb25maWciLCJnZXRTdG9yYWdlIiwiSGVhZGVyU2VhcmNoIiwic3R5bGVzIiwiQmFzZVBhZ2UiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiX3R5cGUiLCJfc2l6ZSIsIl9kZWZpbmVQcm9wZXJ0eSIsImNyZWF0ZVJlZiIsImNoZWNrZWRUcmVlS2V5cyIsIm5hbWUiLCJ1c2VyVHlwZSIsImFjY291bnQiLCJzdGF0ZSIsInZhbHVlIiwiZGVwdElkIiwib25TZWFyY2giLCJzZWxlY3RlZCIsInJlcyIsImtleSIsImtleXMiLCJsZW5ndGgiLCJzdG9yZVByZWZpeCIsInR5cGUiLCJjb250ZW50Iiwic2l6ZSIsInNlbGVjdGVkUm93S2V5cyIsInNlbGVjdGVkUm93RGF0YXMiLCJ0cmVlU2VsZWN0ZWRLZXkiLCJleHBhbmQiLCJmb3JtVHlwZSIsInRhYmxlU2l6ZSIsInRyZWVTZWFyY2hQcmFtcyIsImNvbXBvbmVudERpZE1vdW50IiwiaW5pdERhdGEiLCJzZXRTZWFyY2hQYXJhbXMiLCJwYXJhbXMiLCJjYWxsQmFjayIsIl90aGlzJHNlYXJjaFJlZiRjdXJyZSIsInNlYXJjaFJlZiIsImN1cnJlbnQiLCJzaG93Rm9ybSIsIl90aGlzJGVkaXRvclJlZiRjdXJyZSIsImVkaXRvcmZsYWciLCJhcmd1bWVudHMiLCJ1bmRlZmluZWQiLCJlZGl0b3JSZWYiLCJzaG93IiwiaGlkZUZvcm0iLCJfdGhpcyRlZGl0b3JSZWYkY3VycmUyIiwic2V0TG9hZGluZyIsImxvYWRpbmciLCJfdGhpcyRlZGl0b3JSZWYkY3VycmUzIiwic2V0RWRpdEZvcm1WYWx1ZXMiLCJfdGhpcyRlZGl0b3JSZWYkY3VycmU0Iiwic2V0RmllbGRzVmFsdWUiLCJnZXRFZGl0Rm9ybVZhbHVlcyIsIl90aGlzJGVkaXRvclJlZiRjdXJyZTUiLCJnZXRGaWVsZHNWYWx1ZSIsIm9uRGVsZXRlIiwiZGF0YSIsIl90aGlzJHRhYmxlUmVmJGN1cnJlbiIsImRlbGV0ZVVybCIsImRlbGV0ZVBhcmFtcyIsImRlbGV0ZVBvc2l0aW9uIiwiX3RoaXMiLCJ0YWJsZVJlZiIsImdldFNlbGVjdGVkUm93S2V5cyIsIndhcm5pbmciLCJjb25maXJtIiwib25PayIsIkVycm9yIiwiZGVmYXVsdFBhcmFtcyIsIm1ldGhvZCIsImF1dG9QcmVmaXgiLCJpZHMiLCJqb2luIiwiaWQiLCJyZXF1ZXN0UGFyYW1zIiwiX29iamVjdFNwcmVhZCIsInRoZW4iLCJjb2RlIiwiX3RoaXMkc2VhcmNoUmVmIiwiX3RoaXMkcHJvcHMkb25DYWxsQmFjIiwiX3RoaXMkcHJvcHMkb25DYWxsQmFjMiIsInN1Y2Nlc3MiLCJnZXRTZWFyY2hWYWx1ZXMiLCJvbkNhbGxCYWNrcyIsIm9uRGVsZXRlQ2FsbEJhY2siLCJ0YWJsZUxvYWQiLCJlcnJvciIsImNhdGNoIiwiY29uc29sZSIsImxvZyIsIl90aGlzJHRhYmxlUmVmJGN1cnJlbjIiLCJyZXF1ZXN0Q29uZmlnIiwic3RvcmUiLCJsb2FkIiwib25TZWFyY2hDYWxsQmFjayIsImNhbGxiYWNrIiwidGFibGVSZWxvYWQiLCJfdGhpcyR0YWJsZVJlZiRjdXJyZW4zIiwiYXV0b0xvYWQiLCJyZWxvYWQiLCJfcmVzJGRhdGEiLCJyZWNvcmRzIiwiY3VycmVudFBhZ2UiLCJfdGhpcyR0YWJsZVJlZiRjdXJyZW40IiwiX3RoaXMkdGFibGVSZWYkY3VycmVuNSIsImdldFNlbGVjdGVkUm93RGF0YXMiLCJfdGhpcyR0YWJsZVJlZiRjdXJyZW42IiwicmVzZXRTZWxlY3RlZFJvd0tleXMiLCJfdGhpcyR0YWJsZVJlZiRjdXJyZW43IiwiX3RoaXMkc2VhcmNoUmVmMiIsImZyb21WYWx1ZSIsImdldENoaWxkcmVuRGF0YSIsInRhYmxlUHJvcHMiLCJyb3dLZXkiLCJyZXNLZXkiLCJjaGlsZE5vZGVzIiwiY2hpbGRyZW4iLCJtYXAiLCJpdGVtIiwiaW5kZXgiLCJyZW5kZXJUb29sQnV0dG9ucyIsInRvb2xidXR0b25zIiwibWFyZ2luZmxhZyIsImZsYWciLCJzaG93U2VhcmNoIiwiX2l0ZW0kcHJvcHMiLCJwYWdlVHlwZSIsIm9uQ2xpY2siLCJpY29uIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiX2V4Y2x1ZGVkIiwiY3JlYXRlRWxlbWVudCIsIl9leHRlbmRzIiwiY2xhc3NOYW1lIiwic3R5bGUiLCJtYXJnaW5MZWZ0IiwidGl0bGUiLCJwbGFjZW1lbnQiLCJ0cmlnZ2VyIiwicmVuZGVyQ2xvdW1uQnV0dG9uIiwiY29sdW1uQnV0dG9ucyIsInJlY29yZCIsImFjdGlvblBvcnBzIiwiYmFzZUFjdGlvbkNvbHVtbiIsIm5ld0J1dHRvbnMiLCJzaG93SWNvbiIsIl9pdGVtJHByb3BzMiIsInJlY29yZFNob3ciLCJfZXhjbHVkZWQyIiwiZXZhbCIsInB1c2giLCJfaXRlbSRwcm9wczMiLCJfZXhjbHVkZWQzIiwiX2l0ZW0kcHJvcHM0IiwiX2V4Y2x1ZGVkNCIsInRyZWVTZWxlY3QiLCJzZWxlY3RlZEtleXMiLCJvYmoiLCJfdGhpcyRzZWFyY2hSZWYzIiwiX3RoaXMkcHJvcHMkb25DYWxsQmFjMyIsIl90aGlzJHByb3BzJG9uQ2FsbEJhYzQiLCJrZXl3b3JkIiwic2VhcmNoS2V5Iiwic2VhcmNoRmllbGQiLCJwYXJhbnRTZWxlY3QiLCJ0cmVlUHJvcHMiLCJzZWxlY3RlZE5vZGVzIiwiZGF0YXJlZiIsImF0dHJpYnV0ZSIsInNldFN0YXRlIiwiaXNMZWFmIiwib25UcmVlU2VsZWN0IiwidHJlZVNlbGVjdENhbGxCYWNrIiwicmVzZXRTZWFyY2giLCJfdGhpcyRzZWFyY2hSZWYkY3VycmUyIiwicmVzZXRGaWVsZHMiLCJnZXRUZXh0IiwidGV4dCIsIl9wcm9wcyRkYXRhIiwibmV3VGV4dCIsImkiLCJsYWJlbCIsInNldFRhYmxlRGF0YSIsIl90aGlzJHRhYmxlUmVmJGN1cnJlbjgiLCJzZXREYXRhIiwic2V0VHJlZURhdGEiLCJfdGhpcyR0cmVlUmVmJGN1cnJlbnQiLCJ0cmVlUmVmIiwicmVuZGVyIiwiX3RhYmxlUHJvcHMkdG9vbGJhciIsIl90YWJsZVByb3BzJHRvb2xiYXIyIiwiY29sdW1ucyIsInN1Ym1pdFVybCIsImZvcm1Qcm9wcyIsInNob3dMZWZ0Iiwic3VibWl0UGFyYW1zIiwic2hvd1Rvb2xCdXR0b24iLCJidXR0b25zIiwiZWRpdG9yRm9ybSIsIm9uU2hvd0Zvcm0iLCJmb3JtQ2hhbmdlVmFsaWQiLCJ0b29sQnV0dG9uUG9zaXRpb24iLCJmaWx0ZXJDb2x1bW4iLCJhY3Rpb25Db2x1bW4iLCJzaG93Um93U2VsZWN0aW9uIiwiY29sdW1uT3JkZXIiLCJleHBhbmRhYmxlIiwib3RoZXJ0YWJsZVBhcmFtcyIsIl9leGNsdWRlZDUiLCJ0cmVlU3RvcmUiLCJ0cmVlU2VhcmNoIiwidGl0bGVBbGlhcyIsIm90aGVydHJlZVBhcmFtcyIsIl9leGNsdWRlZDYiLCJ0YWJsZVBhcmFtcyIsInRhYmxlQ29sdW1uIiwic2VhcmNoRm9ybXMiLCJlZGl0b3JGb3JtcyIsImRlZmF1bHRWYWx1ZSIsIl90ZW1wJHNlYXJjaCIsIl90ZW1wJHByb3BzIiwiX3RlbXAkcHJvcHMyIiwiX3RlbXAiLCJ0ZW1wIiwic2VhcmNoIiwiX3RlbXAkc2VhcmNoMiIsIl90ZW1wJHNlYXJjaDMiLCJfdGVtcCRzZWFyY2g0IiwiZmllbGQiLCJkYXRhSW5kZXgiLCJsYWJlbENvbCIsIndyYXBwZXJDb2wiLCJydWxlcyIsInNlYXJjaFJ1bGVzIiwiZWRpdG9yIiwic3BhbiIsImRpY3ROYW1lIiwiX3RlbXAkcHJvcHMzIiwiY29sdW1uU2VhcmNoIiwiZmlsdGVyUHJvcHMiLCJ0ZW1wUHJvcCIsIkZyYWdtZW50IiwiZWxsaXBzaXMiLCJjb2x1bW5TaG93Iiwic2VsZkJ1dHRvbnMiLCJpbmRleE9mIiwiYmluZCIsImRhbmdlciIsIkFycmF5IiwiaXNBcnJheSIsImNoaWxkIiwiX2NoaWxkJHByb3BzIiwiX2NoaWxkJHByb3BzMiIsIl9pdGVtJHByb3BzNSIsIl9pdGVtJHByb3BzNiIsImFsaWduIiwidGV4dEFsaWduIiwid2lkdGgiLCJmaXhlZCIsInJlYWNvcmQiLCJzZWFyY2hGbGFnIiwidGFibGVUb29sIiwidG9vbEZsYWciLCJ0b29sYmFyRmxhZyIsInRvb2xiYXIiLCJ0b29scyIsInBhZ2luYXRpb24iLCJzY3JvbGwiLCJ4IiwicGFnZVRpdGxlIiwiZGlzcGxheSIsImNoZWNrYWJsZSIsInNlYXJjaGFibGUiLCJvblNlbGVjdCIsIm9uUmVzZXQiLCJyZWYiLCJzZWFyY2hGb3JtUHJvcHMiLCJleHBhbmRJY29uIiwiX3JlZiIsImV4cGFuZGVkIiwib25FeHBhbmQiLCJlIiwib25DaGFuZ2UiLCJvblRvb2xDbGljayIsIm9uUmVmcmVzaCIsIl90aGlzJHByb3BzJG9uQ2FsbEJhYzUiLCJfdGhpcyRwcm9wcyRvbkNhbGxCYWM2Iiwib25TdW1iaXRDYWxsQmFjayIsIm9uU3VibWl0Iiwib25IaWRlRm9ybSIsIm9uRm9ybUNoYW5nZSIsImNoYW5nZVZhbGlkIiwib3RoZXJQcm9wcyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BhZ2UvQmFzZVBhZ2UvaW5kZXggY29weS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IFB1cmVDb21wb25lbnQsIFJlYWN0Tm9kZSB9IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgVGFibGUgZnJvbSBcIi4uLy4uL2Jhc2UvdGFibGVcIjtcclxuaW1wb3J0IFRyZWUgZnJvbSBcIi4uLy4uL2Jhc2UvdHJlZVwiO1xyXG5pbXBvcnQgRm9ybSBmcm9tIFwiLi4vLi4vYmFzZS9mb3JtXCI7XHJcbmltcG9ydCBCdXR0b24gZnJvbSBcIi4uLy4uL2Jhc2UvYnV0dG9uXCI7XHJcbmltcG9ydCBNb2RhbCBmcm9tIFwiLi4vLi4vYmFzZS9tb2RhbFwiO1xyXG5pbXBvcnQgUG9wb3ZlciBmcm9tIFwiLi4vLi4vYmFzZS9wb3BvdmVyXCI7XHJcbmltcG9ydCBtZXNzYWdlIGZyb20gXCIuLi8uLi9iYXNlL21lc3NhZ2VcIjtcclxuaW1wb3J0IEljb24gZnJvbSBcIi4uLy4uL2Jhc2UvY29tbW9uL0ljb25Gb250XCI7XHJcbmltcG9ydCB7IGljb25UeXBlIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQgRWRpdG9yRm9ybSBmcm9tIFwiLi9Gb3JtXCI7XHJcbmltcG9ydCBjbHMgZnJvbSBcImNsYXNzbmFtZXNcIjtcclxuaW1wb3J0ICBcIi4vaW5kZXgubW9kdWxlLmxlc3NcIjtcclxuaW1wb3J0IFN0b3JlLCB7IFBhZ2VTdG9yZSwgU3RvcmVQcm9wcyB9IGZyb20gXCJAYmotbnNjL21zblwiO1xyXG5pbXBvcnQgUm93IGZyb20gXCIuLi8uLi9iYXNlL2dyaWQvUm93XCI7XHJcbmltcG9ydCB7IHV0aWxzIH0gZnJvbSBcIkBiai1uc2MvbXNuL2xpYi91dGlsc1wiO1xyXG5pbXBvcnQge1xyXG4gIERvd25PdXRsaW5lZCxcclxuICBFeWVPdXRsaW5lZCxcclxuICBFZGl0T3V0bGluZWQsXHJcbiAgUmlnaHRPdXRsaW5lZCxcclxuICBQbHVzT3V0bGluZWQsXHJcbiAgRWxsaXBzaXNPdXRsaW5lZCxcclxuICBEZWxldGVPdXRsaW5lZCxcclxufSBmcm9tIFwiQGFudC1kZXNpZ24vaWNvbnNcIjtcclxuaW1wb3J0IHsgZ2V0TGVzcywgZ2V0Tm9kZSB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xyXG5pbXBvcnQgcmVxdWVzdCBmcm9tIFwibnNjLXJlcXVlc3RcIjtcclxuaW1wb3J0IG9taXQgZnJvbSBcIm9taXQuanNcIjtcclxuaW1wb3J0IGNvbmZpZyBmcm9tIFwiLi4vLi4vY29uZmlnXCI7XHJcbmltcG9ydCB7IGdldFN0b3JhZ2UgfSBmcm9tIFwiQGJqLW5zYy9mdW5jdGlvbnNcIjtcclxuaW1wb3J0IHsgSUZvcm1Qcm9wcyB9IGZyb20gXCIuLi8uLi9iYXNlL2Zvcm0vRm9ybVwiO1xyXG5pbXBvcnQgSGVhZGVyU2VhcmNoIGZyb20gXCIuLi9IZWFkZXJTZWFyY2hcIjtcclxuaW1wb3J0IHsgUGFnaW5hdGlvblByb3BzIH0gZnJvbSBcImFudGRcIjtcclxuaW50ZXJmYWNlIFRhYmxlUHJvcHMge1xyXG4gIGFjdGlvbkNvbHVtbj86IGJvb2xlYW47IC8v5piv5ZCm5pi+56S65pON5L2c5YiXXHJcbiAgc3RvcmU/OiBTdG9yZVByb3BzO1xyXG4gIGZpbHRlckNvbHVtbj86IGJvb2xlYW47IC8v5piv5ZCm5pi+56S66L+H5ruk5oyJ6ZKuXHJcbiAgc2hvd1Jvd1NlbGVjdGlvbj86IGJvb2xlYW47IC8v5piv5ZCm6KGo5qC85Yu+6YCJ5YiXXHJcbiAgcGFnaW5hdGlvbj86IGJvb2xlYW4gfCBQYWdpbmF0aW9uUHJvcHM7IC8v5piv5ZCm5pi+56S65YiG6aG1XHJcbiAgY29sdW1uT3JkZXI/OiBib29sZWFuOyAvL+aYr+WQpuaYvuekuuihqOagvOW6j+WIl1xyXG4gIFtwcm9wc05hbWU6IHN0cmluZ106IGFueTtcclxufVxyXG5jb25zdCBzdHlsZXMgPSBudWxsXHJcbmludGVyZmFjZSBUcmVlUHJvcHMge1xyXG4gIHN0b3JlPzogU3RvcmVQcm9wcztcclxuICBzaG93U2VhcmNoPzogYm9vbGVhbjsgLy/mmK/lkKbmmL7npLrmkJzntKLmoYZcclxuICBzZWFyY2hLZXk/OiBzdHJpbmc7IC8v5pCc57SidmFsdWXlr7nlupTnmoRrZXlcclxuICBzZWFyY2hGaWVsZD86IHN0cmluZzsgLy/mn6Xor6Llr7nlupTnmoRrZXlcclxuICB0aXRsZUFsaWFzPzogc3RyaW5nOyAvL+agkXRpdGxl5a+55bqU55qEa2V5LOm7mOiupHRpdGxlXHJcbiAgbm9kZVBvcnBzPzogb2JqZWN0O1xyXG4gIHBhcmFudFNlbGVjdD86IGJvb2xlYW47XHJcbiAgW3Byb3BzTmFtZTogc3RyaW5nXTogYW55O1xyXG59XHJcbmludGVyZmFjZSBGb3JtUHJvcHMgZXh0ZW5kcyBJRm9ybVByb3BzIHt9XHJcbmludGVyZmFjZSBOU0NCYXNlQmFnZVByb3BzIHtcclxuICBzaG93U2VhcmNoPzogYm9vbGVhbjsgLy/mmK/lkKbmmL7npLrlpLTpg6jmkJzntKLmoI9cclxuICB0YWJsZVByb3BzPzogVGFibGVQcm9wczsgLy/ooajmoLzlj4LmlbBcclxuICB0cmVlUHJvcHM/OiBUcmVlUHJvcHM7IC8v5bem5L6n5qCR5Y+C5pWwXHJcbiAgc3VibWl0UGFyYW1zPzogT2JqZWN0OyAvL+a3u+WKoOWPguaVsO+8jOm7mOiupG1vdGhvZDpwb3N077yMIOWPguaVsOmAmui/h2RhdGHkvKDpgJJcclxuICBzdWJtaXRVcmw/OiBzdHJpbmc7XHJcbiAgb25TdWJtaXQ/OiAodmFsdWU/OiBhbnksIGxhYmVsPzogYW55KSA9PiB2b2lkO1xyXG4gIGNvbHVtbnM6IEFycmF5PE9iamVjdD47XHJcbiAgc2hvd0xlZnQ/OiBib29sZWFuOyAvL+aYr+WQpuaYvuekuuW3puS+p+ebruW9leagkVxyXG4gIHNob3dUb29sQnV0dG9uPzogYm9vbGVhbjsgLy/mmK/lkKbmmL7npLrmjInpkq7moI9cclxuICBlZGl0b3JGb3JtPzogYm9vbGVhbjsgLy/mmK/lkKbpnIDopoHooajljZXlip/og70gLCDkuLpmYWxzZSDnvJbovpHvvIzmn6XnnIvvvIzmlrDlop7lip/og73lnYfkuI3lj6/nlKhcclxuICBkZWxldGVVcmw/OiBzdHJpbmc7IC8v5Yig6ZmkdXJsXHJcbiAgb25EZWxldGU/OiAoc2VsZWN0ZWRLZXlzPzogQXJyYXk8c3RyaW5nPikgPT4gdm9pZDsgLy/liKDpmaTlj4LmlbDvvIzpu5jorqRtb3Rob2Q6cG9zdO+8jCDlj4LmlbDpgJrov4dpZHPmi7zmjqXkvKDpgJLnu5nlkI7lj7BcclxuICBkZWxldGVQb3NpdGlvbj86IFwidG9vbGJhclwiIHwgXCJyb3dcIjtcclxuICBkZWxldGVQYXJhbXM/OiBPYmplY3Q7XHJcbiAgY2hpbGRyZW4/OiBSZWFjdC5SZWFjdE5vZGU7XHJcbiAgb25TZWFyY2g/OiAodmFsdWU/OiBhbnkpID0+IHZvaWQ7XHJcbiAgb25SZXNldD86ICgpID0+IHZvaWQ7XHJcbiAgaW5pdERhdGE/OiBhbnk7IC8v5Yid5aeL5YyW5Zue6LCD5Ye95pWw77yM5ZyoY29tcG9uZW50RGlkTW91bnTkuK3osIPnlKhcclxuICBidXR0b25zPzogQXJyYXk8c3RyaW5nPjsgLy/mjInpkq7pm4blkIggIFsnYWRkJywnZGVsZXRlJywnc2VhcmNoJywnZWRpdG9yJ11cclxuICBvblNob3dGb3JtPzogKHZhbHVlPzogYW55LCBlZGl0b3JGbGFnPzogc3RyaW5nKSA9PiB2b2lkOyAvL+aJk+W8gOihqOWNleWbnuiwg1xyXG4gIG9uSGlkZUZvcm0/OiAoKSA9PiB2b2lkOyAvL+aJk+W8gOihqOWNleWbnuiwg1xyXG4gIG9uRm9ybUNoYW5nZT86IChjaGFuZ2VkVmFsdWVzPzogYW55LCBhbGxWYWx1ZXM/OiBhbnkpID0+IHZvaWQ7IC8v6KGo5Y2Vb25DaGFuZ2Xlm57osINcclxuICBmb3JtVHlwZT86IFwibW9kYWxcIiB8IFwiZHJhd2VyXCI7XHJcbiAgZm9ybUNoYW5nZVZhbGlkPzogYm9vbGVhbjsgLy/ooajljZXmoKHpqoxcclxuICBjbGFzc05hbWU/OiBhbnk7XHJcbiAgdG9vbEJ1dHRvblBvc2l0aW9uPzogXCJyaWdodFwiIHwgXCJidXR0b21cIjtcclxuICBwYWdlVGl0bGU/OiBzdHJpbmcgfCBSZWFjdE5vZGU7XHJcbiAgZm9ybVByb3BzPzogRm9ybVByb3BzO1xyXG4gIGFjdGlvblBvcnBzPzogeyB0ZXh0QWxpZ24/OiBzdHJpbmc7IHNob3dJY29uPzogYm9vbGVhbjsgd2lkdGg/OiBudW1iZXIgfTtcclxuICBzZWFyY2hGb3JtUHJvcHM/OiB7IHdyYXBwZXJDb2w/OiBhbnk7IGxhYmVsQ29sPzogYW55IH07XHJcbiAgb25UcmVlU2VsZWN0PzogKHZhbHVlPzogYW55LCBlZGl0b3JGbGFnPzogc3RyaW5nKSA9PiB2b2lkOyAvL+aJk+W8gOihqOWNleWbnuiwg1xyXG4gIG9uQ2FsbEJhY2tzPzoge1xyXG4gICAgdHJlZVNlbGVjdENhbGxCYWNrPzogYW55O1xyXG4gICAgb25TZWFyY2hDYWxsQmFjaz86IGFueTtcclxuICAgIG9uU3VtYml0Q2FsbEJhY2s/OiBhbnk7XHJcbiAgICBvbkRlbGV0ZUNhbGxCYWNrPzogYW55O1xyXG4gIH07XHJcbn1cclxuXHJcbmNsYXNzIEJhc2VQYWdlIGV4dGVuZHMgUHVyZUNvbXBvbmVudDxOU0NCYXNlQmFnZVByb3BzLCBhbnk+IHtcclxuICB0YWJsZVJlZiA9IFJlYWN0LmNyZWF0ZVJlZjxhbnk+KCk7XHJcbiAgdHJlZVJlZiA9IFJlYWN0LmNyZWF0ZVJlZjxhbnk+KCk7XHJcbiAgc2VhcmNoUmVmID0gUmVhY3QuY3JlYXRlUmVmPGFueT4oKTtcclxuICBlZGl0b3JSZWYgPSBSZWFjdC5jcmVhdGVSZWY8YW55PigpO1xyXG4gIGRhdGVGb3JtYXQgPSB7fSBhcyBhbnk7XHJcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xyXG4gICAgc3VwZXIocHJvcHMpO1xyXG4gICAgbGV0IHsgc3RvcmVQcmVmaXggfSA9IGNvbmZpZygpO1xyXG4gICAgbGV0IHR5cGUgPSBnZXRTdG9yYWdlKFxyXG4gICAgICBzdG9yZVByZWZpeCA/IHN0b3JlUHJlZml4ICsgXCItXCIgKyBcImZvcm1UeXBlXCIgOiBcImZvcm1UeXBlXCJcclxuICAgICk7XHJcbiAgICB0eXBlID0gdHlwZT8uY29udGVudDtcclxuICAgIGxldCBzaXplID0gZ2V0U3RvcmFnZShcclxuICAgICAgc3RvcmVQcmVmaXggPyBzdG9yZVByZWZpeCArIFwiLVwiICsgXCJ0YWJsZVNpemVcIiA6IFwidGFibGVTaXplXCJcclxuICAgICk7XHJcbiAgICBzaXplID0gc2l6ZT8uY29udGVudDtcclxuICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgIHR5cGU6IFwiYWRkXCIsXHJcbiAgICAgIHNlbGVjdGVkUm93S2V5czogW10sXHJcbiAgICAgIHNlbGVjdGVkUm93RGF0YXM6IFtdLFxyXG4gICAgICB0cmVlU2VsZWN0ZWRLZXk6IFwiXCIsXHJcbiAgICAgIGV4cGFuZDogZmFsc2UsXHJcbiAgICAgIGZvcm1UeXBlOiB0eXBlIHx8IFwibW9kYWxcIixcclxuICAgICAgdGFibGVTaXplOiBzaXplIHx8IFwiZGVmYXVsdFwiLFxyXG4gICAgICB0cmVlU2VhcmNoUHJhbXM6IHt9LFxyXG4gICAgfTtcclxuICB9XHJcbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICBjb25zdCB7IGluaXREYXRhIH0gPSB0aGlzLnByb3BzO1xyXG4gICAgaW5pdERhdGEgJiYgaW5pdERhdGEoKTtcclxuICB9XHJcblxyXG4gIHNldFNlYXJjaFBhcmFtcyhwYXJhbXMsIGNhbGxCYWNrKSB7XHJcbiAgICB0aGlzLnNlYXJjaFJlZi5jdXJyZW50Py5zZXRTZWFyY2hQYXJhbXMocGFyYW1zKTtcclxuICAgIGNhbGxCYWNrICYmIGNhbGxCYWNrKHBhcmFtcyk7XHJcbiAgfVxyXG5cclxuICBvblNlbGVjdCA9IChjaGVja2VkVHJlZUtleXM6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgeyBuYW1lLCB1c2VyVHlwZSwgYWNjb3VudCB9ID0gdGhpcy5zdGF0ZTtcclxuICAgIGNvbnN0IHZhbHVlID0geyBuYW1lLCB1c2VyVHlwZSwgYWNjb3VudCwgZGVwdElkOiBjaGVja2VkVHJlZUtleXNbMF0gfTtcclxuICAgIGlmICh0aGlzLnByb3BzLm9uU2VhcmNoKSB7XHJcbiAgICAgIHRoaXMucHJvcHMub25TZWFyY2godmFsdWUpO1xyXG4gICAgfVxyXG4gICAgLy8gdGhpcy50YWJsZUxvYWQodmFsdWUpO1xyXG4gIH07XHJcblxyXG4gIC8v5pi+56S66KGo5Y2VXHJcbiAgc2hvd0Zvcm0odmFsdWU/OiBhbnksIGVkaXRvcmZsYWcgPSBcImFkZFwiKSB7XHJcbiAgICB0aGlzLmVkaXRvclJlZi5jdXJyZW50Py5zaG93KHZhbHVlLCBlZGl0b3JmbGFnKTtcclxuICB9XHJcblxyXG4gIC8v5YWz6Zet6KGo5Y2VXHJcbiAgaGlkZUZvcm0oKSB7XHJcbiAgICB0aGlzLmVkaXRvclJlZi5jdXJyZW50Py5oaWRlRm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgc2V0TG9hZGluZyhsb2FkaW5nOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmVkaXRvclJlZi5jdXJyZW50Py5zZXRMb2FkaW5nKGxvYWRpbmcpO1xyXG4gIH1cclxuXHJcbiAgc2V0RWRpdEZvcm1WYWx1ZXModmFsdWUpIHtcclxuICAgIHRoaXMuZWRpdG9yUmVmLmN1cnJlbnQ/LnNldEZpZWxkc1ZhbHVlKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGdldEVkaXRGb3JtVmFsdWVzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yUmVmLmN1cnJlbnQ/LmdldEZpZWxkc1ZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICAvL+aJuemHj+WIoOmZpFxyXG4gIG9uRGVsZXRlKGRhdGE/OiBhbnkpIHtcclxuICAgIGNvbnN0IHtcclxuICAgICAgZGVsZXRlVXJsLFxyXG4gICAgICBvbkRlbGV0ZSxcclxuICAgICAgZGVsZXRlUGFyYW1zLFxyXG4gICAgICBkZWxldGVQb3NpdGlvbiA9IFwidG9vbGJhclwiLFxyXG4gICAgfSA9IHRoaXMucHJvcHM7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dLZXlzID0gdGhpcy50YWJsZVJlZi5jdXJyZW50Py5nZXRTZWxlY3RlZFJvd0tleXMoKTtcclxuICAgIGlmIChkZWxldGVQb3NpdGlvbiA9PSBcInRvb2xiYXJcIikge1xyXG4gICAgICBpZiAoc2VsZWN0ZWRSb3dLZXlzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgbWVzc2FnZS53YXJuaW5nKFwi6K+36YCJ5oup6KaB5Yig6Zmk55qE5pWw5o2u77yBXCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgTW9kYWwuY29uZmlybSh7XHJcbiAgICAgIGNvbnRlbnQ6IFwi5piv5ZCm56Gu6K6k5Yig6Zmk5omA6YCJ6aG577yfXCIsXHJcbiAgICAgIC8vIGNlbnRlcmVkOnRydWUsXHJcbiAgICAgIG9uT2s6ICgpID0+IHtcclxuICAgICAgICBpZiAob25EZWxldGUpIHtcclxuICAgICAgICAgIG9uRGVsZXRlICYmXHJcbiAgICAgICAgICAgIG9uRGVsZXRlKGRlbGV0ZVBvc2l0aW9uID09IFwidG9vbGJhclwiID8gc2VsZWN0ZWRSb3dLZXlzIDogZGF0YSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZGVsZXRlVXJsKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1cmzkuI3og73kuLrnqbrvvIFcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRQYXJhbXMgPSB7XHJcbiAgICAgICAgICBtZXRob2Q6IFwicG9zdFwiLFxyXG4gICAgICAgICAgYXV0b1ByZWZpeDogdHJ1ZSxcclxuICAgICAgICAgIHBhcmFtczoge1xyXG4gICAgICAgICAgICBpZHM6IGRlbGV0ZVBvc2l0aW9uID09IFwidG9vbGJhclwiID8gc2VsZWN0ZWRSb3dLZXlzLmpvaW4oKSA6IGRhdGEuaWQsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgbGV0IHJlcXVlc3RQYXJhbXMgPSB7fSBhcyBhbnk7XHJcbiAgICAgICAgaWYgKGRlZmF1bHRQYXJhbXMpIHtcclxuICAgICAgICAgIHJlcXVlc3RQYXJhbXMgPSB7IC4uLmRlbGV0ZVBhcmFtcyB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXF1ZXN0UGFyYW1zID0geyAuLi5kZWZhdWx0UGFyYW1zIH07XHJcbiAgICAgICAgcmVxdWVzdChkZWxldGVVcmwsIHtcclxuICAgICAgICAgIC4uLnJlcXVlc3RQYXJhbXMsXHJcbiAgICAgICAgfSlcclxuICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXM6IGFueSkge1xyXG4gICAgICAgICAgICBjb25zdCB7IGNvZGUgfSA9IHJlcztcclxuICAgICAgICAgICAgaWYgKGNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICAgIG1lc3NhZ2Uuc3VjY2VzcyhcIuWIoOmZpOaIkOWKn++8gVwiKTtcclxuICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBfdGhpcy5zZWFyY2hSZWY/LmN1cnJlbnQ/LmdldFNlYXJjaFZhbHVlcygpO1xyXG4gICAgICAgICAgICAgIF90aGlzLnByb3BzLm9uQ2FsbEJhY2tzPy5vbkRlbGV0ZUNhbGxCYWNrICYmXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5wcm9wcy5vbkNhbGxCYWNrcz8ub25EZWxldGVDYWxsQmFjaygpO1xyXG4gICAgICAgICAgICAgIF90aGlzLnRhYmxlTG9hZCh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgbWVzc2FnZS5lcnJvcihcIuWIoOmZpOWksei0pe+8gVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3I6IGFueSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yXCIsIGVycm9yKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHRhYmxlTG9hZChwYXJhbXM6IGFueSwgcmVxdWVzdENvbmZpZyA9IHt9KSB7XHJcbiAgICB0aGlzLnRhYmxlUmVmLmN1cnJlbnQ/LnN0b3JlLmxvYWQoe1xyXG4gICAgICAuLi5yZXF1ZXN0Q29uZmlnLFxyXG4gICAgICBwYXJhbXM6IHBhcmFtcyxcclxuICAgIH0pO1xyXG4gIH1cclxuICAvL+afpeivolxyXG4gIG9uU2VhcmNoKHBhcmFtcykge1xyXG4gICAgY29uc3QgeyBvblNlYXJjaCwgb25DYWxsQmFja3MgfSA9IHRoaXMucHJvcHM7XHJcbiAgICBpZiAob25TZWFyY2gpIHtcclxuICAgICAgb25TZWFyY2goeyAuLi5wYXJhbXMsIC4uLnRoaXMuc3RhdGUudHJlZVNlYXJjaFByYW1zIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnRhYmxlTG9hZCh7IC4uLnBhcmFtcywgLi4udGhpcy5zdGF0ZS50cmVlU2VhcmNoUHJhbXMgfSk7XHJcbiAgICBvbkNhbGxCYWNrcz8ub25TZWFyY2hDYWxsQmFjayAmJlxyXG4gICAgICB1dGlscy5jYWxsYmFjayhvbkNhbGxCYWNrcz8ub25TZWFyY2hDYWxsQmFjaywgdGhpcywgW3BhcmFtc10pO1xyXG4gIH1cclxuICAvL+ihqOagvOmHjeaWsOWKoOi9vVxyXG4gIHRhYmxlUmVsb2FkKHBhcmFtcyA9IHt9LCBhdXRvTG9hZCA9IHRydWUpIHtcclxuICAgIHRoaXMudGFibGVSZWYuY3VycmVudD8uc3RvcmU/LnJlbG9hZCh7XHJcbiAgICAgIGNhbGxiYWNrOiAocmVzKSA9PiB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgYXV0b0xvYWQgJiZcclxuICAgICAgICAgIHJlcz8uZGF0YT8ucmVjb3Jkcz8ubGVuZ3RoID09IDAgJiZcclxuICAgICAgICAgIHRoaXMuc3RhdGUuY3VycmVudFBhZ2UgIT09IDFcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMudGFibGVSZWYuY3VycmVudD8uc3RvcmU/LnJlbG9hZCh7XHJcbiAgICAgICAgICAgIHBhcmFtczogeyBjdXJyZW50OiAxLCAuLi5wYXJhbXMgfSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuICBnZXRTZWxlY3RlZFJvd0tleXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy50YWJsZVJlZi5jdXJyZW50Py5nZXRTZWxlY3RlZFJvd0tleXMoKTtcclxuICB9XHJcbiAgZ2V0U2VsZWN0ZWRSb3dEYXRhcygpIHtcclxuICAgIHJldHVybiB0aGlzLnRhYmxlUmVmLmN1cnJlbnQ/LmdldFNlbGVjdGVkUm93RGF0YXMoKTtcclxuICB9XHJcbiAgcmVzZXRTZWxlY3RlZFJvd0tleXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy50YWJsZVJlZi5jdXJyZW50Py5yZXNldFNlbGVjdGVkUm93S2V5cygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VhcmNoVmFsdWVzKCkge1xyXG4gICAgY29uc3QgZnJvbVZhbHVlID0gdGhpcy5zZWFyY2hSZWY/LmN1cnJlbnQ/LmdldFNlYXJjaFZhbHVlcygpO1xyXG4gICAgcmV0dXJuIHsgLi4uZnJvbVZhbHVlLCAuLi50aGlzLnN0YXRlLnRyZWVTZWFyY2hQcmFtcyB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2hpbGRyZW5EYXRhKGRhdGEsIGtleXMgPSBbXSkge1xyXG4gICAgY29uc3QgeyB0YWJsZVByb3BzIH0gPSB0aGlzLnByb3BzO1xyXG4gICAgY29uc3QgeyByb3dLZXkgPSBcImlkXCIgfSA9IHRhYmxlUHJvcHM7XHJcbiAgICBsZXQgcmVzS2V5ID0gW107XHJcbiAgICBpZiAoZGF0YS5jaGlsZE5vZGVzKSB7XHJcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gZGF0YS5jaGlsZE5vZGVzO1xyXG4gICAgICBjaGlsZHJlbi5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgaWYgKGl0ZW0uY2hpbGROb2Rlcykge1xyXG4gICAgICAgICAgdGhpcy5nZXRDaGlsZHJlbkRhdGEoaXRlbS5jaGlsZE5vZGVzLCBrZXlzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzS2V5ID0gWy4uLmtleXMsIGl0ZW1bcm93S2V5XV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlc0tleSA9IFsuLi5rZXlzLCBkYXRhW3Jvd0tleV1dO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc0tleTtcclxuICB9XHJcblxyXG4gIHJlbmRlclRvb2xCdXR0b25zKHRvb2xidXR0b25zOiBhbnksIG1hcmdpbmZsYWcgPSBmYWxzZSkge1xyXG4gICAgY29uc3QgZmxhZyA9IHRvb2xidXR0b25zLmxlbmd0aCA+IDU7XHJcbiAgICBjb25zdCB7IHNob3dTZWFyY2ggPSB0cnVlIH0gPSB0aGlzLnByb3BzO1xyXG4gICAgY29uc3QgY29udGVudCA9IHRvb2xidXR0b25zLm1hcCgoaXRlbTogYW55LCBpbmRleDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHsgY2hpbGRyZW4sIHBhZ2VUeXBlLCBvbkNsaWNrLCBpY29uLCBzaG93LCAuLi5wYXJhbXMgfSA9IGl0ZW0ucHJvcHM7XHJcbiAgICAgIGlmIChpbmRleCA+IDMpIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzc05hbWU9e2NscyhcclxuICAgICAgICAgICAgICBnZXRMZXNzKHN0eWxlcywgXCJuc2MtYmFzZXBhZ2UtZWRpdG9yXCIpLFxyXG4gICAgICAgICAgICAgIGdldExlc3Moc3R5bGVzLCBcIm5zYy1iYXNlcGFnZS1jb250ZW50LWl0ZW1cIilcclxuICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAga2V5PXtpbmRleH1cclxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgIG9uQ2xpY2sgJiYgb25DbGljaygpO1xyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICB7Li4ucGFyYW1zfVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e2dldExlc3Moc3R5bGVzLCBcIm5zYy1iYXNlcGFnZS1pY29uXCIpfT57aWNvbn08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17Z2V0TGVzcyhzdHlsZXMsIFwibnNjLWJhc2VwYWdlLXRleHRcIil9PntjaGlsZHJlbn08L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzc05hbWU9e2NscyhnZXRMZXNzKHN0eWxlcywgXCJuc2MtYmFzZXBhZ2UtdG9vbC1idXR0b25zXCIpLCB7XHJcbiAgICAgICAgICBbZ2V0TGVzcyhzdHlsZXMsIFwibnNjLWJhc2VwYWdlLXRvb2wtYnV0dG9ucy1tYXJnaW5cIildOiAhc2hvd1NlYXJjaCB8fCBtYXJnaW5mbGFnLFxyXG4gICAgICAgIH0pfVxyXG4gICAgICAgIHN0eWxlPXt7IG1hcmdpbkxlZnQ6IDAgfX1cclxuICAgICAgPlxyXG4gICAgICAgIHt0b29sYnV0dG9ucy5tYXAoKGl0ZW06IGFueSwgaW5kZXg6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGZsYWcpIHtcclxuICAgICAgICAgICAgaWYgKGluZGV4IDwgNCkge1xyXG4gICAgICAgICAgICAgIHJldHVybiA8ZGl2IGtleT17aW5kZXh9PntpdGVtfTwvZGl2PjtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbmRleCA9PSA0KSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgIDxQb3BvdmVyXHJcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnQ9e2NvbnRlbnR9XHJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPXtudWxsfVxyXG4gICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b21cIlxyXG4gICAgICAgICAgICAgICAgICB0cmlnZ2VyPXtbXCJjbGlja1wiXX1cclxuICAgICAgICAgICAgICAgICAga2V5PXtpbmRleH1cclxuICAgICAgICAgICAgICAgICAgLy8gb3ZlcmxheUNsYXNzTmFtZT17c3R5bGVzWydwb3AtYm94J119XHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxCdXR0b24gdHlwZT1cInByaW1hcnlcIj5cclxuICAgICAgICAgICAgICAgICAgICDmm7TlpJogPERvd25PdXRsaW5lZCAvPlxyXG4gICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvUG9wb3Zlcj5cclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gPGRpdiBrZXk9e2luZGV4fT57aXRlbX08L2Rpdj47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSl9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgKTtcclxuICB9XHJcbiAgcmVuZGVyQ2xvdW1uQnV0dG9uKGNvbHVtbkJ1dHRvbnM6IGFueSwgcmVjb3JkOiBhbnkpIHtcclxuICAgIGNvbnN0IHsgYWN0aW9uUG9ycHMgfSA9IHRoaXMucHJvcHM7XHJcbiAgICBjb25zdCB7IGJhc2VBY3Rpb25Db2x1bW4gfSA9IGNvbmZpZygpO1xyXG4gICAgY29uc3QgbmV3QnV0dG9ucyA9IFtdO1xyXG4gICAgbGV0IHNob3dJY29uID0gdHJ1ZTtcclxuICAgIGlmIChhY3Rpb25Qb3Jwcz8uc2hvd0ljb24gPT09IGZhbHNlKSBzaG93SWNvbiA9IGZhbHNlO1xyXG4gICAgZWxzZSBpZiAoYmFzZUFjdGlvbkNvbHVtbi5zaG93SWNvbiA9PT0gZmFsc2UpIHNob3dJY29uID0gZmFsc2U7XHJcbiAgICBjb2x1bW5CdXR0b25zLm1hcCgoaXRlbTogYW55LCBpbmRleDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHsgY2hpbGRyZW4sIHBhZ2VUeXBlLCBvbkNsaWNrLCBpY29uLCByZWNvcmRTaG93LCAuLi5wYXJhbXMgfSA9XHJcbiAgICAgICAgaXRlbS5wcm9wcztcclxuICAgICAgaWYgKHJlY29yZFNob3cpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHJlY29yZFNob3cgPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgaWYgKGV2YWwocmVjb3JkU2hvdykpIHtcclxuICAgICAgICAgICAgbmV3QnV0dG9ucy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlY29yZFNob3cgPT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICBjb25zdCBzaG93ID0gcmVjb3JkU2hvdyhyZWNvcmQpO1xyXG4gICAgICAgICAgc2hvdyAmJiBuZXdCdXR0b25zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5ld0J1dHRvbnMucHVzaChpdGVtKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBmbGFnID0gbmV3QnV0dG9ucy5sZW5ndGggPiAzO1xyXG5cclxuICAgIGNvbnN0IGNvbnRlbnQgPSBuZXdCdXR0b25zLm1hcCgoaXRlbTogYW55LCBpbmRleDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHsgY2hpbGRyZW4sIHBhZ2VUeXBlLCBvbkNsaWNrLCByZWNvcmRTaG93LCBpY29uLCBzaG93LCAuLi5wYXJhbXMgfSA9XHJcbiAgICAgICAgaXRlbS5wcm9wcztcclxuICAgICAgaWYgKGluZGV4ID4gMikge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xzKFxyXG4gICAgICAgICAgICAgIGdldExlc3Moc3R5bGVzLCBcIm5zYy1iYXNlcGFnZS1lZGl0b3JcIiksXHJcbiAgICAgICAgICAgICAgZ2V0TGVzcyhzdHlsZXMsIFwibnNjLWJhc2VwYWdlLWNvbnRlbnQtaXRlbVwiKVxyXG4gICAgICAgICAgICApfVxyXG4gICAgICAgICAgICBrZXk9e2luZGV4fVxyXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgb25DbGljayAmJiBvbkNsaWNrKHJlY29yZCk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgIHsuLi5wYXJhbXN9XHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHtzaG93SWNvbiAhPT0gZmFsc2UgJiYgKFxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17Z2V0TGVzcyhzdHlsZXMsIFwibnNjLWJhc2VwYWdlLWljb25cIil9PntpY29ufTwvc3Bhbj5cclxuICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtnZXRMZXNzKHN0eWxlcywgXCJuc2MtYmFzZXBhZ2UtdGV4dFwiKX0+e2NoaWxkcmVufTwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBuZXdCdXR0b25zLm1hcCgoaXRlbTogYW55LCBpbmRleDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHsgY2hpbGRyZW4sIHBhZ2VUeXBlLCBvbkNsaWNrLCByZWNvcmRTaG93LCBpY29uLCAuLi5wYXJhbXMgfSA9XHJcbiAgICAgICAgaXRlbS5wcm9wcztcclxuICAgICAgaWYgKGZsYWcpIHtcclxuICAgICAgICBpZiAoaW5kZXggPCAzKSB7XHJcbiAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbHMoZ2V0TGVzcyhzdHlsZXMsIFwibnNjLWJhc2VwYWdlLWVkaXRvclwiKSwge1xyXG4gICAgICAgICAgICAgICAgW2dldExlc3Moc3R5bGVzLCBcIm5zYy1iYXNlcGFnZS1lZGl0b3ItZmlyc3RcIildOiBpbmRleCA9PT0gMCxcclxuICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICBrZXk9e2luZGV4fVxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2sgJiYgb25DbGljayhyZWNvcmQpO1xyXG4gICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgey4uLnBhcmFtc31cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHtzaG93SWNvbiAhPT0gZmFsc2UgJiYgKFxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtnZXRMZXNzKHN0eWxlcywgXCJuc2MtYmFzZXBhZ2UtaWNvblwiKX0+e2ljb259PC9zcGFuPlxyXG4gICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtnZXRMZXNzKHN0eWxlcywgXCJuc2MtYmFzZXBhZ2UtdGV4dFwiKX0+e2NoaWxkcmVufTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gMykge1xyXG4gICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPFBvcG92ZXJcclxuICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b21cIlxyXG4gICAgICAgICAgICAgIHRpdGxlPXtudWxsfVxyXG4gICAgICAgICAgICAgIGNvbnRlbnQ9e2NvbnRlbnR9XHJcbiAgICAgICAgICAgICAgdHJpZ2dlcj17W1wiY2xpY2tcIl19XHJcbiAgICAgICAgICAgICAga2V5PXtpbmRleH1cclxuICAgICAgICAgICAgICAvLyBvdmVybGF5Q2xhc3NOYW1lPXtzdHlsZXNbJ3BvcCddfVxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2dldExlc3Moc3R5bGVzLCBcIm5zYy1iYXNlcGFnZS1lZGl0b3JcIil9PlxyXG4gICAgICAgICAgICAgICAgPEVsbGlwc2lzT3V0bGluZWQgLz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9Qb3BvdmVyPlxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xzKGdldExlc3Moc3R5bGVzLCBcIm5zYy1iYXNlcGFnZS1lZGl0b3JcIiksIHtcclxuICAgICAgICAgICAgICBbZ2V0TGVzcyhzdHlsZXMsIFwibnNjLWJhc2VwYWdlLWVkaXRvci1maXJzdFwiKV06IGluZGV4ID09PSAwLFxyXG4gICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAga2V5PXtpbmRleH1cclxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgIG9uQ2xpY2sgJiYgb25DbGljayhyZWNvcmQpO1xyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICB7Li4ucGFyYW1zfVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7c2hvd0ljb24gIT09IGZhbHNlICYmIChcclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e2dldExlc3Moc3R5bGVzLCBcIm5zYy1iYXNlcGFnZS1pY29uXCIpfT57aWNvbn08L3NwYW4+XHJcbiAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17Z2V0TGVzcyhzdHlsZXMsIFwibnNjLWJhc2VwYWdlLXRleHRcIil9PntjaGlsZHJlbn08L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIC8vIH1cclxuICB9XHJcbiAgLy/moJHngrnlh7vkuovku7ZcclxuICB0cmVlU2VsZWN0KHNlbGVjdGVkS2V5czogYW55LCBvYmo6IGFueSkge1xyXG4gICAgbGV0IGtleXdvcmQgPSBcIlwiO1xyXG4gICAgY29uc3Qge1xyXG4gICAgICBzZWFyY2hLZXkgPSBcImtleVwiLFxyXG4gICAgICBzZWFyY2hGaWVsZCA9IFwiXCIsXHJcbiAgICAgIHBhcmFudFNlbGVjdCA9IHRydWUsXHJcbiAgICB9ID0gdGhpcy5wcm9wcy50cmVlUHJvcHM7XHJcbiAgICBjb25zdCB7IHRyZWVTZWxlY3RlZEtleSB9ID0gdGhpcy5zdGF0ZTtcclxuICAgIGNvbnN0IHsgc2VsZWN0ZWQsIHNlbGVjdGVkTm9kZXMgfSA9IG9iajtcclxuXHJcbiAgICBpZiAoc2VsZWN0ZWQpIHtcclxuICAgICAga2V5d29yZCA9IHNlbGVjdGVkTm9kZXNbMF0uZGF0YXJlZi5hdHRyaWJ1dGVbc2VhcmNoS2V5XTtcclxuICAgICAgaWYgKHBhcmFudFNlbGVjdCkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgdHJlZVNlbGVjdGVkS2V5OiBzZWxlY3RlZEtleXNbMF0sXHJcbiAgICAgICAgICB0cmVlU2VhcmNoUHJhbXM6IHsgW3NlYXJjaEZpZWxkXToga2V5d29yZCB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChzZWxlY3RlZE5vZGVzWzBdLmlzTGVhZiB8fCAhc2VsZWN0ZWROb2Rlc1swXS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgaWYgKHNlbGVjdGVkS2V5c1swXSAhPT0gdHJlZVNlbGVjdGVkS2V5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgIHRyZWVTZWxlY3RlZEtleTogc2VsZWN0ZWRLZXlzWzBdLFxyXG4gICAgICAgICAgICAgIHRyZWVTZWFyY2hQcmFtczogeyBbc2VhcmNoRmllbGRdOiBrZXl3b3JkIH0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgdHJlZVNlbGVjdGVkS2V5OiBrZXl3b3JkLFxyXG4gICAgICAgIHRyZWVTZWFyY2hQcmFtczoge30sXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucHJvcHMub25UcmVlU2VsZWN0KSB7XHJcbiAgICAgIHRoaXMucHJvcHMub25UcmVlU2VsZWN0KHNlbGVjdGVkS2V5cywgb2JqKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZnJvbVZhbHVlID0gdGhpcy5zZWFyY2hSZWY/LmN1cnJlbnQ/LmdldFNlYXJjaFZhbHVlcygpIHx8IHt9O1xyXG4gICAgc2VhcmNoRmllbGQgJiYgdGhpcy50YWJsZUxvYWQoeyAuLi5mcm9tVmFsdWUsIFtzZWFyY2hGaWVsZF06IGtleXdvcmQgfSk7XHJcbiAgICB0aGlzLnByb3BzLm9uQ2FsbEJhY2tzPy50cmVlU2VsZWN0Q2FsbEJhY2sgJiZcclxuICAgICAgdXRpbHMuY2FsbGJhY2sodGhpcy5wcm9wcy5vbkNhbGxCYWNrcz8udHJlZVNlbGVjdENhbGxCYWNrLCB0aGlzLCBbXHJcbiAgICAgICAgc2VsZWN0ZWRLZXlzLFxyXG4gICAgICAgIG9iaixcclxuICAgICAgXSk7XHJcbiAgfVxyXG4gIHJlc2V0U2VhcmNoKCkge1xyXG4gICAgdGhpcy5zZWFyY2hSZWYuY3VycmVudD8ucmVzZXRGaWVsZHMoKTtcclxuICB9XHJcbiAgZ2V0VGV4dChwcm9wcywgdGV4dCkge1xyXG4gICAgbGV0IG5ld1RleHQgPSB0ZXh0O1xyXG4gICAgaWYgKHByb3BzPy5kYXRhICYmIHByb3BzPy5kYXRhPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBkYXRhID0gcHJvcHMuZGF0YTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhPy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmIChkYXRhW2ldLnZhbHVlID09IHRleHQpIHtcclxuICAgICAgICAgIG5ld1RleHQgPSBkYXRhW2ldLmxhYmVsO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld1RleHQ7XHJcbiAgfVxyXG4gIHNldFRhYmxlRGF0YShkYXRhKSB7XHJcbiAgICB0aGlzLnRhYmxlUmVmLmN1cnJlbnQ/LnN0b3JlPy5zZXREYXRhKGRhdGEpO1xyXG4gIH1cclxuICBzZXRUcmVlRGF0YShkYXRhKSB7XHJcbiAgICB0aGlzLnRyZWVSZWYuY3VycmVudD8uc3RvcmU/LnNldERhdGEoZGF0YSk7XHJcbiAgfVxyXG4gIGdldFNlbGVjdGVkS2V5ID0gKHNlbGVjdGVkKSA9PiB7XHJcbiAgICBsZXQgcmVzID0gW107XHJcbiAgICBmb3IgKGxldCBrZXkgaW4gc2VsZWN0ZWQpIHtcclxuICAgICAgY29uc3Qga2V5cyA9IHNlbGVjdGVkW2tleV07XHJcbiAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICByZXMgPSBbLi4ucmVzLCAuLi5rZXlzXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9O1xyXG5cclxuICByZW5kZXIoKSB7XHJcbiAgICBjb25zdCB7XHJcbiAgICAgIGNvbHVtbnMgPSBbXSxcclxuICAgICAgc2hvd1NlYXJjaCA9IHRydWUsXHJcbiAgICAgIGNoaWxkcmVuLFxyXG4gICAgICBzdWJtaXRVcmwgPSBcIlwiLFxyXG4gICAgICB0YWJsZVByb3BzID0ge30sXHJcbiAgICAgIHRyZWVQcm9wcyA9IHt9LFxyXG4gICAgICBmb3JtUHJvcHMgPSB7fSxcclxuICAgICAgc2hvd0xlZnQgPSBmYWxzZSxcclxuICAgICAgc3VibWl0UGFyYW1zID0ge30sXHJcbiAgICAgIHNob3dUb29sQnV0dG9uID0gdHJ1ZSxcclxuICAgICAgYnV0dG9ucyA9IFtdLFxyXG4gICAgICBlZGl0b3JGb3JtID0gdHJ1ZSxcclxuICAgICAgb25TaG93Rm9ybSxcclxuICAgICAgZm9ybUNoYW5nZVZhbGlkID0gdHJ1ZSxcclxuICAgICAgY2xhc3NOYW1lLFxyXG4gICAgICB0b29sQnV0dG9uUG9zaXRpb24gPSBcImJ1dHRvbVwiLFxyXG4gICAgICBhY3Rpb25Qb3JwcyxcclxuICAgICAgZGVsZXRlUG9zaXRpb24gPSBcInRvb2xiYXJcIixcclxuICAgIH0gPSB0aGlzLnByb3BzO1xyXG4gICAgY29uc3Qge1xyXG4gICAgICBzdG9yZSxcclxuICAgICAgZmlsdGVyQ29sdW1uID0gdHJ1ZSxcclxuICAgICAgYWN0aW9uQ29sdW1uID0gdHJ1ZSxcclxuICAgICAgc2hvd1Jvd1NlbGVjdGlvbiA9IHRydWUsXHJcbiAgICAgIGNvbHVtbk9yZGVyID0gdHJ1ZSxcclxuICAgICAgZXhwYW5kYWJsZSA9IHt9LFxyXG4gICAgICBwYXJhbnRTZWxlY3QgPSB0cnVlLFxyXG4gICAgICAuLi5vdGhlcnRhYmxlUGFyYW1zXHJcbiAgICB9ID0gdGFibGVQcm9wcztcclxuXHJcbiAgICBjb25zdCB7XHJcbiAgICAgIHN0b3JlOiB0cmVlU3RvcmUgPSB7fSxcclxuICAgICAgc2hvd1NlYXJjaDogdHJlZVNlYXJjaCA9IHRydWUsXHJcbiAgICAgIHRpdGxlQWxpYXMgPSBcInRpdGxlXCIsXHJcbiAgICAgIC4uLm90aGVydHJlZVBhcmFtc1xyXG4gICAgfSA9IHRyZWVQcm9wcztcclxuXHJcbiAgICBsZXQgdGFibGVQYXJhbXMgPSB7IGZpbHRlckNvbHVtbiwgc3RvcmUsIC4uLm90aGVydGFibGVQYXJhbXMgfSBhcyBhbnk7XHJcbiAgICBsZXQgdGFibGVDb2x1bW46IGFueVtdID0gW107XHJcbiAgICBjb25zdCBzZWFyY2hGb3JtczogYW55ID0gW107XHJcbiAgICBjb25zdCBlZGl0b3JGb3JtczogYW55ID0gW107XHJcbiAgICBjb25zdCBkZWZhdWx0VmFsdWU6IGFueSA9IHt9O1xyXG4gICAgY29uc3QgY29sdW1uQnV0dG9uczogYW55ID0gW107XHJcbiAgICBjb2x1bW5zLm1hcCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgIGxldCB0ZW1wID0geyAuLi5pdGVtIH07XHJcbiAgICAgIGlmICh0ZW1wLnNlYXJjaCA9PT0gdHJ1ZSB8fCB0ZW1wLnNlYXJjaD8uc2hvdyA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIHNlYXJjaEZvcm1zLnB1c2goe1xyXG4gICAgICAgICAgbmFtZTogdGVtcC5maWVsZCB8fCB0ZW1wLmRhdGFJbmRleCxcclxuICAgICAgICAgIGxhYmVsOiB0ZW1wLnNlYXJjaD8ubGFiZWwgfHwgdGVtcC50aXRsZSxcclxuICAgICAgICAgIHR5cGU6IHRlbXAudHlwZSxcclxuICAgICAgICAgIHByb3BzOiB0ZW1wLnByb3BzLFxyXG4gICAgICAgICAgbGFiZWxDb2w6IHRlbXAuc2VhcmNoPy5sYWJlbENvbCxcclxuICAgICAgICAgIHdyYXBwZXJDb2w6IHRlbXAuc2VhcmNoPy53cmFwcGVyQ29sLFxyXG4gICAgICAgICAgcnVsZXM6IHRlbXAuc2VhcmNoUnVsZXMgPyB0ZW1wLnNlYXJjaFJ1bGVzIDogW10sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGRlbGV0ZSB0ZW1wLnNlYXJjaDtcclxuICAgICAgdGVtcC5lZGl0b3IgIT09IGZhbHNlICYmXHJcbiAgICAgICAgZWRpdG9yRm9ybXMucHVzaCh7XHJcbiAgICAgICAgICBuYW1lOiB0ZW1wLmZpZWxkIHx8IHRlbXAuZGF0YUluZGV4LFxyXG4gICAgICAgICAgbGFiZWw6IHRlbXAudGl0bGUsXHJcbiAgICAgICAgICBydWxlczogdGVtcC5ydWxlcyA/IHRlbXAucnVsZXMgOiBbXSxcclxuICAgICAgICAgIHR5cGU6IHRlbXAudHlwZSxcclxuICAgICAgICAgIHNwYW46IHRlbXAuc3BhbixcclxuICAgICAgICAgIGRpY3ROYW1lOiB0ZW1wLmRpY3ROYW1lLFxyXG4gICAgICAgICAgcHJvcHM6IHsgLi4udGVtcC5wcm9wcyB9LFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRlbXAucHJvcHM/LmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgdGVtcC5wcm9wcz8uZGVmYXVsdFZhbHVlICE9PSBudWxsXHJcbiAgICAgICkge1xyXG4gICAgICAgIGNvbnN0IG5hbWUgPSB0ZW1wLmZpZWxkIHx8IHRlbXAuZGF0YUluZGV4O1xyXG4gICAgICAgIGRlZmF1bHRWYWx1ZVtuYW1lXSA9IHRlbXAucHJvcHM/LmRlZmF1bHRWYWx1ZTtcclxuICAgICAgfVxyXG4gICAgICBkZWxldGUgdGVtcC5ydWxlcztcclxuICAgICAgZGVsZXRlIHRlbXAuc3BhbjtcclxuICAgICAgaWYgKHRlbXAuY29sdW1uU2VhcmNoKSB7XHJcbiAgICAgICAgdGVtcC5maWx0ZXJQcm9wcyA9IHtcclxuICAgICAgICAgIHR5cGU6IHRlbXAudHlwZSxcclxuICAgICAgICAgIHByb3BzOiB0ZW1wLnByb3BzLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICAgZGVsZXRlIHRlbXAudHlwZTtcclxuICAgICAgbGV0IHRlbXBQcm9wID0geyAuLi50ZW1wLnByb3BzIH07XHJcbiAgICAgIGlmICh0ZW1wLnN0eWxlKSB7XHJcbiAgICAgICAgdGVtcCA9IHtcclxuICAgICAgICAgIHJlbmRlcjogKHRleHQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgIDw+XHJcbiAgICAgICAgICAgICAgICB7dGV4dCAhPT0gXCJcIiAmJiB0ZXh0ICE9PSBudWxsICYmIHRleHQgIT09IHVuZGVmaW5lZCAmJiAoXHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtnZXRMZXNzKHN0eWxlcywgXCJuc2MtYmFzZXBhZ2UtY29sLWJhY2tcIil9PlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17Z2V0TGVzcyhzdHlsZXMsIFwibnNjLWJhc2VwYWdlLWNvbC10ZXh0XCIpfT5cclxuICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLmdldFRleHQodGVtcFByb3AsIHRleHQpfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgIDwvPlxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIC4uLnRlbXAsXHJcbiAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIGlmICghdGVtcC5lbGxpcHNpcykge1xyXG4gICAgICAgIHRlbXAgPSB7XHJcbiAgICAgICAgICByZW5kZXI6ICh0ZXh0OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIDw+e3RoaXMuZ2V0VGV4dCh0ZW1wUHJvcCwgdGV4dCl9PC8+O1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIC4uLnRlbXAsXHJcbiAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0ZW1wID0geyAuLi50ZW1wIH07XHJcbiAgICAgIH1cclxuICAgICAgZGVsZXRlIHRlbXAucHJvcHM7XHJcbiAgICAgIGlmICh0ZW1wPy5jb2x1bW5TaG93ICE9PSBmYWxzZSkgdGFibGVDb2x1bW4ucHVzaCh0ZW1wKTtcclxuICAgIH0pO1xyXG4gICAgY29uc3Qgc2VsZkJ1dHRvbnM6IGFueSA9IFtdO1xyXG4gICAgY29uc3QgeyBiYXNlQWN0aW9uQ29sdW1uIH0gPSBjb25maWcoKTtcclxuICAgIGxldCBzaG93SWNvbiA9IHRydWU7XHJcbiAgICBpZiAoYWN0aW9uUG9ycHM/LnNob3dJY29uID09PSBmYWxzZSkgc2hvd0ljb24gPSBmYWxzZTtcclxuICAgIGVsc2UgaWYgKGJhc2VBY3Rpb25Db2x1bW4uc2hvd0ljb24gPT09IGZhbHNlKSBzaG93SWNvbiA9IGZhbHNlO1xyXG4gICAgaWYgKGVkaXRvckZvcm0gPT0gdHJ1ZSkge1xyXG4gICAgICBpZiAoYnV0dG9ucy5pbmRleE9mKFwic2VhcmNoXCIpID4gLTEpIHtcclxuICAgICAgICBjb2x1bW5CdXR0b25zLnB1c2goXHJcbiAgICAgICAgICA8QnV0dG9uXHJcbiAgICAgICAgICAgIG9uQ2xpY2s9eyhyZWNvcmQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChvblNob3dGb3JtKSB7XHJcbiAgICAgICAgICAgICAgICBvblNob3dGb3JtKHJlY29yZC5hdHRyaWJ1dGUgfHwgcmVjb3JkLCBcImRldGFpbFwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy5zaG93Rm9ybShyZWNvcmQuYXR0cmlidXRlIHx8IHJlY29yZCwgXCJkZXRhaWxcIik7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgIGljb249ezxFeWVPdXRsaW5lZCAvPn1cclxuICAgICAgICAgID5cclxuICAgICAgICAgICAg5p+l55yLXHJcbiAgICAgICAgICA8L0J1dHRvbj5cclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChidXR0b25zLmluZGV4T2YoXCJlZGl0b3JcIikgPiAtMSkge1xyXG4gICAgICAgIGNvbHVtbkJ1dHRvbnMucHVzaChcclxuICAgICAgICAgIDxCdXR0b25cclxuICAgICAgICAgICAgb25DbGljaz17KHJlY29yZDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKG9uU2hvd0Zvcm0pIHtcclxuICAgICAgICAgICAgICAgIG9uU2hvd0Zvcm0ocmVjb3JkLmF0dHJpYnV0ZSB8fCByZWNvcmQsIFwiZWRpdG9yXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLnNob3dGb3JtKHJlY29yZC5hdHRyaWJ1dGUgfHwgcmVjb3JkLCBcImVkaXRvclwiKTtcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgaWNvbj17PEVkaXRPdXRsaW5lZCAvPn1cclxuICAgICAgICAgID5cclxuICAgICAgICAgICAg57yW6L6RXHJcbiAgICAgICAgICA8L0J1dHRvbj5cclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoYnV0dG9ucy5pbmRleE9mKFwiYWRkXCIpID4gLTEpIHtcclxuICAgICAgc2VsZkJ1dHRvbnMucHVzaChcclxuICAgICAgICA8QnV0dG9uXHJcbiAgICAgICAgICB0eXBlPXtcInByaW1hcnlcIn1cclxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgeyBvblNob3dGb3JtIH0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgICAgICBpZiAob25TaG93Rm9ybSkge1xyXG4gICAgICAgICAgICAgIG9uU2hvd0Zvcm0oKTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zaG93Rm9ybSgpO1xyXG4gICAgICAgICAgfX1cclxuICAgICAgICAgIGljb249ezxQbHVzT3V0bGluZWQgLz59XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAg5re75YqgXHJcbiAgICAgICAgPC9CdXR0b24+XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAoYnV0dG9ucy5pbmRleE9mKFwiZGVsZXRlXCIpID4gLTEpIHtcclxuICAgICAgaWYgKGRlbGV0ZVBvc2l0aW9uID09IFwidG9vbGJhclwiKSB7XHJcbiAgICAgICAgc2VsZkJ1dHRvbnMucHVzaChcclxuICAgICAgICAgIDxCdXR0b25cclxuICAgICAgICAgICAgLy8gdHlwZT17XCJwcmltYXJ5XCJ9XHJcbiAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMub25EZWxldGUuYmluZCh0aGlzKX1cclxuICAgICAgICAgICAgaWNvbj17PERlbGV0ZU91dGxpbmVkIC8+fVxyXG4gICAgICAgICAgICBkYW5nZXJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAg5Yig6ZmkXHJcbiAgICAgICAgICA8L0J1dHRvbj5cclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2UgaWYgKGRlbGV0ZVBvc2l0aW9uID09IFwicm93XCIpIHtcclxuICAgICAgICBjb2x1bW5CdXR0b25zLnB1c2goXHJcbiAgICAgICAgICA8QnV0dG9uXHJcbiAgICAgICAgICAgIC8vIHR5cGU9e1wicHJpbWFyeVwifVxyXG4gICAgICAgICAgICBvbkNsaWNrPXsocmVjb3JkOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLm9uRGVsZXRlKHJlY29yZCk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgIGljb249ezxEZWxldGVPdXRsaW5lZCAvPn1cclxuICAgICAgICAgICAgZGFuZ2VyXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIOWIoOmZpFxyXG4gICAgICAgICAgPC9CdXR0b24+XHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XHJcbiAgICAgIGNoaWxkcmVuLm1hcCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcclxuICAgICAgICAgIGl0ZW0ubWFwKChjaGlsZCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY2hpbGQ/LnByb3BzPy5wYWdlVHlwZSA9PSBcInRvb2xCdXR0b25cIikge1xyXG4gICAgICAgICAgICAgIHNlbGZCdXR0b25zLnB1c2goY2hpbGQpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkPy5wcm9wcz8ucGFnZVR5cGUgPT0gXCJjbG91bW5CdXR0b25cIikge1xyXG4gICAgICAgICAgICAgIGNvbHVtbkJ1dHRvbnMucHVzaChjaGlsZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoaXRlbT8ucHJvcHM/LnBhZ2VUeXBlID09IFwidG9vbEJ1dHRvblwiKSB7XHJcbiAgICAgICAgICAgIHNlbGZCdXR0b25zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0/LnByb3BzPy5wYWdlVHlwZSA9PSBcImNsb3VtbkJ1dHRvblwiKSB7XHJcbiAgICAgICAgICAgIGNvbHVtbkJ1dHRvbnMucHVzaChpdGVtKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmIChjaGlsZHJlbikge1xyXG4gICAgICBjb25zdCB7IHByb3BzIH06IGFueSA9IGNoaWxkcmVuO1xyXG4gICAgICBpZiAocHJvcHM/LnBhZ2VUeXBlID09IFwidG9vbEJ1dHRvblwiKSB7XHJcbiAgICAgICAgc2VsZkJ1dHRvbnMucHVzaChjaGlsZHJlbik7XHJcbiAgICAgIH0gZWxzZSBpZiAocHJvcHM/LnBhZ2VUeXBlID09IFwiY2xvdW1uQnV0dG9uXCIpIHtcclxuICAgICAgICBjb2x1bW5CdXR0b25zLnB1c2goY2hpbGRyZW4pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBhY3Rpb25Db2x1bW4gJiZcclxuICAgICAgdGFibGVDb2x1bW4ucHVzaCh7XHJcbiAgICAgICAgdGl0bGU6IFwi5pON5L2cXCIsXHJcbiAgICAgICAgZGF0YUluZGV4OiBcImFjdGlvblwiLFxyXG4gICAgICAgIGFsaWduOiBhY3Rpb25Qb3Jwcz8udGV4dEFsaWduXHJcbiAgICAgICAgICA/IGFjdGlvblBvcnBzPy50ZXh0QWxpZ25cclxuICAgICAgICAgIDogYmFzZUFjdGlvbkNvbHVtbi50ZXh0QWxpZ25cclxuICAgICAgICAgID8gYmFzZUFjdGlvbkNvbHVtbi50ZXh0QWxpZ25cclxuICAgICAgICAgIDogXCJjZW50ZXJcIixcclxuICAgICAgICB3aWR0aDogYWN0aW9uUG9ycHM/LndpZHRoXHJcbiAgICAgICAgICA/IGFjdGlvblBvcnBzPy53aWR0aFxyXG4gICAgICAgICAgOiBiYXNlQWN0aW9uQ29sdW1uLndpZHRoXHJcbiAgICAgICAgICA/IGJhc2VBY3Rpb25Db2x1bW4ud2lkdGhcclxuICAgICAgICAgIDogMjAwLFxyXG4gICAgICAgIGZpeGVkOiBcInJpZ2h0XCIsXHJcbiAgICAgICAgcmVuZGVyOiAodGV4dDogYW55LCByZWNvcmQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2dldExlc3Moc3R5bGVzLCBcIm5zYy1iYXNlcGFnZS1hY3Rpb25cIil9PlxyXG4gICAgICAgICAgICAgIHt0aGlzLnJlbmRlckNsb3VtbkJ1dHRvbihjb2x1bW5CdXR0b25zLCByZWNvcmQpfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICBpZiAoY29sdW1uT3JkZXIpXHJcbiAgICAgIHRhYmxlQ29sdW1uID0gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRpdGxlOiBcIuW6j+WPt1wiLFxyXG4gICAgICAgICAgd2lkdGg6IDgwLFxyXG4gICAgICAgICAgYWxpZ246IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICByZW5kZXI6ICh0ZXh0LCByZWFjb3JkLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gPD57aW5kZXggKyAxfTwvPjtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICAuLi50YWJsZUNvbHVtbixcclxuICAgICAgXTtcclxuICAgIGxldCBzZWFyY2hGbGFnID0gc2hvd1NlYXJjaCAmJiBzZWFyY2hGb3Jtcy5sZW5ndGggPiAwO1xyXG4gICAgbGV0IHsgdGFibGVUb29sIH0gPSBjb25maWcoKTtcclxuICAgIGxldCB0b29sRmxhZyA9IHNob3dUb29sQnV0dG9uICYmIHNlbGZCdXR0b25zLmxlbmd0aCA+IDA7XHJcbiAgICBsZXQgdG9vbGJhckZsYWcgPSAhKFxyXG4gICAgICB0YWJsZVByb3BzLnRvb2xiYXIgPT0gZmFsc2UgfHxcclxuICAgICAgdGFibGVQcm9wcy50b29sYmFyPy5zaG93ID09IGZhbHNlIHx8XHJcbiAgICAgIHRhYmxlUHJvcHMudG9vbGJhcj8udG9vbHM/Lmxlbmd0aCA9PSAwIHx8XHJcbiAgICAgIHRhYmxlVG9vbD8uc2hvdyA9PSBmYWxzZVxyXG4gICAgKTtcclxuICAgIGlmICh0YWJsZVByb3BzLnBhZ2luYXRpb24gIT09IGZhbHNlKSB7XHJcbiAgICAgIGNvbnN0IHNjcm9sbCA9IHRhYmxlUGFyYW1zLnNjcm9sbDtcclxuICAgICAgdGFibGVQYXJhbXMgPSB7XHJcbiAgICAgICAgLi4udGFibGVQYXJhbXMsXHJcbiAgICAgICAgc2Nyb2xsOiB7IHg6IFwibWF4LWNvbnRlbnRcIiwgLi4uc2Nyb2xsIH0sXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIChcclxuICAgICAgPGRpdiBjbGFzc05hbWU9e2NscyhnZXRMZXNzKHN0eWxlcywgXCJuc2MtYmFzZXBhZ2VcIiksIGNsYXNzTmFtZSl9PlxyXG4gICAgICAgIHt0aGlzLnByb3BzLnBhZ2VUaXRsZSAmJiAoXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xzKGdldExlc3Moc3R5bGVzLCBcIm5zYy1iYXNlcGFnZS10aXRsZVwiKSl9PlxyXG4gICAgICAgICAgICB7dGhpcy5wcm9wcy5wYWdlVGl0bGV9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICApfVxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzTmFtZT17Y2xzKGdldExlc3Moc3R5bGVzLCBcIm5zYy1iYXNlcGFnZS1wYW5lXCIpKX1cclxuICAgICAgICAgIHN0eWxlPXt7IGRpc3BsYXk6IFwiZmxleFwiIH19XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3Nob3dMZWZ0ICYmIChcclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2dldExlc3Moc3R5bGVzLCBcIm5zYy1iYXNlcGFnZS1sZWZ0XCIpfT5cclxuICAgICAgICAgICAgICA8VHJlZVxyXG4gICAgICAgICAgICAgICAgc3RvcmU9e3sgLi4udHJlZVN0b3JlIH19XHJcbiAgICAgICAgICAgICAgICBzaG93SWNvbj17ZmFsc2V9XHJcbiAgICAgICAgICAgICAgICBjaGVja2FibGU9e2ZhbHNlfVxyXG4gICAgICAgICAgICAgICAgc2VhcmNoYWJsZT17dHJlZVNlYXJjaH1cclxuICAgICAgICAgICAgICAgIG9uU2VsZWN0PXt0aGlzLnRyZWVTZWxlY3QuYmluZCh0aGlzKX1cclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkS2V5cz17W3RoaXMuc3RhdGUudHJlZVNlbGVjdGVkS2V5XX1cclxuICAgICAgICAgICAgICAgIHRpdGxlQWxpYXM9e3RpdGxlQWxpYXN9XHJcbiAgICAgICAgICAgICAgICB7Li4ub3RoZXJ0cmVlUGFyYW1zfVxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgKX1cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbHMoZ2V0TGVzcyhzdHlsZXMsIFwibnNjLWJhc2VwYWdlLXJpZ2h0XCIpLCB7XHJcbiAgICAgICAgICAgICAgW2dldExlc3Moc3R5bGVzLCBcIm5zYy1iYXNlcGFnZS1uby1sZWZ0LXJpZ2h0XCIpXTogIXNob3dMZWZ0LFxyXG4gICAgICAgICAgICB9KX1cclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3Nob3dTZWFyY2ggJiYgc2VhcmNoRm9ybXMubGVuZ3RoID4gMCAmJiAoXHJcbiAgICAgICAgICAgICAgPEhlYWRlclNlYXJjaFxyXG4gICAgICAgICAgICAgICAgc2VhcmNoRm9ybXM9e3NlYXJjaEZvcm1zfVxyXG4gICAgICAgICAgICAgICAgdG9vbEJ1dHRvblBvc2l0aW9uPXt0b29sQnV0dG9uUG9zaXRpb259XHJcbiAgICAgICAgICAgICAgICBvblNlYXJjaD17dGhpcy5vblNlYXJjaC5iaW5kKHRoaXMpfVxyXG4gICAgICAgICAgICAgICAgb25SZXNldD17dGhpcy5wcm9wcy5vblJlc2V0fVxyXG4gICAgICAgICAgICAgICAgcmVmPXt0aGlzLnNlYXJjaFJlZn1cclxuICAgICAgICAgICAgICAgIHNlYXJjaEZvcm1Qcm9wcz17dGhpcy5wcm9wcy5zZWFyY2hGb3JtUHJvcHN9XHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgKX1cclxuXHJcbiAgICAgICAgICAgIHtzaG93VG9vbEJ1dHRvbiAmJlxyXG4gICAgICAgICAgICAgIHNlbGZCdXR0b25zLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICB0b29sQnV0dG9uUG9zaXRpb24gPT0gXCJidXR0b21cIiAmJlxyXG4gICAgICAgICAgICAgIHRoaXMucmVuZGVyVG9vbEJ1dHRvbnMoc2VsZkJ1dHRvbnMsIHNlYXJjaEZvcm1zLmxlbmd0aCA9PSAwKX1cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xzKGdldExlc3Moc3R5bGVzLCBcIm5zYy1iYXNlcGFnZS10YWJsZVwiKSwge1xyXG4gICAgICAgICAgICAgICAgW2dldExlc3Moc3R5bGVzLCBcIm5zYy1iYXNlcGFnZS10YWJsZS10b3BcIildOlxyXG4gICAgICAgICAgICAgICAgICAoc2VhcmNoRmxhZyAmJiAhdG9vbEZsYWcpIHx8ICF0b29sYmFyRmxhZyxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFtnZXRMZXNzKHN0eWxlcywgXCJuc2MtYmFzZXBhZ2UtdGFibGUtdG9wMlwiKV06ICFzZWFyY2hGbGFnICYmICF0b29sRmxhZyxcclxuICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxUYWJsZVxyXG4gICAgICAgICAgICAgICAgcmVmPXt0aGlzLnRhYmxlUmVmfVxyXG4gICAgICAgICAgICAgICAgY29sdW1ucz17dGFibGVDb2x1bW59XHJcbiAgICAgICAgICAgICAgICBleHBhbmRhYmxlPXt7XHJcbiAgICAgICAgICAgICAgICAgIGV4cGFuZEljb246ICh7IGV4cGFuZGVkLCBvbkV4cGFuZCwgcmVjb3JkIH0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgICAgICAge2V4cGFuZGVkID8gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxEb3duT3V0bGluZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiBvbkV4cGFuZChyZWNvcmQsIGUpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtnZXRMZXNzKHN0eWxlcywgXCJuc2MtYmFzZXBhZ2UtZXhwYW5kLWljb25cIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQuY2hpbGROb2RlcyAmJiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UmlnaHRPdXRsaW5lZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4gb25FeHBhbmQocmVjb3JkLCBlKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtnZXRMZXNzKHN0eWxlcywgXCJuc2MtYmFzZXBhZ2UtZXhwYW5kLWljb25cIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvPlxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIC4uLmV4cGFuZGFibGUsXHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgY29sdW1uT3JkZXI9e3RydWV9XHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHBhZ2luYXRpb24pID0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgeyBjdXJyZW50UGFnZSB9ID0gdGhpcy5zdGF0ZTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQYWdlICE9PSBwYWdpbmF0aW9uLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYWdlOiBwYWdpbmF0aW9uLmN1cnJlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICB0b29sYmFyPXt7XHJcbiAgICAgICAgICAgICAgICAgIG9uVG9vbENsaWNrOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgb25SZWZyZXNoOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmdldFNlYXJjaFZhbHVlcygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZUxvYWQocGFyYW1zKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAuLi50YWJsZVByb3BzLnRvb2xiYXIsXHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgc2hvd1Jvd1NlbGVjdGlvbj17c2hvd1Jvd1NlbGVjdGlvbn1cclxuICAgICAgICAgICAgICAgIHsuLi50YWJsZVBhcmFtc31cclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAge2VkaXRvckZvcm0gJiYgKFxyXG4gICAgICAgICAgICA8RWRpdG9yRm9ybVxyXG4gICAgICAgICAgICAgIHJlZj17dGhpcy5lZGl0b3JSZWZ9XHJcbiAgICAgICAgICAgICAgY2FsbEJhY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMub25DYWxsQmFja3M/Lm9uU3VtYml0Q2FsbEJhY2sgJiZcclxuICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNhbGxCYWNrcz8ub25TdW1iaXRDYWxsQmFjaygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZVJlbG9hZC5iaW5kKHRoaXMpO1xyXG4gICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgZm9ybVByb3BzPXtlZGl0b3JGb3Jtc31cclxuICAgICAgICAgICAgICBzdWJtaXRVcmw9e3N1Ym1pdFVybH1cclxuICAgICAgICAgICAgICBzdWJtaXRQYXJhbXM9e3N1Ym1pdFBhcmFtc31cclxuICAgICAgICAgICAgICBvblN1Ym1pdD17dGhpcy5wcm9wcy5vblN1Ym1pdH1cclxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU9e2RlZmF1bHRWYWx1ZX1cclxuICAgICAgICAgICAgICBvbkhpZGVGb3JtPXt0aGlzLnByb3BzLm9uSGlkZUZvcm19XHJcbiAgICAgICAgICAgICAgb25Gb3JtQ2hhbmdlPXt0aGlzLnByb3BzLm9uRm9ybUNoYW5nZX1cclxuICAgICAgICAgICAgICBmb3JtVHlwZT17dGhpcy5wcm9wcy5mb3JtVHlwZSB8fCBcImF1dG9cIn1cclxuICAgICAgICAgICAgICBjaGFuZ2VWYWxpZD17Zm9ybUNoYW5nZVZhbGlkfVxyXG4gICAgICAgICAgICAgIG90aGVyUHJvcHM9e3sgLi4uZm9ybVByb3BzIH19XHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICApfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICk7XHJcbiAgfVxyXG59XHJcbmV4cG9ydCBkZWZhdWx0IEJhc2VQYWdlO1xyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBT0EsS0FBSyxJQUFJQyxhQUFhLFFBQW1CLE9BQU87QUFDdkQsT0FBT0MsS0FBSyxNQUFNLGtCQUFrQjtBQUNwQyxPQUFPQyxJQUFJLE1BQU0saUJBQWlCO0FBRWxDLE9BQU9DLE1BQU0sTUFBTSxtQkFBbUI7QUFDdEMsT0FBT0MsS0FBSyxNQUFNLGtCQUFrQjtBQUNwQyxPQUFPQyxPQUFPLE1BQU0s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