@abtnode/ux 1.16.13-beta-90ded76f → 1.16.13-beta-2eb54cbc

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.
@@ -150,7 +150,7 @@ function RuntimeInsight() {
150
150
  fontWeight: 'bold'
151
151
  },
152
152
  mb: 2,
153
- children: t('insights.trend')
153
+ children: t('analytics.trend')
154
154
  }), blocklet.status === 'running' ? [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
155
155
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_runtimeInfo.default, {
156
156
  blocklet: blocklet,
@@ -160,7 +160,7 @@ function RuntimeInsight() {
160
160
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
161
161
  mt: 3,
162
162
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Datatable.default, {
163
- title: t('insights.detail'),
163
+ title: t('analytics.detail'),
164
164
  className: "monitor-table",
165
165
  locale: locale,
166
166
  data: monitList,
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = TrafficInsights;
7
+ exports.getDefaultRanges = void 0;
7
8
  var _react = require("react");
8
9
  var _dayjs = _interopRequireDefault(require("@abtnode/util/lib/dayjs"));
9
10
  var _nthArg = _interopRequireDefault(require("lodash/nthArg"));
@@ -16,13 +17,16 @@ var _CircularProgress = _interopRequireDefault(require("@mui/material/CircularPr
16
17
  var _Grid = _interopRequireDefault(require("@mui/material/Grid"));
17
18
  var _Typography = _interopRequireDefault(require("@mui/material/Typography"));
18
19
  var _Button = _interopRequireDefault(require("@mui/material/Button"));
20
+ var _IconButton = _interopRequireDefault(require("@mui/material/IconButton"));
19
21
  var _Popover = _interopRequireDefault(require("@mui/material/Popover"));
22
+ var _LaunchOutlined = _interopRequireDefault(require("@mui/icons-material/LaunchOutlined"));
20
23
  var _muiDaterangePicker = require("mui-daterange-picker");
21
24
  var _xDatePickers = require("@mui/x-date-pickers");
22
25
  var _AdapterDayjs = require("@mui/x-date-pickers/AdapterDayjs");
23
26
  var _LocalizationProvider = require("@mui/x-date-pickers/LocalizationProvider");
24
27
  var _context = require("@arcblock/ux/lib/Locale/context");
25
28
  var _constant = require("@abtnode/constant");
29
+ var _dateFns = require("date-fns");
26
30
  var _util = require("../util");
27
31
  var _node = require("../contexts/node");
28
32
  var _chart = _interopRequireDefault(require("./chart"));
@@ -34,6 +38,44 @@ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key i
34
38
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
35
39
  function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } /* eslint-disable react/prop-types */ /* eslint-disable react-hooks/exhaustive-deps */
36
40
  const noop = (0, _nthArg.default)(0);
41
+ const getDefaultRanges = (date, locale) => [{
42
+ label: 'This Week',
43
+ startDate: (0, _dateFns.startOfWeek)(date, {
44
+ locale
45
+ }),
46
+ endDate: (0, _dateFns.endOfWeek)(date, {
47
+ locale
48
+ })
49
+ }, {
50
+ label: 'Last Week',
51
+ startDate: (0, _dateFns.startOfWeek)((0, _dateFns.addWeeks)(date, -1), {
52
+ locale
53
+ }),
54
+ endDate: (0, _dateFns.endOfWeek)((0, _dateFns.addWeeks)(date, -1), {
55
+ locale
56
+ })
57
+ }, {
58
+ label: 'Last 7 Days',
59
+ startDate: (0, _dateFns.addWeeks)(date, -1),
60
+ endDate: date
61
+ }, {
62
+ label: 'This Month',
63
+ startDate: (0, _dateFns.startOfMonth)(date),
64
+ endDate: (0, _dateFns.endOfMonth)(date)
65
+ }, {
66
+ label: 'Last Month',
67
+ startDate: (0, _dateFns.startOfMonth)((0, _dateFns.addMonths)(date, -1)),
68
+ endDate: (0, _dateFns.endOfMonth)((0, _dateFns.addMonths)(date, -1))
69
+ }, {
70
+ label: 'This Year',
71
+ startDate: (0, _dateFns.startOfYear)(date),
72
+ endDate: (0, _dateFns.endOfYear)(date)
73
+ }, {
74
+ label: 'Last Year',
75
+ startDate: (0, _dateFns.startOfYear)((0, _dateFns.addYears)(date, -1)),
76
+ endDate: (0, _dateFns.endOfYear)((0, _dateFns.addYears)(date, -1))
77
+ }];
78
+ exports.getDefaultRanges = getDefaultRanges;
37
79
  function TrafficInsights(_ref) {
38
80
  let {
39
81
  client,
@@ -49,6 +91,7 @@ function TrafficInsights(_ref) {
49
91
  locale
50
92
  } = (0, _context.useLocaleContext)();
51
93
  const [anchorEl, setAnchorEl] = (0, _react.useState)(null);
94
+ const [loaded, setLoaded] = (0, _react.useState)(false);
52
95
  const [date, setDate] = (0, _react.useState)(maxDate);
53
96
  const [dateRange, setDateRange] = (0, _react.useState)({
54
97
  startDate: (0, _dayjs.default)().subtract(30, 'day').toDate(),
@@ -107,7 +150,7 @@ function TrafficInsights(_ref) {
107
150
  };
108
151
  const charts = Object.keys(metrics).map(key => ({
109
152
  id: "".concat(key, "_chart"),
110
- title: t("insights.traffic.".concat(key)),
153
+ title: t("analytics.traffic.".concat(key)),
111
154
  current: list.length ? metrics[key](list[0][key]) : 0,
112
155
  data: list.map(v => ({
113
156
  date: v.date,
@@ -121,6 +164,18 @@ function TrafficInsights(_ref) {
121
164
 
122
165
  // eslint-disable-next-line no-nested-ternary
123
166
  const pathPrefix = inService ? _constant.WELLKNOWN_SERVICE_PATH_PREFIX : process.env.NODE_ENV === 'production' ? info.routing.adminPath : '';
167
+ const breakdownUrl = (0, _urlJoin.default)(window.location.origin, pathPrefix, "/api/analytics/traffic?date=".concat((0, _dayjs.default)(date).format('YYYY-MM-DD'), "&did=").concat(did));
168
+ const onRangeChange = range => {
169
+ setDateRange(range);
170
+ setAnchorEl(null);
171
+ };
172
+ const onDateChange = newDate => {
173
+ setDate(newDate.toDate());
174
+ setLoaded(false);
175
+ };
176
+ const onOpenBreakdown = () => {
177
+ window.open(breakdownUrl);
178
+ };
124
179
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
125
180
  children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_Typography.default, {
126
181
  component: "div",
@@ -132,7 +187,7 @@ function TrafficInsights(_ref) {
132
187
  fontWeight: 'bold'
133
188
  },
134
189
  mb: 2,
135
- children: [t('insights.trend'), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Button.default, {
190
+ children: [t('analytics.trend'), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Button.default, {
136
191
  onClick: onTriggerClick,
137
192
  variant: "outlined",
138
193
  size: "small",
@@ -143,7 +198,7 @@ function TrafficInsights(_ref) {
143
198
  id: id,
144
199
  open: open,
145
200
  anchorEl: anchorEl,
146
- onClose: onTriggerClick,
201
+ onClose: () => setAnchorEl(null),
147
202
  anchorOrigin: {
148
203
  vertical: 'bottom',
149
204
  horizontal: 'left'
@@ -152,7 +207,8 @@ function TrafficInsights(_ref) {
152
207
  open: true,
153
208
  toggle: onTriggerClick,
154
209
  maxDate: maxDate,
155
- onChange: v => setDateRange(v)
210
+ definedRanges: getDefaultRanges(date),
211
+ onChange: onRangeChange
156
212
  })
157
213
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Grid.default, {
158
214
  container: true,
@@ -176,25 +232,34 @@ function TrafficInsights(_ref) {
176
232
  },
177
233
  mt: 4,
178
234
  mb: 1,
179
- children: [t('insights.detail'), /*#__PURE__*/(0, _jsxRuntime.jsx)(_LocalizationProvider.LocalizationProvider, {
180
- dateAdapter: _AdapterDayjs.AdapterDayjs,
181
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_xDatePickers.DatePicker, {
182
- disableFuture: true,
183
- format: "ll",
184
- value: (0, _dayjs.default)(date),
185
- onChange: newValue => setDate(newValue.toDate()),
186
- slotProps: {
187
- textField: {
188
- size: 'small'
235
+ children: [t('analytics.detail'), /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
236
+ children: [loaded && /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
237
+ onClick: onOpenBreakdown,
238
+ style: {
239
+ marginRight: 32
240
+ },
241
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_LaunchOutlined.default, {})
242
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_LocalizationProvider.LocalizationProvider, {
243
+ dateAdapter: _AdapterDayjs.AdapterDayjs,
244
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_xDatePickers.DatePicker, {
245
+ disableFuture: true,
246
+ format: "ll",
247
+ value: (0, _dayjs.default)(date),
248
+ onChange: onDateChange,
249
+ slotProps: {
250
+ textField: {
251
+ size: 'small'
252
+ }
189
253
  }
190
- }
191
- })
254
+ })
255
+ })]
192
256
  })]
193
257
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactIframe.default, {
194
- url: (0, _urlJoin.default)(window.location.origin, pathPrefix, "/api/insights/traffic?date=".concat((0, _dayjs.default)(date).format('YYYY-MM-DD'), "&did=").concat(did)),
258
+ url: breakdownUrl,
195
259
  width: "100%",
196
260
  height: "100%",
197
261
  frameBorder: 0,
262
+ onLoad: () => setLoaded(true),
198
263
  styles: {
199
264
  border: 0,
200
265
  minHeight: '400vh'
@@ -8,8 +8,8 @@ var _styled = _interopRequireDefault(require("@emotion/styled"));
8
8
  var _propTypes = _interopRequireDefault(require("prop-types"));
9
9
  var _Typography = _interopRequireDefault(require("@mui/material/Typography"));
10
10
  var _Grid = _interopRequireDefault(require("@mui/material/Grid"));
11
- var _cpu = _interopRequireDefault(require("../insights/cpu"));
12
- var _memory = _interopRequireDefault(require("../insights/memory"));
11
+ var _cpu = _interopRequireDefault(require("../analytics/cpu"));
12
+ var _memory = _interopRequireDefault(require("../analytics/memory"));
13
13
  var _jsxRuntime = require("react/jsx-runtime");
14
14
  var _templateObject;
15
15
  const _excluded = ["blocklet", "cpuHistory", "memoryHistory"];
@@ -20,7 +20,7 @@ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typ
20
20
  function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
21
21
  // eslint-disable-next-line import/prefer-default-export
22
22
  function useBlocklet(_ref) {
23
- var _blocklet$site, _blocklet$site$domain, _blocklet$meta, _blocklet$meta2, _blocklet$meta3, _blocklet$meta4, _blocklet$meta5, _blocklet$meta6, _blocklet$meta7, _blocklet$meta8, _blocklet$meta9;
23
+ var _blocklet$site, _blocklet$site$domain, _blocklet$meta, _blocklet$meta2, _blocklet$meta3, _blocklet$meta4, _blocklet$meta5, _blocklet$meta6, _blocklet$meta7;
24
24
  let {
25
25
  did,
26
26
  client,
@@ -189,14 +189,31 @@ function useBlocklet(_ref) {
189
189
  [data.domain]: _objectSpread(_objectSpread({}, pre[data.domain]), data)
190
190
  }));
191
191
  }, [blocklet === null || blocklet === void 0 ? void 0 : (_blocklet$meta = blocklet.meta) === null || _blocklet$meta === void 0 ? void 0 : _blocklet$meta.did, !disableSubscription]);
192
- useSubscription(_constant.BlockletEvents.statusChange, handleRefreshWithoutRuntime, [blocklet === null || blocklet === void 0 ? void 0 : (_blocklet$meta2 = blocklet.meta) === null || _blocklet$meta2 === void 0 ? void 0 : _blocklet$meta2.did, !disableSubscription]); // eslint-disable-line prettier/prettier
192
+ useSubscription(_constant.BlockletEvents.statusChange, data => {
193
+ var _data$meta3;
194
+ if ((data === null || data === void 0 ? void 0 : (_data$meta3 = data.meta) === null || _data$meta3 === void 0 ? void 0 : _data$meta3.did) === blocklet.meta.did) {
195
+ setBlocklet(oldBlocklet => {
196
+ const newBlocklet = _objectSpread({}, oldBlocklet);
197
+ newBlocklet.status = (0, _constant.fromBlockletStatus)(data.status);
198
+ (newBlocklet.children || []).forEach(x => {
199
+ const y = data.children.find(z => {
200
+ var _z$meta, _x$meta;
201
+ return ((_z$meta = z.meta) === null || _z$meta === void 0 ? void 0 : _z$meta.did) === ((_x$meta = x.meta) === null || _x$meta === void 0 ? void 0 : _x$meta.did);
202
+ });
203
+ if (y) {
204
+ x.status = (0, _constant.fromBlockletStatus)(y.status);
205
+ }
206
+ });
207
+ return newBlocklet;
208
+ });
209
+ handleRefreshWithoutRuntime(data);
210
+ }
211
+ }, [blocklet === null || blocklet === void 0 ? void 0 : (_blocklet$meta2 = blocklet.meta) === null || _blocklet$meta2 === void 0 ? void 0 : _blocklet$meta2.did, !disableSubscription]); // eslint-disable-line prettier/prettier
193
212
  useSubscription(_constant.BlockletEvents.storeChange, handleRefreshWithoutRuntime, [blocklet === null || blocklet === void 0 ? void 0 : (_blocklet$meta3 = blocklet.meta) === null || _blocklet$meta3 === void 0 ? void 0 : _blocklet$meta3.did, !disableSubscription]);
194
- useSubscription(_constant.BlockletEvents.started, handleRefresh, [blocklet === null || blocklet === void 0 ? void 0 : (_blocklet$meta4 = blocklet.meta) === null || _blocklet$meta4 === void 0 ? void 0 : _blocklet$meta4.did, !disableSubscription]);
195
- useSubscription(_constant.BlockletEvents.startFailed, handleRefresh, [blocklet === null || blocklet === void 0 ? void 0 : (_blocklet$meta5 = blocklet.meta) === null || _blocklet$meta5 === void 0 ? void 0 : _blocklet$meta5.did, !disableSubscription]);
196
- useSubscription(_constant.BlockletEvents.installed, handleRefresh, [blocklet === null || blocklet === void 0 ? void 0 : (_blocklet$meta6 = blocklet.meta) === null || _blocklet$meta6 === void 0 ? void 0 : _blocklet$meta6.did, !disableSubscription]);
197
- useSubscription(_constant.BlockletEvents.upgraded, handleRefresh, [blocklet === null || blocklet === void 0 ? void 0 : (_blocklet$meta7 = blocklet.meta) === null || _blocklet$meta7 === void 0 ? void 0 : _blocklet$meta7.did, !disableSubscription]);
198
- useSubscription(_constant.BlockletEvents.downgraded, handleRefresh, [blocklet === null || blocklet === void 0 ? void 0 : (_blocklet$meta8 = blocklet.meta) === null || _blocklet$meta8 === void 0 ? void 0 : _blocklet$meta8.did, !disableSubscription]);
199
- useSubscription(_constant.BlockletEvents.updated, handleRefresh, [blocklet === null || blocklet === void 0 ? void 0 : (_blocklet$meta9 = blocklet.meta) === null || _blocklet$meta9 === void 0 ? void 0 : _blocklet$meta9.did, !disableSubscription]);
213
+ useSubscription(_constant.BlockletEvents.installed, handleRefresh, [blocklet === null || blocklet === void 0 ? void 0 : (_blocklet$meta4 = blocklet.meta) === null || _blocklet$meta4 === void 0 ? void 0 : _blocklet$meta4.did, !disableSubscription]);
214
+ useSubscription(_constant.BlockletEvents.upgraded, handleRefresh, [blocklet === null || blocklet === void 0 ? void 0 : (_blocklet$meta5 = blocklet.meta) === null || _blocklet$meta5 === void 0 ? void 0 : _blocklet$meta5.did, !disableSubscription]);
215
+ useSubscription(_constant.BlockletEvents.downgraded, handleRefresh, [blocklet === null || blocklet === void 0 ? void 0 : (_blocklet$meta6 = blocklet.meta) === null || _blocklet$meta6 === void 0 ? void 0 : _blocklet$meta6.did, !disableSubscription]);
216
+ useSubscription(_constant.BlockletEvents.updated, handleRefresh, [blocklet === null || blocklet === void 0 ? void 0 : (_blocklet$meta7 = blocklet.meta) === null || _blocklet$meta7 === void 0 ? void 0 : _blocklet$meta7.did, !disableSubscription]);
200
217
  const data = blocklet ? (0, _merge.default)(blocklet, {
201
218
  site: {
202
219
  domainAliases: blocklet.site.domainAliases.map(x => {
package/lib/locales/en.js CHANGED
@@ -202,8 +202,7 @@ module.exports = {
202
202
  members: 'Members',
203
203
  memory: 'Memory',
204
204
  meta: 'Meta Data',
205
- monitor: 'Monitor',
206
- insights: 'Insights',
205
+ analytics: 'Analytics',
207
206
  runtime: 'Runtime',
208
207
  traffic: 'Traffic',
209
208
  more: 'More',
@@ -694,7 +693,7 @@ module.exports = {
694
693
  verifying: 'Verifying Blocklet Server v{version}',
695
694
  rollback: 'Rollback Blocklet Server',
696
695
  complete: 'Upgrade complete!',
697
- progress: 'Upgrading Blocklet Server to v{version}',
696
+ progress: 'Upgrading Blocklet Server {version}',
698
697
  check: 'Check for Updates',
699
698
  latest: 'You are running the latest version.'
700
699
  },
@@ -1465,7 +1464,7 @@ module.exports = {
1465
1464
  loading: 'Load subscription...',
1466
1465
  loadFailed: 'Failed to load subscription info, please retry!'
1467
1466
  },
1468
- insights: {
1467
+ analytics: {
1469
1468
  trend: 'Trends',
1470
1469
  detail: 'Breakdown',
1471
1470
  traffic: {
package/lib/locales/zh.js CHANGED
@@ -207,8 +207,7 @@ module.exports = {
207
207
  members: '成员',
208
208
  memory: '内存',
209
209
  meta: '元数据',
210
- monitor: '监控',
211
- insights: '洞见',
210
+ analytics: '统计分析',
212
211
  runtime: '运行监控',
213
212
  traffic: '流量分析',
214
213
  more: '更多',
@@ -694,7 +693,7 @@ module.exports = {
694
693
  verifying: '验证节点新版本 v{version}',
695
694
  rollback: '回滚此次升级',
696
695
  complete: '升级完成!',
697
- progress: '正在升级节点到 v{version}',
696
+ progress: '正在升级节点 {version}',
698
697
  check: '检查更新',
699
698
  latest: '太棒了,你的节点已经是最新版!'
700
699
  },
@@ -1468,7 +1467,7 @@ module.exports = {
1468
1467
  loadFailed: '加载订阅信息失败,请重试!',
1469
1468
  loading: '加载订阅信息...'
1470
1469
  },
1471
- insights: {
1470
+ analytics: {
1472
1471
  trend: '趋势',
1473
1472
  detail: '探究',
1474
1473
  traffic: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abtnode/ux",
3
- "version": "1.16.13-beta-90ded76f",
3
+ "version": "1.16.13-beta-2eb54cbc",
4
4
  "description": "UX components shared across abtnode packages",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -23,22 +23,22 @@
23
23
  "author": "linchen <linchen1987@foxmail.com> (http://github.com/linchen1987)",
24
24
  "license": "Apache-2.0",
25
25
  "dependencies": {
26
- "@abtnode/auth": "1.16.13-beta-90ded76f",
27
- "@abtnode/constant": "1.16.13-beta-90ded76f",
28
- "@abtnode/util": "1.16.13-beta-90ded76f",
26
+ "@abtnode/auth": "1.16.13-beta-2eb54cbc",
27
+ "@abtnode/constant": "1.16.13-beta-2eb54cbc",
28
+ "@abtnode/util": "1.16.13-beta-2eb54cbc",
29
29
  "@ahooksjs/use-url-state": "^3.5.1",
30
30
  "@arcblock/did": "^1.18.84",
31
- "@arcblock/did-connect": "^2.5.53",
31
+ "@arcblock/did-connect": "^2.5.54",
32
32
  "@arcblock/did-motif": "^1.1.12",
33
- "@arcblock/icons": "^2.5.53",
34
- "@arcblock/react-hooks": "^2.5.53",
35
- "@arcblock/terminal": "^2.5.53",
36
- "@arcblock/ux": "^2.5.53",
37
- "@blocklet/constant": "1.16.13-beta-90ded76f",
33
+ "@arcblock/icons": "^2.5.54",
34
+ "@arcblock/react-hooks": "^2.5.54",
35
+ "@arcblock/terminal": "^2.5.54",
36
+ "@arcblock/ux": "^2.5.54",
37
+ "@blocklet/constant": "1.16.13-beta-2eb54cbc",
38
38
  "@blocklet/launcher-layout": "2.1.26",
39
39
  "@blocklet/list": "^0.12.4",
40
- "@blocklet/meta": "1.16.13-beta-90ded76f",
41
- "@blocklet/ui-react": "^2.5.53",
40
+ "@blocklet/meta": "1.16.13-beta-2eb54cbc",
41
+ "@blocklet/ui-react": "^2.5.54",
42
42
  "@emotion/react": "^11.10.4",
43
43
  "@emotion/styled": "^11.10.4",
44
44
  "@iconify/react": "^4.0.0",
@@ -53,6 +53,7 @@
53
53
  "ahooks": "^3.7.1",
54
54
  "axios": "^0.27.2",
55
55
  "classnames": "^2.3.2",
56
+ "date-fns": "^2.30.0",
56
57
  "dsbridge": "3.1.4",
57
58
  "file-saver": "^2.0.5",
58
59
  "filesize": "^6.4.0",
@@ -94,5 +95,5 @@
94
95
  "@babel/preset-react": "^7.18.6",
95
96
  "babel-plugin-inline-react-svg": "^1.1.2"
96
97
  },
97
- "gitHead": "e6d4b88fe2cb45e00e5d745e1cd148dc76a019a4"
98
+ "gitHead": "7adf96c2eb31762d8eb14b8121fce9865d6a458c"
98
99
  }
File without changes
File without changes
File without changes
File without changes
File without changes