@twreporter/react-article-components 1.6.4-rc.2 → 1.6.4-rc.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,36 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [1.6.4-rc.5](https://github.com/twreporter/twreporter-npm-packages/compare/@twreporter/react-article-components@1.6.4-rc.4...@twreporter/react-article-components@1.6.4-rc.5) (2022-09-08)
7
+
8
+ **Note:** Version bump only for package @twreporter/react-article-components
9
+
10
+
11
+
12
+
13
+
14
+ ## [1.6.4-rc.4](https://github.com/twreporter/twreporter-npm-packages/compare/@twreporter/react-article-components@1.6.4-rc.3...@twreporter/react-article-components@1.6.4-rc.4) (2022-09-05)
15
+
16
+
17
+ ### Bug Fixes
18
+
19
+ * make `useSnackBar` headless ([ddaf3dd](https://github.com/twreporter/twreporter-npm-packages/commit/ddaf3ddbd44abba3684f9209fc1b9e8b4c678c15))
20
+
21
+
22
+
23
+
24
+
25
+ ## [1.6.4-rc.3](https://github.com/twreporter/twreporter-npm-packages/compare/@twreporter/react-article-components@1.6.4-rc.2...@twreporter/react-article-components@1.6.4-rc.3) (2022-08-25)
26
+
27
+
28
+ ### Bug Fixes
29
+
30
+ * fix empty subcategory part ([#305](https://github.com/twreporter/twreporter-npm-packages/issues/305)) ([492d347](https://github.com/twreporter/twreporter-npm-packages/commit/492d347f00427ccf2e8f3b93590d91309ea05676))
31
+
32
+
33
+
34
+
35
+
6
36
  ## [1.6.4-rc.2](https://github.com/twreporter/twreporter-npm-packages/compare/@twreporter/react-article-components@1.6.4-rc.1...@twreporter/react-article-components@1.6.4-rc.2) (2022-08-22)
7
37
 
8
38
  **Note:** Version bump only for package @twreporter/react-article-components
@@ -243,7 +243,7 @@ var Metadata = /*#__PURE__*/function (_PureComponent) {
243
243
  var categorySet = this.props.categorySet;
244
244
  return /*#__PURE__*/_react["default"].createElement(CategorySetFlexBox, null, /*#__PURE__*/_react["default"].createElement(_dynamicComponentsContext["default"].Consumer, null, function (components) {
245
245
  var categorySetJSX = _.map(categorySet, function (set, index) {
246
- var _set$category, _set$category2, _set$subcategory, _set$subcategory2;
246
+ var _set$category, _set$category2, _set$subcategory, _set$subcategory2, _set$category3;
247
247
 
248
248
  var genLink = function genLink(path, name) {
249
249
  var isCategory = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
@@ -261,7 +261,7 @@ var Metadata = /*#__PURE__*/function (_PureComponent) {
261
261
 
262
262
  return /*#__PURE__*/_react["default"].createElement(LinkContainer, {
263
263
  key: "categorySet-".concat(index)
264
- }, genLink("/categories/".concat(set === null || set === void 0 ? void 0 : (_set$category = set.category) === null || _set$category === void 0 ? void 0 : _set$category.id), set === null || set === void 0 ? void 0 : (_set$category2 = set.category) === null || _set$category2 === void 0 ? void 0 : _set$category2.name, true), genLink("/tags/".concat(set === null || set === void 0 ? void 0 : (_set$subcategory = set.subcategory) === null || _set$subcategory === void 0 ? void 0 : _set$subcategory.id), set === null || set === void 0 ? void 0 : (_set$subcategory2 = set.subcategory) === null || _set$subcategory2 === void 0 ? void 0 : _set$subcategory2.name));
264
+ }, genLink("/categories/".concat(set === null || set === void 0 ? void 0 : (_set$category = set.category) === null || _set$category === void 0 ? void 0 : _set$category.id), set === null || set === void 0 ? void 0 : (_set$category2 = set.category) === null || _set$category2 === void 0 ? void 0 : _set$category2.name, true), set !== null && set !== void 0 && (_set$subcategory = set.subcategory) !== null && _set$subcategory !== void 0 && _set$subcategory.id && set !== null && set !== void 0 && (_set$subcategory2 = set.subcategory) !== null && _set$subcategory2 !== void 0 && _set$subcategory2.name ? genLink("/tags/".concat(set.subcategory.id), set.subcategory.name) : genLink("/categories/".concat(set === null || set === void 0 ? void 0 : (_set$category3 = set.category) === null || _set$category3 === void 0 ? void 0 : _set$category3.id), '全部'));
265
265
  });
266
266
 
267
267
  return categorySetJSX;
@@ -65,7 +65,7 @@ var _ = {
65
65
  isNil: _isNil["default"]
66
66
  }; // global var
67
67
 
68
- var HideTextContext = /*#__PURE__*/(0, _react.createContext)();
68
+ var ToolBarContext = /*#__PURE__*/(0, _react.createContext)();
69
69
  var defaultFbAppID = '962589903815787';
70
70
 
71
71
  var defaultFunc = function defaultFunc() {};
@@ -90,8 +90,8 @@ var OptionContainer = /*#__PURE__*/_styledComponents["default"].div.withConfig({
90
90
  var SnackBarContainer = /*#__PURE__*/_styledComponents["default"].div.withConfig({
91
91
  displayName: "mobile-tool-bar__SnackBarContainer",
92
92
  componentId: "do65sv-3"
93
- })(["z-index:5;opacity:", ";position:absolute;left:50%;transform:translateX(-50%);transition:opacity 100ms;"], function (props) {
94
- return props.showSnackBar ? '1' : '0';
93
+ })(["z-index:5;position:absolute;left:50%;transform:translateX(-50%);transition:opacity 100ms;opacity:", ";"], function (props) {
94
+ return props.showSnackBar ? 1 : 0;
95
95
  });
96
96
 
97
97
  var ToolBarContainer = /*#__PURE__*/_styledComponents["default"].div.withConfig({
@@ -246,12 +246,10 @@ var ShareBy = function ShareBy(_ref4) {
246
246
  showOption = _useState2[0],
247
247
  setShowState = _useState2[1];
248
248
 
249
- var _useState3 = (0, _react.useState)(false),
250
- _useState4 = _slicedToArray(_useState3, 2),
251
- showSnackBar = _useState4[0],
252
- setSnackBar = _useState4[1];
249
+ var _useContext = (0, _react.useContext)(ToolBarContext),
250
+ hideText = _useContext.hideText,
251
+ toastr = _useContext.toastr;
253
252
 
254
- var hideText = (0, _react.useContext)(HideTextContext);
255
253
  var themeContext = (0, _react.useContext)(_styledComponents.ThemeContext);
256
254
  var theme = themeContext.name === _theme["default"].article.v2.photo ? 'photography' : 'normal';
257
255
  var releaseBranch = themeContext.releaseBranch;
@@ -261,10 +259,10 @@ var ShareBy = function ShareBy(_ref4) {
261
259
  return;
262
260
  }
263
261
 
264
- setSnackBar(true);
265
- setTimeout(function () {
266
- setSnackBar(false);
267
- }, 3000);
262
+ toastr({
263
+ text: '已複製',
264
+ timeout: 3000
265
+ });
268
266
  };
269
267
 
270
268
  var onButtonClick = function onButtonClick() {
@@ -294,11 +292,6 @@ var ShareBy = function ShareBy(_ref4) {
294
292
  appID: fbAppID
295
293
  }), /*#__PURE__*/_react["default"].createElement(LineShare, null), /*#__PURE__*/_react["default"].createElement(TwitterShare, null), /*#__PURE__*/_react["default"].createElement(CopyUrl, {
296
294
  onclick: onCopyUrl
297
- })), /*#__PURE__*/_react["default"].createElement(SnackBarContainer, {
298
- showSnackBar: showSnackBar
299
- }, /*#__PURE__*/_react["default"].createElement(_snackBar.SnackBar, {
300
- text: "\u5DF2\u8907\u88FD",
301
- theme: theme
302
295
  })));
303
296
  };
304
297
 
@@ -308,7 +301,10 @@ ShareBy.propTypes = {
308
301
 
309
302
  var FontLevel = function FontLevel(_ref5) {
310
303
  var changeFontLevel = _ref5.changeFontLevel;
311
- var hideText = (0, _react.useContext)(HideTextContext);
304
+
305
+ var _useContext2 = (0, _react.useContext)(ToolBarContext),
306
+ hideText = _useContext2.hideText;
307
+
312
308
  var themeContext = (0, _react.useContext)(_styledComponents.ThemeContext);
313
309
  var theme = themeContext.name === _theme["default"].article.v2.photo ? 'photography' : 'normal';
314
310
  var releaseBranch = themeContext.releaseBranch;
@@ -331,17 +327,10 @@ FontLevel.propTypes = {
331
327
  var BookmarkBlock = function BookmarkBlock(_ref6) {
332
328
  var articleMeta = _ref6.articleMeta;
333
329
 
334
- var _useState5 = (0, _react.useState)(false),
335
- _useState6 = _slicedToArray(_useState5, 2),
336
- showSnackBar = _useState6[0],
337
- setSnackBar = _useState6[1];
330
+ var _useContext3 = (0, _react.useContext)(ToolBarContext),
331
+ hideText = _useContext3.hideText,
332
+ toastr = _useContext3.toastr;
338
333
 
339
- var _useState7 = (0, _react.useState)(''),
340
- _useState8 = _slicedToArray(_useState7, 2),
341
- snackbarText = _useState8[0],
342
- setSnackbarText = _useState8[1];
343
-
344
- var hideText = (0, _react.useContext)(HideTextContext);
345
334
  var themeContext = (0, _react.useContext)(_styledComponents.ThemeContext);
346
335
  var theme = themeContext.name === _theme["default"].article.v2.photo ? 'photography' : 'normal';
347
336
  var releaseBranch = themeContext.releaseBranch;
@@ -373,7 +362,7 @@ var BookmarkBlock = function BookmarkBlock(_ref6) {
373
362
  console.error('add bookmark fail', _context2.t0);
374
363
 
375
364
  case 9:
376
- toastr(isBookmarked);
365
+ onClickButton(isBookmarked);
377
366
 
378
367
  case 10:
379
368
  case "end":
@@ -402,24 +391,19 @@ var BookmarkBlock = function BookmarkBlock(_ref6) {
402
391
  }));
403
392
  };
404
393
 
405
- var toastr = function toastr(isBookmarked) {
406
- setSnackbarText(isBookmarked ? '已取消書籤' : '已儲存');
407
- setSnackBar(true);
408
- setTimeout(function () {
409
- setSnackBar(false);
410
- }, 3000);
394
+ var onClickButton = function onClickButton(isBookmarked) {
395
+ var text = isBookmarked ? '已取消書籤' : '已儲存';
396
+ toastr({
397
+ text: text,
398
+ timeout: 3000
399
+ });
411
400
  };
412
401
 
413
402
  return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_bookmarkWidget["default"], {
414
403
  toAutoCheck: false,
415
404
  articleMeta: articleMeta,
416
405
  renderIcon: renderIcon
417
- }), /*#__PURE__*/_react["default"].createElement(SnackBarContainer, {
418
- showSnackBar: showSnackBar
419
- }, /*#__PURE__*/_react["default"].createElement(_snackBar.SnackBar, {
420
- text: snackbarText,
421
- theme: theme
422
- })));
406
+ }));
423
407
  };
424
408
 
425
409
  BookmarkBlock.propTypes = {
@@ -428,7 +412,10 @@ BookmarkBlock.propTypes = {
428
412
 
429
413
  var BackToTopic = function BackToTopic(_ref8) {
430
414
  var backToTopic = _ref8.backToTopic;
431
- var hideText = (0, _react.useContext)(HideTextContext);
415
+
416
+ var _useContext4 = (0, _react.useContext)(ToolBarContext),
417
+ hideText = _useContext4.hideText;
418
+
432
419
  var themeContext = (0, _react.useContext)(_styledComponents.ThemeContext);
433
420
  var theme = themeContext.name === _theme["default"].article.v2.photo ? 'photography' : 'normal';
434
421
  var releaseBranch = themeContext.releaseBranch;
@@ -452,7 +439,9 @@ BackToTopic.propTypes = {
452
439
  };
453
440
 
454
441
  var RelatedPost = function RelatedPost() {
455
- var hideText = (0, _react.useContext)(HideTextContext);
442
+ var _useContext5 = (0, _react.useContext)(ToolBarContext),
443
+ hideText = _useContext5.hideText;
444
+
456
445
  var themeContext = (0, _react.useContext)(_styledComponents.ThemeContext);
457
446
  var theme = themeContext.name === _theme["default"].article.v2.photo ? 'photography' : 'normal';
458
447
  var releaseBranch = themeContext.releaseBranch;
@@ -479,10 +468,10 @@ var ToolBar = function ToolBar(_ref9) {
479
468
  onFontLevelChange = _ref9.onFontLevelChange,
480
469
  className = _ref9.className;
481
470
 
482
- var _useState9 = (0, _react.useState)('init'),
483
- _useState10 = _slicedToArray(_useState9, 2),
484
- scrollDirection = _useState10[0],
485
- setScrollDirection = _useState10[1];
471
+ var _useState3 = (0, _react.useState)('init'),
472
+ _useState4 = _slicedToArray(_useState3, 2),
473
+ scrollDirection = _useState4[0],
474
+ setScrollDirection = _useState4[1];
486
475
 
487
476
  (0, _react.useEffect)(function () {
488
477
  var threshold = 8;
@@ -523,17 +512,27 @@ var ToolBar = function ToolBar(_ref9) {
523
512
  };
524
513
  }, [scrollDirection]);
525
514
  var themeContext = (0, _react.useContext)(_styledComponents.ThemeContext);
515
+ var theme = themeContext.name === _theme["default"].article.v2.photo ? 'photography' : 'normal';
526
516
 
527
517
  var _getToolBarTheme = (0, _theme2.getToolBarTheme)(themeContext.name),
528
518
  bgColor = _getToolBarTheme.bgColor,
529
519
  shadow = _getToolBarTheme.shadow;
530
520
 
521
+ var _useSnackBar = (0, _snackBar.useSnackBar)(),
522
+ showSnackBar = _useSnackBar.showSnackBar,
523
+ snackBarText = _useSnackBar.snackBarText,
524
+ toastr = _useSnackBar.toastr;
525
+
531
526
  var backToTopicJSX = backToTopic ? /*#__PURE__*/_react["default"].createElement(BackToTopic, {
532
527
  backToTopic: backToTopic
533
528
  }) : null;
534
529
  var hideText = scrollDirection === 'down';
535
- return /*#__PURE__*/_react["default"].createElement(HideTextContext.Provider, {
536
- value: hideText
530
+ var contextValue = {
531
+ hideText: hideText,
532
+ toastr: toastr
533
+ };
534
+ return /*#__PURE__*/_react["default"].createElement(ToolBarContext.Provider, {
535
+ value: contextValue
537
536
  }, /*#__PURE__*/_react["default"].createElement(ToolBarContainer, {
538
537
  bgColor: bgColor,
539
538
  shadow: shadow,
@@ -545,7 +544,12 @@ var ToolBar = function ToolBar(_ref9) {
545
544
  fbAppID: fbAppID
546
545
  }), /*#__PURE__*/_react["default"].createElement(BookmarkBlock, {
547
546
  articleMeta: articleMetaForBookmark
548
- }), /*#__PURE__*/_react["default"].createElement(RelatedPost, null), backToTopicJSX));
547
+ }), /*#__PURE__*/_react["default"].createElement(RelatedPost, null), backToTopicJSX, /*#__PURE__*/_react["default"].createElement(SnackBarContainer, {
548
+ showSnackBar: showSnackBar
549
+ }, /*#__PURE__*/_react["default"].createElement(_snackBar.SnackBar, {
550
+ text: snackBarText,
551
+ theme: theme
552
+ }))));
549
553
  };
550
554
 
551
555
  ToolBar.propTypes = _aside["default"].tools;
@@ -21,12 +21,14 @@ var _get = _interopRequireDefault(require("lodash/get"));
21
21
 
22
22
  var _merge = _interopRequireDefault(require("lodash/merge"));
23
23
 
24
- var _theme = _interopRequireDefault(require("../../constants/theme"));
25
-
26
24
  var _color = _interopRequireDefault(require("../../constants/color"));
27
25
 
28
26
  var _body = _interopRequireDefault(require("../../constants/prop-types/body"));
29
27
 
28
+ var _theme = _interopRequireDefault(require("../../constants/theme"));
29
+
30
+ var _positionZIndex = _interopRequireDefault(require("../../constants/position-z-index"));
31
+
30
32
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
31
33
 
32
34
  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); }
@@ -74,11 +76,17 @@ var _ = {
74
76
  get: _get["default"],
75
77
  merge: _merge["default"]
76
78
  };
79
+ var embedNamespace = {
80
+ infogram: 'infogram',
81
+ twreporter: '__twreporterEmbeddedData'
82
+ };
77
83
 
78
84
  var Block = /*#__PURE__*/_styledComponents["default"].div.withConfig({
79
85
  displayName: "embedded-code__Block",
80
86
  componentId: "tkafgt-0"
81
- })(["position:relative;img.img-responsive{margin:0 auto;max-width:100%;height:auto;display:block;}"]);
87
+ })(["position:relative;z-index:", ";img.img-responsive{margin:0 auto;max-width:100%;height:auto;display:block;}"], function (props) {
88
+ return props.shouldEscalateZIndex ? _positionZIndex["default"].embed : 0;
89
+ });
82
90
 
83
91
  exports.Block = Block;
84
92
 
@@ -112,8 +120,6 @@ function dispatchWindowLoadEvent() {
112
120
  window.dispatchEvent(loadEvent);
113
121
  }
114
122
 
115
- var infogramEmbed = 'infogram';
116
-
117
123
  var EmbeddedCode = /*#__PURE__*/function (_React$PureComponent) {
118
124
  _inherits(EmbeddedCode, _React$PureComponent);
119
125
 
@@ -127,7 +133,8 @@ var EmbeddedCode = /*#__PURE__*/function (_React$PureComponent) {
127
133
  _this = _super.call(this, props);
128
134
 
129
135
  _defineProperty(_assertThisInitialized(_this), "state", {
130
- isLoaded: false
136
+ isLoaded: false,
137
+ shouldEscalateZIndex: false
131
138
  });
132
139
 
133
140
  _defineProperty(_assertThisInitialized(_this), "executeScript", function () {
@@ -188,23 +195,32 @@ var EmbeddedCode = /*#__PURE__*/function (_React$PureComponent) {
188
195
 
189
196
  var _$get = _.get(_this.props, ['data', 'content', 0], {}),
190
197
  caption = _$get.caption,
198
+ embeddedCode = _$get.embeddedCode,
191
199
  embeddedCodeWithoutScript = _$get.embeddedCodeWithoutScript;
192
200
 
193
201
  _this._caption = caption;
194
202
  _this._embeddedCodeWithoutScript = embeddedCodeWithoutScript;
203
+ _this._embeddedCode = embeddedCode;
195
204
  return _this;
196
205
  }
197
206
 
198
207
  _createClass(EmbeddedCode, [{
199
208
  key: "componentDidMount",
200
209
  value: function componentDidMount() {
201
- var _this$_embeddedCodeWi;
210
+ var _this$_embeddedCodeWi, _this$_embeddedCode;
202
211
 
203
212
  // Delay loading infogram in loadEmbed()
204
- if (!((_this$_embeddedCodeWi = this._embeddedCodeWithoutScript) !== null && _this$_embeddedCodeWi !== void 0 && _this$_embeddedCodeWi.includes(infogramEmbed))) {
213
+ if (!((_this$_embeddedCodeWi = this._embeddedCodeWithoutScript) !== null && _this$_embeddedCodeWi !== void 0 && _this$_embeddedCodeWi.includes(embedNamespace.infogram))) {
205
214
  this.setState({
206
215
  isLoaded: true
207
216
  }, this.executeScript);
217
+ } // Deliberately set z-index for embeded from @twreporter
218
+
219
+
220
+ if ((_this$_embeddedCode = this._embeddedCode) !== null && _this$_embeddedCode !== void 0 && _this$_embeddedCode.includes(embedNamespace.twreporter)) {
221
+ this.setState({
222
+ shouldEscalateZIndex: true
223
+ });
208
224
  }
209
225
  }
210
226
  }, {
@@ -212,6 +228,7 @@ var EmbeddedCode = /*#__PURE__*/function (_React$PureComponent) {
212
228
  value: function componentWillUnmount() {
213
229
  this._embedded = null;
214
230
  this._caption = null;
231
+ this._embeddedCode = null;
215
232
  this._embeddedCodeWithoutScript = null;
216
233
  }
217
234
  }, {
@@ -220,17 +237,19 @@ var EmbeddedCode = /*#__PURE__*/function (_React$PureComponent) {
220
237
  var _this$_embeddedCodeWi2;
221
238
 
222
239
  var className = this.props.className;
240
+ var shouldEscalateZIndex = this.state.shouldEscalateZIndex;
223
241
 
224
242
  var embed = /*#__PURE__*/_react["default"].createElement("div", {
225
243
  className: className
226
244
  }, /*#__PURE__*/_react["default"].createElement(Block, {
227
245
  ref: this._embedded,
246
+ shouldEscalateZIndex: shouldEscalateZIndex,
228
247
  dangerouslySetInnerHTML: {
229
248
  __html: this._embeddedCodeWithoutScript
230
249
  }
231
250
  }), this._caption ? /*#__PURE__*/_react["default"].createElement(Caption, null, this._caption) : null);
232
251
 
233
- if ((_this$_embeddedCodeWi2 = this._embeddedCodeWithoutScript) !== null && _this$_embeddedCodeWi2 !== void 0 && _this$_embeddedCodeWi2.includes(infogramEmbed)) {
252
+ if ((_this$_embeddedCodeWi2 = this._embeddedCodeWithoutScript) !== null && _this$_embeddedCodeWi2 !== void 0 && _this$_embeddedCodeWi2.includes(embedNamespace.infogram)) {
234
253
  return this.state.isLoaded ? embed : null;
235
254
  }
236
255
 
@@ -9,6 +9,10 @@ var _default = {
9
9
  // z-index is set for covering web-push & header.
10
10
  // Set z-index to 1002 because web-push has z-index 1001,
11
11
  // And header has z-index 1000.
12
- toc: 1002
12
+ toc: 1002,
13
+ // embeded code
14
+ // when z-index is escalated, it is above toolbar
15
+ // but under the header hamburger menu which has z-index 1000
16
+ embed: 999
13
17
  };
14
18
  exports["default"] = _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@twreporter/react-article-components",
3
- "version": "1.6.4-rc.2",
3
+ "version": "1.6.4-rc.5",
4
4
  "description": "The Reporter react article components, which are used in article page",
5
5
  "main": "lib/components/article-page.js",
6
6
  "repository": "https://github.com/twreporter/twreporter-npm-packages.git",
@@ -25,9 +25,9 @@
25
25
  },
26
26
  "dependencies": {
27
27
  "@twreporter/core": "^1.6.0-rc.0",
28
- "@twreporter/react-components": "^8.12.1-rc.1",
28
+ "@twreporter/react-components": "^8.13.0-rc.0",
29
29
  "@twreporter/redux": "^7.3.0-rc.0",
30
- "@twreporter/universal-header": "^2.2.14-rc.1",
30
+ "@twreporter/universal-header": "^2.2.14-rc.2",
31
31
  "howler": "^2.2.3",
32
32
  "lodash": "^4.17.11",
33
33
  "memoize-one": "^5.0.5",
@@ -40,5 +40,5 @@
40
40
  "files": [
41
41
  "lib"
42
42
  ],
43
- "gitHead": "bd76b2c13e84ed0675cd7af84b5647e6d629d29e"
43
+ "gitHead": "34a3eab10de26513fdddc05e8fdc241183b03885"
44
44
  }