@iobroker/adapter-react-v5 2.1.10 → 3.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.
Files changed (86) hide show
  1. package/Components/FileBrowser.js +248 -222
  2. package/Components/FileBrowser.js.map +1 -1
  3. package/Components/FileViewer.js +219 -75
  4. package/Components/FileViewer.js.map +1 -1
  5. package/Components/JsonConfigComponent/ChipInput.js +926 -0
  6. package/Components/JsonConfigComponent/ChipInput.js.map +1 -0
  7. package/Components/JsonConfigComponent/ConfigAlive.js +135 -0
  8. package/Components/JsonConfigComponent/ConfigAlive.js.map +1 -0
  9. package/Components/JsonConfigComponent/ConfigAutocomplete.js +204 -0
  10. package/Components/JsonConfigComponent/ConfigAutocomplete.js.map +1 -0
  11. package/Components/JsonConfigComponent/ConfigAutocompleteSendTo.js +311 -0
  12. package/Components/JsonConfigComponent/ConfigAutocompleteSendTo.js.map +1 -0
  13. package/Components/JsonConfigComponent/ConfigCRON.js +195 -0
  14. package/Components/JsonConfigComponent/ConfigCRON.js.map +1 -0
  15. package/Components/JsonConfigComponent/ConfigCertificateSelect.js +178 -0
  16. package/Components/JsonConfigComponent/ConfigCertificateSelect.js.map +1 -0
  17. package/Components/JsonConfigComponent/ConfigCheckbox.js +112 -0
  18. package/Components/JsonConfigComponent/ConfigCheckbox.js.map +1 -0
  19. package/Components/JsonConfigComponent/ConfigChip.js +149 -0
  20. package/Components/JsonConfigComponent/ConfigChip.js.map +1 -0
  21. package/Components/JsonConfigComponent/ConfigColor.js +156 -0
  22. package/Components/JsonConfigComponent/ConfigColor.js.map +1 -0
  23. package/Components/JsonConfigComponent/ConfigCoordinates.js +165 -0
  24. package/Components/JsonConfigComponent/ConfigCoordinates.js.map +1 -0
  25. package/Components/JsonConfigComponent/ConfigCustomEasyAccess.js +180 -0
  26. package/Components/JsonConfigComponent/ConfigCustomEasyAccess.js.map +1 -0
  27. package/Components/JsonConfigComponent/ConfigDatePicker.js +117 -0
  28. package/Components/JsonConfigComponent/ConfigDatePicker.js.map +1 -0
  29. package/Components/JsonConfigComponent/ConfigGeneric.js +660 -0
  30. package/Components/JsonConfigComponent/ConfigGeneric.js.map +1 -0
  31. package/Components/JsonConfigComponent/ConfigIP.js +151 -0
  32. package/Components/JsonConfigComponent/ConfigIP.js.map +1 -0
  33. package/Components/JsonConfigComponent/ConfigImageUpload.js +215 -0
  34. package/Components/JsonConfigComponent/ConfigImageUpload.js.map +1 -0
  35. package/Components/JsonConfigComponent/ConfigInstanceSelect.js +197 -0
  36. package/Components/JsonConfigComponent/ConfigInstanceSelect.js.map +1 -0
  37. package/Components/JsonConfigComponent/ConfigJsonEditor.js +211 -0
  38. package/Components/JsonConfigComponent/ConfigJsonEditor.js.map +1 -0
  39. package/Components/JsonConfigComponent/ConfigLanguage.js +175 -0
  40. package/Components/JsonConfigComponent/ConfigLanguage.js.map +1 -0
  41. package/Components/JsonConfigComponent/ConfigNumber.js +194 -0
  42. package/Components/JsonConfigComponent/ConfigNumber.js.map +1 -0
  43. package/Components/JsonConfigComponent/ConfigObjectId.js +201 -0
  44. package/Components/JsonConfigComponent/ConfigObjectId.js.map +1 -0
  45. package/Components/JsonConfigComponent/ConfigPanel.js +421 -0
  46. package/Components/JsonConfigComponent/ConfigPanel.js.map +1 -0
  47. package/Components/JsonConfigComponent/ConfigPassword.js +236 -0
  48. package/Components/JsonConfigComponent/ConfigPassword.js.map +1 -0
  49. package/Components/JsonConfigComponent/ConfigPattern.js +94 -0
  50. package/Components/JsonConfigComponent/ConfigPattern.js.map +1 -0
  51. package/Components/JsonConfigComponent/ConfigSelect.js +163 -0
  52. package/Components/JsonConfigComponent/ConfigSelect.js.map +1 -0
  53. package/Components/JsonConfigComponent/ConfigSelectSendTo.js +258 -0
  54. package/Components/JsonConfigComponent/ConfigSelectSendTo.js.map +1 -0
  55. package/Components/JsonConfigComponent/ConfigSendto.js +282 -0
  56. package/Components/JsonConfigComponent/ConfigSendto.js.map +1 -0
  57. package/Components/JsonConfigComponent/ConfigSetState.js +266 -0
  58. package/Components/JsonConfigComponent/ConfigSetState.js.map +1 -0
  59. package/Components/JsonConfigComponent/ConfigStaticDivider.js +88 -0
  60. package/Components/JsonConfigComponent/ConfigStaticDivider.js.map +1 -0
  61. package/Components/JsonConfigComponent/ConfigStaticHeader.js +81 -0
  62. package/Components/JsonConfigComponent/ConfigStaticHeader.js.map +1 -0
  63. package/Components/JsonConfigComponent/ConfigStaticImage.js +88 -0
  64. package/Components/JsonConfigComponent/ConfigStaticImage.js.map +1 -0
  65. package/Components/JsonConfigComponent/ConfigStaticText.js +104 -0
  66. package/Components/JsonConfigComponent/ConfigStaticText.js.map +1 -0
  67. package/Components/JsonConfigComponent/ConfigTable.js +651 -0
  68. package/Components/JsonConfigComponent/ConfigTable.js.map +1 -0
  69. package/Components/JsonConfigComponent/ConfigTabs.js +166 -0
  70. package/Components/JsonConfigComponent/ConfigTabs.js.map +1 -0
  71. package/Components/JsonConfigComponent/ConfigText.js +170 -0
  72. package/Components/JsonConfigComponent/ConfigText.js.map +1 -0
  73. package/Components/JsonConfigComponent/ConfigTextSendTo.js +168 -0
  74. package/Components/JsonConfigComponent/ConfigTextSendTo.js.map +1 -0
  75. package/Components/JsonConfigComponent/ConfigTimePicker.js +111 -0
  76. package/Components/JsonConfigComponent/ConfigTimePicker.js.map +1 -0
  77. package/Components/JsonConfigComponent/ConfigTopic.js +140 -0
  78. package/Components/JsonConfigComponent/ConfigTopic.js.map +1 -0
  79. package/Components/JsonConfigComponent/ConfigUser.js +176 -0
  80. package/Components/JsonConfigComponent/ConfigUser.js.map +1 -0
  81. package/Components/JsonConfigComponent/index.js +511 -0
  82. package/Components/JsonConfigComponent/index.js.map +1 -0
  83. package/Components/Utils.js +25 -0
  84. package/Components/Utils.js.map +1 -1
  85. package/README.md +7 -1
  86. package/package.json +1 -1
@@ -2,6 +2,8 @@
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
5
7
  Object.defineProperty(exports, "__esModule", {
6
8
  value: true
7
9
  });
@@ -11,20 +13,26 @@ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/cl
11
13
 
12
14
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
15
 
16
+ var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
17
+
14
18
  var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
15
19
 
16
20
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
17
21
 
18
22
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
19
23
 
20
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
24
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
25
+
26
+ var _react = _interopRequireWildcard(require("react"));
21
27
 
22
- var _react = _interopRequireDefault(require("react"));
28
+ var _styles = require("@mui/styles");
23
29
 
24
- var _withStyles = _interopRequireDefault(require("@mui/styles/withStyles"));
30
+ var _withWidth = _interopRequireDefault(require("./withWidth"));
25
31
 
26
32
  var _propTypes = _interopRequireDefault(require("prop-types"));
27
33
 
34
+ var _TextField = _interopRequireDefault(require("@mui/material/TextField"));
35
+
28
36
  var _Button = _interopRequireDefault(require("@mui/material/Button"));
29
37
 
30
38
  var _Dialog = _interopRequireDefault(require("@mui/material/Dialog"));
@@ -35,7 +43,7 @@ var _DialogContent = _interopRequireDefault(require("@mui/material/DialogContent
35
43
 
36
44
  var _DialogTitle = _interopRequireDefault(require("@mui/material/DialogTitle"));
37
45
 
38
- var _TextField = _interopRequireDefault(require("@mui/material/TextField"));
46
+ var _material = require("@mui/material");
39
47
 
40
48
  var _no_icon = _interopRequireDefault(require("../assets/no_icon.svg"));
41
49
 
@@ -43,29 +51,27 @@ var _Utils = _interopRequireDefault(require("./Utils"));
43
51
 
44
52
  var _fa = require("react-icons/fa");
45
53
 
54
+ var _Brightness = _interopRequireDefault(require("@mui/icons-material/Brightness6"));
55
+
46
56
  var _Close = _interopRequireDefault(require("@mui/icons-material/Close"));
47
57
 
58
+ var _Save = _interopRequireDefault(require("@mui/icons-material/Save"));
59
+
60
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
61
+
62
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
63
+
48
64
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
49
65
 
50
66
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
51
67
 
52
- // FIXME checkout https://mui.com/components/use-media-query/#migrating-from-withwidth
53
- var withWidth = function withWidth() {
54
- return function (WrappedComponent) {
55
- return function (props) {
56
- return /*#__PURE__*/_react["default"].createElement(WrappedComponent, (0, _extends2["default"])({}, props, {
57
- width: "xs"
58
- }));
59
- };
60
- };
61
- };
62
-
63
68
  var styles = function styles(theme) {
64
69
  return {
65
70
  dialog: {
66
- height: '100%',
67
- maxHeight: '100%',
68
- maxWidth: '100%'
71
+ height: '100%'
72
+ },
73
+ paper: {
74
+ height: 'calc(100% - 64px)'
69
75
  },
70
76
  content: {
71
77
  textAlign: 'center'
@@ -78,15 +84,32 @@ var styles = function styles(theme) {
78
84
  width: 'auto',
79
85
  height: 'calc(100% - 5px)',
80
86
  objectFit: 'contain'
87
+ },
88
+ dialogTitle: {
89
+ justifyContent: 'space-between',
90
+ display: 'flex'
81
91
  }
82
92
  };
83
93
  };
84
94
 
85
95
  var EXTENSIONS = {
86
- images: ['png', 'jpg', 'svg', 'jpeg', 'jpg'],
87
- code: ['js', 'json'],
96
+ images: ['png', 'jpg', 'svg', 'jpeg', 'bmp'],
97
+ code: ['js', 'json', 'md'],
88
98
  txt: ['log', 'txt', 'html', 'css', 'xml']
89
99
  };
100
+ exports.EXTENSIONS = EXTENSIONS;
101
+
102
+ function bufferToBase64(buffer) {
103
+ var binary = '';
104
+ var bytes = new Uint8Array(buffer);
105
+ var len = bytes.byteLength;
106
+
107
+ for (var i = 0; i < len && i < 50; i++) {
108
+ binary += String.fromCharCode(bytes[i]);
109
+ }
110
+
111
+ return window.btoa(binary);
112
+ }
90
113
  /**
91
114
  * @typedef {object} FileViewerProps
92
115
  * @property {string} [key] The key to identify this component.
@@ -99,10 +122,9 @@ var EXTENSIONS = {
99
122
  * @extends {React.Component<FileViewerProps>}
100
123
  */
101
124
 
102
- exports.EXTENSIONS = EXTENSIONS;
103
125
 
104
- var FileViewer = /*#__PURE__*/function (_React$Component) {
105
- (0, _inherits2["default"])(FileViewer, _React$Component);
126
+ var FileViewer = /*#__PURE__*/function (_Component) {
127
+ (0, _inherits2["default"])(FileViewer, _Component);
106
128
 
107
129
  var _super = _createSuper(FileViewer);
108
130
 
@@ -114,63 +136,167 @@ var FileViewer = /*#__PURE__*/function (_React$Component) {
114
136
 
115
137
  (0, _classCallCheck2["default"])(this, FileViewer);
116
138
  _this = _super.call(this, props);
117
- _this.ext = _Utils["default"].getFileExtension(_this.props.href);
139
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onFileChanged", function (id, fileName, size) {
140
+ if (!_this.state.changed) {
141
+ _this.timeout && clearTimeout(_this.timeout);
142
+ _this.timeout = setTimeout(function () {
143
+ _this.timeout = null;
144
+
145
+ if (size === null) {
146
+ window.alert('Show file was deleted!');
147
+ } else if (_this.state.text !== null || _this.state.code !== null) {
148
+ _this.readFile();
149
+ } else {
150
+ _this.setState({
151
+ forceUpdate: Date.now()
152
+ });
153
+ }
154
+ }, 300);
155
+ }
156
+ });
157
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "writeFile64", function () {
158
+ var parts = _this.props.href.split('/');
159
+
160
+ var data = _this.state.editingValue;
161
+ parts.splice(0, 2);
162
+ var adapter = parts[0];
163
+ var name = parts.splice(1).join('/');
164
+
165
+ _this.props.socket.writeFile64(adapter, name, Buffer.from(data).toString('base64')).then(function (_) {
166
+ return _this.props.onClose();
167
+ })["catch"](function (e) {
168
+ return window.alert('Cannot write file: ' + e);
169
+ });
170
+ });
171
+
172
+ var ext = _Utils["default"].getFileExtension(_this.props.href);
173
+
118
174
  _this.state = {
119
175
  text: null,
120
176
  code: null,
121
- copyPossible: EXTENSIONS.code.includes(_this.ext) || EXTENSIONS.txt.includes(_this.ext)
177
+ ext: ext,
178
+ editing: !!_this.props.formatEditFile || false,
179
+ editingValue: null,
180
+ copyPossible: EXTENSIONS.code.includes(ext) || EXTENSIONS.txt.includes(ext),
181
+ forceUpdate: Date.now(),
182
+ changed: false
122
183
  };
123
-
124
- if (_this.state.copyPossible) {
125
- fetch(_this.props.href).then(function (response) {
126
- return response.text();
127
- }).then(function (data) {
128
- if (EXTENSIONS.txt.includes(_this.ext)) {
129
- _this.setState({
130
- text: data
131
- });
132
- } else if (EXTENSIONS.code.includes(_this.ext)) {
133
- _this.setState({
134
- code: data
135
- });
136
- }
137
- });
138
- }
139
-
140
184
  return _this;
141
185
  }
142
186
 
143
187
  (0, _createClass2["default"])(FileViewer, [{
188
+ key: "readFile",
189
+ value: function readFile() {
190
+ var _this2 = this;
191
+
192
+ if (this.props.href) {
193
+ var parts = this.props.href.split('/');
194
+ parts.splice(0, 2);
195
+ var adapter = parts[0];
196
+ var name = parts.splice(1).join('/');
197
+ this.props.socket.readFile(adapter, name).then(function (data) {
198
+ if (data.file !== undefined) {
199
+ data = data.file;
200
+ }
201
+
202
+ var newState = {
203
+ copyPossible: _this2.state.copyPossible
204
+ }; // try to detect valid extension
205
+
206
+ if (data.type === 'Buffer') {
207
+ var ext = AdminUtils.detectMimeType(bufferToBase64(data.data));
208
+
209
+ if (ext) {
210
+ newState.ext = ext;
211
+ newState.copyPossible = EXTENSIONS.code.includes(ext) || EXTENSIONS.txt.includes(ext);
212
+ }
213
+ }
214
+
215
+ if (newState.copyPossible) {
216
+ if (EXTENSIONS.txt.includes(_this2.state.ext)) {
217
+ newState.text = data;
218
+ newState.editingValue = data;
219
+ } else if (EXTENSIONS.code.includes(_this2.state.ext)) {
220
+ newState.code = data;
221
+ newState.editingValue = data;
222
+ }
223
+ }
224
+
225
+ _this2.setState(newState);
226
+ })["catch"](function (e) {
227
+ return window.alert('Cannot read file: ' + e);
228
+ });
229
+ }
230
+ }
231
+ }, {
232
+ key: "componentDidMount",
233
+ value: function componentDidMount() {
234
+ this.readFile();
235
+ var parts = this.props.href.split('/');
236
+ parts.splice(0, 2);
237
+ var adapter = parts[0];
238
+ var name = parts.splice(1).join('/');
239
+ this.props.supportSubscribes && this.props.socket.subscribeFiles(adapter, name, this.onFileChanged);
240
+ }
241
+ }, {
242
+ key: "componentWillUnmount",
243
+ value: function componentWillUnmount() {
244
+ this.timeout && clearTimeout(this.timeout);
245
+ var parts = this.props.href.split('/');
246
+ parts.splice(0, 2);
247
+ var adapter = parts[0];
248
+ var name = parts.splice(1).join('/');
249
+ this.props.supportSubscribes && this.props.socket.subscribeFiles(adapter, name, this.onFileChanged);
250
+ }
251
+ }, {
252
+ key: "getEditFile",
253
+ value: function getEditFile(ext) {
254
+ switch (ext) {
255
+ case 'json':
256
+ return 'json';
257
+
258
+ case 'js':
259
+ return 'javascript';
260
+
261
+ case 'html':
262
+ return 'html';
263
+
264
+ case 'txt':
265
+ return 'html';
266
+
267
+ default:
268
+ return 'json';
269
+ }
270
+ }
271
+ }, {
144
272
  key: "getContent",
145
273
  value: function getContent() {
146
- if (EXTENSIONS.images.includes(this.ext)) {
274
+ var _this3 = this;
275
+
276
+ if (EXTENSIONS.images.includes(this.state.ext)) {
147
277
  return /*#__PURE__*/_react["default"].createElement("img", {
148
278
  onError: function onError(e) {
149
279
  e.target.onerror = null;
150
280
  e.target.src = _no_icon["default"];
151
281
  },
152
- className: this.props.classes.img,
153
- src: this.props.href,
282
+ className: _Utils["default"].clsx(this.props.classes.img, this.props.getClassBackgroundImage()),
283
+ src: this.props.href + '?ts=' + this.state.forceUpdate,
154
284
  alt: this.props.href
155
285
  });
156
- } else if (this.state.code !== null) {
286
+ } else if (this.state.code !== null || this.state.text !== null || this.state.editing) {
157
287
  return /*#__PURE__*/_react["default"].createElement(_TextField["default"], {
158
288
  variant: "standard",
159
289
  className: this.props.classes.textarea,
160
290
  multiline: true,
161
- value: this.state.code,
162
- InputProps: {
163
- readOnly: true
164
- }
165
- });
166
- } else if (this.state.text !== null) {
167
- return /*#__PURE__*/_react["default"].createElement(_TextField["default"], {
168
- variant: "standard",
169
- className: this.props.classes.textarea,
170
- value: this.state.code,
171
- multiline: true,
291
+ value: this.state.editingValue || this.state.code || this.state.text,
292
+ onChange: function onChange(newValue) {
293
+ return _this3.setState({
294
+ editingValue: newValue,
295
+ changed: true
296
+ });
297
+ },
172
298
  InputProps: {
173
- readOnly: true
299
+ readOnly: !this.state.editing
174
300
  }
175
301
  });
176
302
  }
@@ -178,49 +304,67 @@ var FileViewer = /*#__PURE__*/function (_React$Component) {
178
304
  }, {
179
305
  key: "render",
180
306
  value: function render() {
181
- var _this2 = this;
307
+ var _this4 = this;
182
308
 
183
309
  return /*#__PURE__*/_react["default"].createElement(_Dialog["default"], {
184
- className: this.props.classes.dialog,
310
+ classes: {
311
+ scrollPaper: this.props.classes.dialog,
312
+ paper: this.props.classes.paper
313
+ },
314
+ scroll: "paper",
185
315
  open: !!this.props.href,
186
316
  onClose: function onClose() {
187
- return _this2.props.onClose();
317
+ return _this4.props.onClose();
188
318
  },
189
319
  fullWidth: true,
190
- fullScreen: this.props.fullScreen !== undefined ? this.props.fullScreen : true,
320
+ maxWidth: "xl",
191
321
  "aria-labelledby": "form-dialog-title"
322
+ }, /*#__PURE__*/_react["default"].createElement("div", {
323
+ className: this.props.classes.dialogTitle
192
324
  }, /*#__PURE__*/_react["default"].createElement(_DialogTitle["default"], {
193
325
  id: "form-dialog-title"
194
- }, this.props.t('ra_View: %s', this.props.href)), /*#__PURE__*/_react["default"].createElement(_DialogContent["default"], {
326
+ }, this.props.t(this.state.editing ? 'Edit' : 'View') + ': ' + this.props.href), EXTENSIONS.images.includes(this.state.ext) && /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(_material.IconButton, {
327
+ size: "large",
328
+ color: 'inherit',
329
+ onClick: this.props.setStateBackgroundImage
330
+ }, /*#__PURE__*/_react["default"].createElement(_Brightness["default"], null)))), /*#__PURE__*/_react["default"].createElement(_DialogContent["default"], {
195
331
  className: this.props.classes.content
196
332
  }, this.getContent()), /*#__PURE__*/_react["default"].createElement(_DialogActions["default"], null, this.state.copyPossible ? /*#__PURE__*/_react["default"].createElement(_Button["default"], {
197
333
  color: "grey",
198
334
  onClick: function onClick(e) {
199
- return _Utils["default"].copyToClipboard(_this2.state.text || _this2.state.code, e);
200
- }
201
- }, /*#__PURE__*/_react["default"].createElement(_fa.FaCopy, null), this.props.t('ra_Copy content')) : null, /*#__PURE__*/_react["default"].createElement(_Button["default"], {
335
+ return _Utils["default"].copyToClipboard(_this4.state.text || _this4.state.code, e);
336
+ },
337
+ startIcon: /*#__PURE__*/_react["default"].createElement(_fa.FaCopy, null)
338
+ }, this.props.t('Copy content')) : null, this.state.editing ? /*#__PURE__*/_react["default"].createElement(_Button["default"], {
339
+ color: "grey",
340
+ disabled: this.state.editingValue === this.state.code || this.state.editingValue === this.state.text,
341
+ variant: "contained",
342
+ onClick: this.writeFile64,
343
+ startIcon: /*#__PURE__*/_react["default"].createElement(_Save["default"], null)
344
+ }, this.props.t('Save')) : null, /*#__PURE__*/_react["default"].createElement(_Button["default"], {
345
+ variant: "contained",
202
346
  onClick: function onClick() {
203
- return _this2.props.onClose();
347
+ return _this4.props.onClose();
204
348
  },
205
- color: "primary"
206
- }, /*#__PURE__*/_react["default"].createElement(_Close["default"], null), this.props.t('ra_Close'))));
349
+ color: "primary",
350
+ startIcon: /*#__PURE__*/_react["default"].createElement(_Close["default"], null)
351
+ }, this.props.t('Close'))));
207
352
  }
208
- }], [{
209
- key: "getDerivedStateFromProps",
210
- value: function getDerivedStateFromProps() {}
211
353
  }]);
212
354
  return FileViewer;
213
- }(_react["default"].Component);
355
+ }(_react.Component);
214
356
 
215
357
  FileViewer.propTypes = {
216
358
  t: _propTypes["default"].func,
359
+ lang: _propTypes["default"].string,
360
+ expertMode: _propTypes["default"].bool,
217
361
  onClose: _propTypes["default"].func,
218
362
  href: _propTypes["default"].string.isRequired,
219
- fullScreen: _propTypes["default"].bool
363
+ supportSubscribes: _propTypes["default"].bool
220
364
  };
221
365
  /** @type {typeof FileViewer} */
222
366
 
223
- var _export = withWidth()((0, _withStyles["default"])(styles)(FileViewer));
367
+ var _export = (0, _withWidth["default"])()((0, _styles.withStyles)(styles)(FileViewer));
224
368
 
225
369
  var _default = _export;
226
370
  exports["default"] = _default;
@@ -1 +1 @@
1
- {"version":3,"file":"FileViewer.js","names":["withWidth","WrappedComponent","props","styles","theme","dialog","height","maxHeight","maxWidth","content","textAlign","textarea","width","img","objectFit","EXTENSIONS","images","code","txt","FileViewer","ext","Utils","getFileExtension","href","state","text","copyPossible","includes","fetch","then","response","data","setState","e","target","onerror","src","NoImage","classes","readOnly","onClose","fullScreen","undefined","t","getContent","copyToClipboard","React","Component","propTypes","PropTypes","func","string","isRequired","bool","_export","withStyles"],"sources":["FileViewer.js"],"sourcesContent":["import React from 'react';\nimport withStyles from '@mui/styles/withStyles';\nimport PropTypes from 'prop-types';\n\nimport Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport TextField from '@mui/material/TextField';\n\nimport NoImage from '../assets/no_icon.svg';\nimport Utils from './Utils';\n\n// Icons\nimport {FaCopy as CopyIcon} from 'react-icons/fa';\nimport CloseIcon from '@mui/icons-material/Close';\n\n// FIXME checkout https://mui.com/components/use-media-query/#migrating-from-withwidth\nconst withWidth = () => WrappedComponent => props => <WrappedComponent {...props} width=\"xs\" />;\n\nconst styles = theme => ({\n dialog: {\n height: '100%',\n maxHeight: '100%',\n maxWidth: '100%',\n },\n content: {\n textAlign: 'center',\n },\n textarea: {\n width: '100%',\n height: '100%',\n },\n img: {\n width: 'auto',\n height: 'calc(100% - 5px)',\n objectFit: 'contain',\n }\n});\n\nexport const EXTENSIONS = {\n images: ['png', 'jpg', 'svg', 'jpeg', 'jpg'],\n code: ['js', 'json'],\n txt: ['log', 'txt', 'html', 'css', 'xml'],\n};\n\n/**\n * @typedef {object} FileViewerProps\n * @property {string} [key] The key to identify this component.\n * @property {import('../types').Translator} t Translation function\n * @property {ioBroker.Languages} [lang] The selected language.\n * @property {boolean} [expertMode] Is expert mode enabled? (default: false)\n * @property {() => void} onClose Callback when the viewer is closed.\n * @property {string} href The URL to the file to be displayed.\n *\n * @extends {React.Component<FileViewerProps>}\n */\nclass FileViewer extends React.Component {\n /**\n * @param {Readonly<FileViewerProps>} props\n */\n constructor(props) {\n super(props);\n\n this.ext = Utils.getFileExtension(this.props.href);\n\n this.state = {\n text: null,\n code: null,\n copyPossible: EXTENSIONS.code.includes(this.ext) || EXTENSIONS.txt.includes(this.ext),\n };\n\n if (this.state.copyPossible) {\n fetch(this.props.href)\n .then(response => response.text())\n .then(data => {\n if (EXTENSIONS.txt.includes(this.ext)) {\n this.setState({ text: data });\n } else if (EXTENSIONS.code.includes(this.ext)) {\n this.setState({ code: data });\n }\n });\n }\n }\n\n static getDerivedStateFromProps() {\n\n }\n\n getContent() {\n if (EXTENSIONS.images.includes(this.ext)) {\n return <img\n onError={ e => {\n e.target.onerror = null;\n e.target.src = NoImage;\n }}\n className={ this.props.classes.img }\n src={ this.props.href }\n alt={ this.props.href }\n />;\n } else if (this.state.code !== null) {\n return <TextField\n variant=\"standard\"\n className={ this.props.classes.textarea }\n multiline\n value={ this.state.code }\n InputProps={{\n readOnly: true,\n }}\n />;\n } else if (this.state.text !== null) {\n return <TextField\n variant=\"standard\"\n className={ this.props.classes.textarea }\n value={ this.state.code }\n multiline\n InputProps={{\n readOnly: true,\n }}\n />;\n }\n }\n\n render() {\n return <Dialog\n className={ this.props.classes.dialog }\n open={ !!this.props.href }\n onClose={ () => this.props.onClose() }\n fullWidth\n fullScreen={this.props.fullScreen !== undefined ? this.props.fullScreen : true}\n aria-labelledby=\"form-dialog-title\"\n >\n <DialogTitle id=\"form-dialog-title\">{ this.props.t('ra_View: %s', this.props.href) }</DialogTitle>\n <DialogContent className={ this.props.classes.content }>\n { this.getContent() }\n </DialogContent>\n <DialogActions>\n { this.state.copyPossible ? <Button color=\"grey\" onClick={e => Utils.copyToClipboard(this.state.text || this.state.code, e) } >\n <CopyIcon />\n { this.props.t('ra_Copy content') }\n </Button> : null }\n\n <Button onClick={() => this.props.onClose()} color=\"primary\">\n <CloseIcon />\n { this.props.t('ra_Close') }\n </Button>\n </DialogActions>\n </Dialog>;\n }\n}\n\nFileViewer.propTypes = {\n t: PropTypes.func,\n\n onClose: PropTypes.func,\n href: PropTypes.string.isRequired,\n fullScreen: PropTypes.bool,\n};\n\n/** @type {typeof FileViewer} */\nconst _export = withWidth()(withStyles(styles)(FileViewer));\nexport default _export;\n"],"mappings":"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"}
1
+ {"version":3,"file":"FileViewer.js","names":["styles","theme","dialog","height","paper","content","textAlign","textarea","width","img","objectFit","dialogTitle","justifyContent","display","EXTENSIONS","images","code","txt","bufferToBase64","buffer","binary","bytes","Uint8Array","len","byteLength","i","String","fromCharCode","window","btoa","FileViewer","props","id","fileName","size","state","changed","timeout","clearTimeout","setTimeout","alert","text","readFile","setState","forceUpdate","Date","now","parts","href","split","data","editingValue","splice","adapter","name","join","socket","writeFile64","Buffer","from","toString","then","_","onClose","e","ext","Utils","getFileExtension","editing","formatEditFile","copyPossible","includes","file","undefined","newState","type","AdminUtils","detectMimeType","supportSubscribes","subscribeFiles","onFileChanged","target","onerror","src","NoImage","clsx","classes","getClassBackgroundImage","newValue","readOnly","scrollPaper","t","setStateBackgroundImage","getContent","copyToClipboard","Component","propTypes","PropTypes","func","lang","string","expertMode","bool","isRequired","_export","withWidth","withStyles"],"sources":["FileViewer.js"],"sourcesContent":["import React, { Component } from 'react';\nimport { withStyles } from '@mui/styles';\nimport withWidth from './withWidth';\nimport PropTypes from 'prop-types';\n\nimport TextField from '@mui/material/TextField';\nimport Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogActions from '@mui/material/DialogActions';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport { IconButton } from '@mui/material';\n\nimport NoImage from '../assets/no_icon.svg';\nimport Utils from './Utils';\n\n// Icons\nimport { FaCopy as CopyIcon } from 'react-icons/fa';\nimport Brightness5Icon from '@mui/icons-material/Brightness6';\nimport CloseIcon from '@mui/icons-material/Close';\nimport SaveIcon from '@mui/icons-material/Save';\n\nconst styles = theme => ({\n dialog: {\n height: '100%',\n },\n paper: {\n height: 'calc(100% - 64px)',\n },\n content: {\n textAlign: 'center',\n },\n textarea: {\n width: '100%',\n height: '100%',\n },\n img: {\n width: 'auto',\n height: 'calc(100% - 5px)',\n objectFit: 'contain',\n },\n dialogTitle: {\n justifyContent: 'space-between',\n display: 'flex'\n }\n});\n\nexport const EXTENSIONS = {\n images: ['png', 'jpg', 'svg', 'jpeg', 'bmp'],\n code: ['js', 'json', 'md'],\n txt: ['log', 'txt', 'html', 'css', 'xml'],\n};\n\nfunction bufferToBase64(buffer) {\n let binary = '';\n let bytes = new Uint8Array(buffer);\n let len = bytes.byteLength;\n for (let i = 0; i < len && i < 50; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return window.btoa(binary);\n}\n\n/**\n * @typedef {object} FileViewerProps\n * @property {string} [key] The key to identify this component.\n * @property {import('../types').Translator} t Translation function\n * @property {ioBroker.Languages} [lang] The selected language.\n * @property {boolean} [expertMode] Is expert mode enabled? (default: false)\n * @property {() => void} onClose Callback when the viewer is closed.\n * @property {string} href The URL to the file to be displayed.\n *\n * @extends {React.Component<FileViewerProps>}\n */\nclass FileViewer extends Component {\n /**\n * @param {Readonly<FileViewerProps>} props\n */\n constructor(props) {\n super(props);\n const ext = Utils.getFileExtension(this.props.href);\n\n this.state = {\n text: null,\n code: null,\n ext,\n editing: !!this.props.formatEditFile || false,\n editingValue: null,\n copyPossible: EXTENSIONS.code.includes(ext) || EXTENSIONS.txt.includes(ext),\n forceUpdate: Date.now(),\n changed: false,\n };\n }\n\n readFile() {\n if (this.props.href) {\n const parts = this.props.href.split('/');\n parts.splice(0, 2);\n const adapter = parts[0];\n const name = parts.splice(1).join('/');\n\n this.props.socket.readFile(adapter, name)\n .then(data => {\n if (data.file !== undefined) {\n data = data.file;\n }\n\n const newState = {copyPossible: this.state.copyPossible};\n // try to detect valid extension\n if (data.type === 'Buffer') {\n const ext = AdminUtils.detectMimeType(bufferToBase64(data.data));\n if (ext) {\n newState.ext = ext;\n newState.copyPossible = EXTENSIONS.code.includes(ext) || EXTENSIONS.txt.includes(ext);\n }\n }\n\n if (newState.copyPossible) {\n if (EXTENSIONS.txt.includes(this.state.ext)) {\n newState.text = data;\n newState.editingValue = data;\n } else if (EXTENSIONS.code.includes(this.state.ext)) {\n newState.code = data;\n newState.editingValue = data;\n }\n }\n\n this.setState(newState);\n })\n .catch(e => window.alert('Cannot read file: ' + e));\n }\n }\n\n componentDidMount() {\n this.readFile();\n\n const parts = this.props.href.split('/');\n parts.splice(0, 2);\n const adapter = parts[0];\n const name = parts.splice(1).join('/');\n\n this.props.supportSubscribes && this.props.socket.subscribeFiles(adapter, name, this.onFileChanged);\n }\n\n componentWillUnmount() {\n this.timeout && clearTimeout(this.timeout);\n const parts = this.props.href.split('/');\n parts.splice(0, 2);\n const adapter = parts[0];\n const name = parts.splice(1).join('/');\n this.props.supportSubscribes && this.props.socket.subscribeFiles(adapter, name, this.onFileChanged);\n }\n\n onFileChanged = (id, fileName, size) => {\n if (!this.state.changed) {\n this.timeout && clearTimeout(this.timeout);\n this.timeout = setTimeout(() => {\n this.timeout = null;\n if (size === null) {\n window.alert('Show file was deleted!');\n } else if (this.state.text !== null || this.state.code !== null) {\n this.readFile();\n } else {\n this.setState({ forceUpdate: Date.now() });\n }\n }, 300);\n }\n };\n\n writeFile64 = () => {\n const parts = this.props.href.split('/');\n const data = this.state.editingValue;\n parts.splice(0, 2);\n const adapter = parts[0];\n const name = parts.splice(1).join('/');\n this.props.socket.writeFile64(adapter, name, Buffer.from(data).toString('base64'))\n .then(_ => this.props.onClose())\n .catch(e => window.alert('Cannot write file: ' + e));\n }\n\n getEditFile(ext) {\n switch (ext) {\n case 'json':\n return 'json';\n case 'js':\n return 'javascript';\n case 'html':\n return 'html';\n case 'txt':\n return 'html';\n default:\n return 'json';\n }\n }\n\n getContent() {\n if (EXTENSIONS.images.includes(this.state.ext)) {\n return <img\n onError={e => {\n e.target.onerror = null;\n e.target.src = NoImage;\n }}\n className={Utils.clsx(this.props.classes.img, this.props.getClassBackgroundImage())}\n src={this.props.href + '?ts=' + this.state.forceUpdate}\n alt={this.props.href}\n />;\n } else if (this.state.code !== null || this.state.text !== null || this.state.editing) {\n return <TextField\n variant=\"standard\"\n className={ this.props.classes.textarea }\n multiline\n value={ this.state.editingValue || this.state.code || this.state.text }\n onChange={newValue => this.setState({ editingValue: newValue, changed: true })}\n InputProps={{ readOnly: !this.state.editing,}}\n />;\n }\n }\n\n render() {\n return <Dialog\n classes={{ scrollPaper: this.props.classes.dialog, paper: this.props.classes.paper }}\n scroll=\"paper\"\n open={!!this.props.href}\n onClose={() => this.props.onClose()}\n fullWidth={true}\n maxWidth=\"xl\"\n aria-labelledby=\"form-dialog-title\"\n >\n <div className={this.props.classes.dialogTitle}>\n <DialogTitle id=\"form-dialog-title\">{this.props.t(this.state.editing ? 'Edit' : 'View') + ': ' + this.props.href}</DialogTitle>\n {EXTENSIONS.images.includes(this.state.ext) && <div>\n <IconButton size=\"large\"\n color={'inherit'}\n onClick={this.props.setStateBackgroundImage}\n >\n <Brightness5Icon />\n </IconButton>\n </div>\n }\n </div>\n <DialogContent className={this.props.classes.content}>\n {this.getContent()}\n </DialogContent>\n <DialogActions>\n {this.state.copyPossible ?\n <Button\n color=\"grey\"\n onClick={e => Utils.copyToClipboard(this.state.text || this.state.code, e)}\n startIcon={<CopyIcon />}\n >\n {this.props.t('Copy content')}\n </Button> : null}\n {this.state.editing ?\n <Button\n color=\"grey\"\n disabled={this.state.editingValue === this.state.code || this.state.editingValue === this.state.text}\n variant=\"contained\"\n onClick={this.writeFile64}\n startIcon={<SaveIcon />}\n >\n {this.props.t('Save')}\n </Button> : null}\n <Button\n variant=\"contained\"\n onClick={() => this.props.onClose()}\n color=\"primary\"\n startIcon={<CloseIcon />}\n >\n {this.props.t('Close')}\n </Button>\n </DialogActions>\n </Dialog>;\n }\n}\n\nFileViewer.propTypes = {\n t: PropTypes.func,\n lang: PropTypes.string,\n expertMode: PropTypes.bool,\n onClose: PropTypes.func,\n href: PropTypes.string.isRequired,\n supportSubscribes: PropTypes.bool,\n};\n\n/** @type {typeof FileViewer} */\nconst _export = withWidth()(withStyles(styles)(FileViewer));\nexport default _export;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AAEA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AACA;;AAGA;;AACA;;AACA;;AACA;;;;;;;;;;AAEA,IAAMA,MAAM,GAAG,SAATA,MAAS,CAAAC,KAAK;EAAA,OAAK;IACrBC,MAAM,EAAE;MACJC,MAAM,EAAE;IADJ,CADa;IAIrBC,KAAK,EAAE;MACHD,MAAM,EAAE;IADL,CAJc;IAOrBE,OAAO,EAAE;MACLC,SAAS,EAAE;IADN,CAPY;IAUrBC,QAAQ,EAAE;MACNC,KAAK,EAAE,MADD;MAENL,MAAM,EAAE;IAFF,CAVW;IAcrBM,GAAG,EAAE;MACDD,KAAK,EAAE,MADN;MAEDL,MAAM,EAAE,kBAFP;MAGDO,SAAS,EAAE;IAHV,CAdgB;IAmBrBC,WAAW,EAAE;MACTC,cAAc,EAAE,eADP;MAETC,OAAO,EAAE;IAFA;EAnBQ,CAAL;AAAA,CAApB;;AAyBO,IAAMC,UAAU,GAAG;EACtBC,MAAM,EAAE,CAAC,KAAD,EAAQ,KAAR,EAAe,KAAf,EAAsB,MAAtB,EAA8B,KAA9B,CADc;EAEtBC,IAAI,EAAI,CAAC,IAAD,EAAO,MAAP,EAAe,IAAf,CAFc;EAGtBC,GAAG,EAAK,CAAC,KAAD,EAAQ,KAAR,EAAe,MAAf,EAAuB,KAAvB,EAA8B,KAA9B;AAHc,CAAnB;;;AAMP,SAASC,cAAT,CAAwBC,MAAxB,EAAgC;EAC5B,IAAIC,MAAM,GAAG,EAAb;EACA,IAAIC,KAAK,GAAG,IAAIC,UAAJ,CAAeH,MAAf,CAAZ;EACA,IAAII,GAAG,GAAGF,KAAK,CAACG,UAAhB;;EACA,KAAK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGF,GAAJ,IAAWE,CAAC,GAAG,EAA/B,EAAmCA,CAAC,EAApC,EAAwC;IACpCL,MAAM,IAAIM,MAAM,CAACC,YAAP,CAAoBN,KAAK,CAACI,CAAD,CAAzB,CAAV;EACH;;EACD,OAAOG,MAAM,CAACC,IAAP,CAAYT,MAAZ,CAAP;AACH;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;IACMU,U;;;;;EACF;AACJ;AACA;EACI,oBAAYC,KAAZ,EAAmB;IAAA;;IAAA;IACf,0BAAMA,KAAN;IADe,kGA2EH,UAACC,EAAD,EAAKC,QAAL,EAAeC,IAAf,EAAwB;MACpC,IAAI,CAAC,MAAKC,KAAL,CAAWC,OAAhB,EAAyB;QACrB,MAAKC,OAAL,IAAgBC,YAAY,CAAC,MAAKD,OAAN,CAA5B;QACA,MAAKA,OAAL,GAAeE,UAAU,CAAC,YAAM;UAC5B,MAAKF,OAAL,GAAe,IAAf;;UACA,IAAIH,IAAI,KAAK,IAAb,EAAmB;YACfN,MAAM,CAACY,KAAP,CAAa,wBAAb;UACH,CAFD,MAEO,IAAI,MAAKL,KAAL,CAAWM,IAAX,KAAoB,IAApB,IAA4B,MAAKN,KAAL,CAAWnB,IAAX,KAAoB,IAApD,EAA0D;YAC7D,MAAK0B,QAAL;UACH,CAFM,MAEA;YACH,MAAKC,QAAL,CAAc;cAAEC,WAAW,EAAEC,IAAI,CAACC,GAAL;YAAf,CAAd;UACH;QACJ,CATwB,EAStB,GATsB,CAAzB;MAUH;IACJ,CAzFkB;IAAA,gGA2FL,YAAM;MAChB,IAAMC,KAAK,GAAG,MAAKhB,KAAL,CAAWiB,IAAX,CAAgBC,KAAhB,CAAsB,GAAtB,CAAd;;MACA,IAAMC,IAAI,GAAG,MAAKf,KAAL,CAAWgB,YAAxB;MACAJ,KAAK,CAACK,MAAN,CAAa,CAAb,EAAgB,CAAhB;MACA,IAAMC,OAAO,GAAGN,KAAK,CAAC,CAAD,CAArB;MACA,IAAMO,IAAI,GAAGP,KAAK,CAACK,MAAN,CAAa,CAAb,EAAgBG,IAAhB,CAAqB,GAArB,CAAb;;MACA,MAAKxB,KAAL,CAAWyB,MAAX,CAAkBC,WAAlB,CAA8BJ,OAA9B,EAAuCC,IAAvC,EAA6CI,MAAM,CAACC,IAAP,CAAYT,IAAZ,EAAkBU,QAAlB,CAA2B,QAA3B,CAA7C,EACKC,IADL,CACU,UAAAC,CAAC;QAAA,OAAI,MAAK/B,KAAL,CAAWgC,OAAX,EAAJ;MAAA,CADX,WAEW,UAAAC,CAAC;QAAA,OAAIpC,MAAM,CAACY,KAAP,CAAa,wBAAwBwB,CAArC,CAAJ;MAAA,CAFZ;IAGH,CApGkB;;IAEf,IAAMC,GAAG,GAAGC,iBAAA,CAAMC,gBAAN,CAAuB,MAAKpC,KAAL,CAAWiB,IAAlC,CAAZ;;IAEA,MAAKb,KAAL,GAAa;MACTM,IAAI,EAAE,IADG;MAETzB,IAAI,EAAE,IAFG;MAGTiD,GAAG,EAAHA,GAHS;MAITG,OAAO,EAAE,CAAC,CAAC,MAAKrC,KAAL,CAAWsC,cAAb,IAA+B,KAJ/B;MAKTlB,YAAY,EAAE,IALL;MAMTmB,YAAY,EAAExD,UAAU,CAACE,IAAX,CAAgBuD,QAAhB,CAAyBN,GAAzB,KAAiCnD,UAAU,CAACG,GAAX,CAAesD,QAAf,CAAwBN,GAAxB,CANtC;MAOTrB,WAAW,EAAEC,IAAI,CAACC,GAAL,EAPJ;MAQTV,OAAO,EAAE;IARA,CAAb;IAJe;EAclB;;;;WAED,oBAAW;MAAA;;MACP,IAAI,KAAKL,KAAL,CAAWiB,IAAf,EAAqB;QACjB,IAAMD,KAAK,GAAG,KAAKhB,KAAL,CAAWiB,IAAX,CAAgBC,KAAhB,CAAsB,GAAtB,CAAd;QACAF,KAAK,CAACK,MAAN,CAAa,CAAb,EAAgB,CAAhB;QACA,IAAMC,OAAO,GAAGN,KAAK,CAAC,CAAD,CAArB;QACA,IAAMO,IAAI,GAAGP,KAAK,CAACK,MAAN,CAAa,CAAb,EAAgBG,IAAhB,CAAqB,GAArB,CAAb;QAEA,KAAKxB,KAAL,CAAWyB,MAAX,CAAkBd,QAAlB,CAA2BW,OAA3B,EAAoCC,IAApC,EACKO,IADL,CACU,UAAAX,IAAI,EAAI;UACV,IAAIA,IAAI,CAACsB,IAAL,KAAcC,SAAlB,EAA6B;YACzBvB,IAAI,GAAGA,IAAI,CAACsB,IAAZ;UACH;;UAED,IAAME,QAAQ,GAAG;YAACJ,YAAY,EAAE,MAAI,CAACnC,KAAL,CAAWmC;UAA1B,CAAjB,CALU,CAMV;;UACA,IAAIpB,IAAI,CAACyB,IAAL,KAAc,QAAlB,EAA4B;YACxB,IAAMV,GAAG,GAAGW,UAAU,CAACC,cAAX,CAA0B3D,cAAc,CAACgC,IAAI,CAACA,IAAN,CAAxC,CAAZ;;YACA,IAAIe,GAAJ,EAAS;cACLS,QAAQ,CAACT,GAAT,GAAeA,GAAf;cACAS,QAAQ,CAACJ,YAAT,GAAwBxD,UAAU,CAACE,IAAX,CAAgBuD,QAAhB,CAAyBN,GAAzB,KAAiCnD,UAAU,CAACG,GAAX,CAAesD,QAAf,CAAwBN,GAAxB,CAAzD;YACH;UACJ;;UAED,IAAIS,QAAQ,CAACJ,YAAb,EAA2B;YACvB,IAAIxD,UAAU,CAACG,GAAX,CAAesD,QAAf,CAAwB,MAAI,CAACpC,KAAL,CAAW8B,GAAnC,CAAJ,EAA6C;cACzCS,QAAQ,CAACjC,IAAT,GAAgBS,IAAhB;cACAwB,QAAQ,CAACvB,YAAT,GAAwBD,IAAxB;YACH,CAHD,MAGO,IAAIpC,UAAU,CAACE,IAAX,CAAgBuD,QAAhB,CAAyB,MAAI,CAACpC,KAAL,CAAW8B,GAApC,CAAJ,EAA8C;cACjDS,QAAQ,CAAC1D,IAAT,GAAgBkC,IAAhB;cACAwB,QAAQ,CAACvB,YAAT,GAAwBD,IAAxB;YACH;UACJ;;UAED,MAAI,CAACP,QAAL,CAAc+B,QAAd;QACH,CA3BL,WA4BW,UAAAV,CAAC;UAAA,OAAIpC,MAAM,CAACY,KAAP,CAAa,uBAAuBwB,CAApC,CAAJ;QAAA,CA5BZ;MA6BH;IACJ;;;WAED,6BAAoB;MAChB,KAAKtB,QAAL;MAEA,IAAMK,KAAK,GAAG,KAAKhB,KAAL,CAAWiB,IAAX,CAAgBC,KAAhB,CAAsB,GAAtB,CAAd;MACAF,KAAK,CAACK,MAAN,CAAa,CAAb,EAAgB,CAAhB;MACA,IAAMC,OAAO,GAAGN,KAAK,CAAC,CAAD,CAArB;MACA,IAAMO,IAAI,GAAGP,KAAK,CAACK,MAAN,CAAa,CAAb,EAAgBG,IAAhB,CAAqB,GAArB,CAAb;MAEA,KAAKxB,KAAL,CAAW+C,iBAAX,IAAgC,KAAK/C,KAAL,CAAWyB,MAAX,CAAkBuB,cAAlB,CAAiC1B,OAAjC,EAA0CC,IAA1C,EAAgD,KAAK0B,aAArD,CAAhC;IACH;;;WAED,gCAAuB;MACnB,KAAK3C,OAAL,IAAgBC,YAAY,CAAC,KAAKD,OAAN,CAA5B;MACA,IAAMU,KAAK,GAAG,KAAKhB,KAAL,CAAWiB,IAAX,CAAgBC,KAAhB,CAAsB,GAAtB,CAAd;MACAF,KAAK,CAACK,MAAN,CAAa,CAAb,EAAgB,CAAhB;MACA,IAAMC,OAAO,GAAGN,KAAK,CAAC,CAAD,CAArB;MACA,IAAMO,IAAI,GAAGP,KAAK,CAACK,MAAN,CAAa,CAAb,EAAgBG,IAAhB,CAAqB,GAArB,CAAb;MACA,KAAKxB,KAAL,CAAW+C,iBAAX,IAAgC,KAAK/C,KAAL,CAAWyB,MAAX,CAAkBuB,cAAlB,CAAiC1B,OAAjC,EAA0CC,IAA1C,EAAgD,KAAK0B,aAArD,CAAhC;IACH;;;WA6BD,qBAAYf,GAAZ,EAAiB;MACb,QAAQA,GAAR;QACI,KAAK,MAAL;UACI,OAAO,MAAP;;QACJ,KAAK,IAAL;UACI,OAAO,YAAP;;QACJ,KAAK,MAAL;UACI,OAAO,MAAP;;QACJ,KAAK,KAAL;UACI,OAAO,MAAP;;QACJ;UACI,OAAO,MAAP;MAVR;IAYH;;;WAED,sBAAa;MAAA;;MACT,IAAInD,UAAU,CAACC,MAAX,CAAkBwD,QAAlB,CAA2B,KAAKpC,KAAL,CAAW8B,GAAtC,CAAJ,EAAgD;QAC5C,oBAAO;UACH,OAAO,EAAE,iBAAAD,CAAC,EAAI;YACVA,CAAC,CAACiB,MAAF,CAASC,OAAT,GAAmB,IAAnB;YACAlB,CAAC,CAACiB,MAAF,CAASE,GAAT,GAAeC,mBAAf;UACH,CAJE;UAKH,SAAS,EAAElB,iBAAA,CAAMmB,IAAN,CAAW,KAAKtD,KAAL,CAAWuD,OAAX,CAAmB7E,GAA9B,EAAmC,KAAKsB,KAAL,CAAWwD,uBAAX,EAAnC,CALR;UAMH,GAAG,EAAE,KAAKxD,KAAL,CAAWiB,IAAX,GAAkB,MAAlB,GAA2B,KAAKb,KAAL,CAAWS,WANxC;UAOH,GAAG,EAAE,KAAKb,KAAL,CAAWiB;QAPb,EAAP;MASH,CAVD,MAUO,IAAI,KAAKb,KAAL,CAAWnB,IAAX,KAAoB,IAApB,IAA4B,KAAKmB,KAAL,CAAWM,IAAX,KAAoB,IAAhD,IAAwD,KAAKN,KAAL,CAAWiC,OAAvE,EAAgF;QACnF,oBAAO,gCAAC,qBAAD;UACH,OAAO,EAAC,UADL;UAEH,SAAS,EAAG,KAAKrC,KAAL,CAAWuD,OAAX,CAAmB/E,QAF5B;UAGH,SAAS,MAHN;UAIH,KAAK,EAAG,KAAK4B,KAAL,CAAWgB,YAAX,IAA2B,KAAKhB,KAAL,CAAWnB,IAAtC,IAA8C,KAAKmB,KAAL,CAAWM,IAJ9D;UAKH,QAAQ,EAAE,kBAAA+C,QAAQ;YAAA,OAAI,MAAI,CAAC7C,QAAL,CAAc;cAAEQ,YAAY,EAAEqC,QAAhB;cAA0BpD,OAAO,EAAE;YAAnC,CAAd,CAAJ;UAAA,CALf;UAMH,UAAU,EAAE;YAAEqD,QAAQ,EAAE,CAAC,KAAKtD,KAAL,CAAWiC;UAAxB;QANT,EAAP;MAQH;IACJ;;;WAED,kBAAS;MAAA;;MACL,oBAAO,gCAAC,kBAAD;QACH,OAAO,EAAE;UAAEsB,WAAW,EAAE,KAAK3D,KAAL,CAAWuD,OAAX,CAAmBpF,MAAlC;UAA0CE,KAAK,EAAE,KAAK2B,KAAL,CAAWuD,OAAX,CAAmBlF;QAApE,CADN;QAEH,MAAM,EAAC,OAFJ;QAGH,IAAI,EAAE,CAAC,CAAC,KAAK2B,KAAL,CAAWiB,IAHhB;QAIH,OAAO,EAAE;UAAA,OAAM,MAAI,CAACjB,KAAL,CAAWgC,OAAX,EAAN;QAAA,CAJN;QAKH,SAAS,EAAE,IALR;QAMH,QAAQ,EAAC,IANN;QAOH,mBAAgB;MAPb,gBASH;QAAK,SAAS,EAAE,KAAKhC,KAAL,CAAWuD,OAAX,CAAmB3E;MAAnC,gBACI,gCAAC,uBAAD;QAAa,EAAE,EAAC;MAAhB,GAAqC,KAAKoB,KAAL,CAAW4D,CAAX,CAAa,KAAKxD,KAAL,CAAWiC,OAAX,GAAqB,MAArB,GAA8B,MAA3C,IAAqD,IAArD,GAA4D,KAAKrC,KAAL,CAAWiB,IAA5G,CADJ,EAEKlC,UAAU,CAACC,MAAX,CAAkBwD,QAAlB,CAA2B,KAAKpC,KAAL,CAAW8B,GAAtC,kBAA8C,0DAC3C,gCAAC,oBAAD;QAAY,IAAI,EAAC,OAAjB;QACI,KAAK,EAAE,SADX;QAEI,OAAO,EAAE,KAAKlC,KAAL,CAAW6D;MAFxB,gBAII,gCAAC,sBAAD,OAJJ,CAD2C,CAFnD,CATG,eAqBH,gCAAC,yBAAD;QAAe,SAAS,EAAE,KAAK7D,KAAL,CAAWuD,OAAX,CAAmBjF;MAA7C,GACK,KAAKwF,UAAL,EADL,CArBG,eAwBH,gCAAC,yBAAD,QACK,KAAK1D,KAAL,CAAWmC,YAAX,gBACG,gCAAC,kBAAD;QACI,KAAK,EAAC,MADV;QAEI,OAAO,EAAE,iBAAAN,CAAC;UAAA,OAAIE,iBAAA,CAAM4B,eAAN,CAAsB,MAAI,CAAC3D,KAAL,CAAWM,IAAX,IAAmB,MAAI,CAACN,KAAL,CAAWnB,IAApD,EAA0DgD,CAA1D,CAAJ;QAAA,CAFd;QAGI,SAAS,eAAE,gCAAC,UAAD;MAHf,GAKK,KAAKjC,KAAL,CAAW4D,CAAX,CAAa,cAAb,CALL,CADH,GAOe,IARpB,EASK,KAAKxD,KAAL,CAAWiC,OAAX,gBACG,gCAAC,kBAAD;QACI,KAAK,EAAC,MADV;QAEI,QAAQ,EAAE,KAAKjC,KAAL,CAAWgB,YAAX,KAA4B,KAAKhB,KAAL,CAAWnB,IAAvC,IAA+C,KAAKmB,KAAL,CAAWgB,YAAX,KAA4B,KAAKhB,KAAL,CAAWM,IAFpG;QAGI,OAAO,EAAC,WAHZ;QAII,OAAO,EAAE,KAAKgB,WAJlB;QAKI,SAAS,eAAE,gCAAC,gBAAD;MALf,GAOK,KAAK1B,KAAL,CAAW4D,CAAX,CAAa,MAAb,CAPL,CADH,GASe,IAlBpB,eAmBI,gCAAC,kBAAD;QACI,OAAO,EAAC,WADZ;QAEI,OAAO,EAAE;UAAA,OAAM,MAAI,CAAC5D,KAAL,CAAWgC,OAAX,EAAN;QAAA,CAFb;QAGI,KAAK,EAAC,SAHV;QAII,SAAS,eAAE,gCAAC,iBAAD;MAJf,GAMK,KAAKhC,KAAL,CAAW4D,CAAX,CAAa,OAAb,CANL,CAnBJ,CAxBG,CAAP;IAqDH;;;EAtMoBI,gB;;AAyMzBjE,UAAU,CAACkE,SAAX,GAAuB;EACnBL,CAAC,EAAEM,qBAAA,CAAUC,IADM;EAEnBC,IAAI,EAAEF,qBAAA,CAAUG,MAFG;EAGnBC,UAAU,EAAEJ,qBAAA,CAAUK,IAHH;EAInBvC,OAAO,EAAEkC,qBAAA,CAAUC,IAJA;EAKnBlD,IAAI,EAAEiD,qBAAA,CAAUG,MAAV,CAAiBG,UALJ;EAMnBzB,iBAAiB,EAAEmB,qBAAA,CAAUK;AANV,CAAvB;AASA;;AACA,IAAME,OAAO,GAAG,IAAAC,qBAAA,IAAY,IAAAC,kBAAA,EAAW1G,MAAX,EAAmB8B,UAAnB,CAAZ,CAAhB;;eACe0E,O"}