@sanity/dashboard 2.30.3-shopify.4 → 2.30.4-dashboard-test.26

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.
@@ -3,27 +3,12 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- var _exportNames = {};
7
6
  exports.default = void 0;
8
7
 
9
8
  var _react = _interopRequireDefault(require("react"));
10
9
 
11
10
  var _Dashboard = _interopRequireDefault(require("./containers/Dashboard"));
12
11
 
13
- var _dashboardWidget = require("./components/dashboardWidget");
14
-
15
- Object.keys(_dashboardWidget).forEach(function (key) {
16
- if (key === "default" || key === "__esModule") return;
17
- if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
18
- if (key in exports && exports[key] === _dashboardWidget[key]) return;
19
- Object.defineProperty(exports, key, {
20
- enumerable: true,
21
- get: function get() {
22
- return _dashboardWidget[key];
23
- }
24
- });
25
- });
26
-
27
12
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
28
13
 
29
14
  var strokeStyle = {
@@ -31,11 +31,14 @@ var Content = (0, _styledComponents.default)(_ui.Box)(_templateObject4 || (_temp
31
31
  var DashboardWidget = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
32
32
  var header = props.header,
33
33
  children = props.children,
34
- footer = props.footer;
34
+ footer = props.footer,
35
+ hideFooterBorder = props.hideFooterBorder,
36
+ className = props.className;
35
37
  return /*#__PURE__*/_react.default.createElement(Root, {
36
38
  radius: 3,
37
39
  display: "flex",
38
- ref: ref
40
+ ref: ref,
41
+ className: className
39
42
  }, header && /*#__PURE__*/_react.default.createElement(Header, {
40
43
  borderBottom: true,
41
44
  paddingX: 3,
@@ -43,8 +46,11 @@ var DashboardWidget = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
43
46
  }, /*#__PURE__*/_react.default.createElement(_ui.Heading, {
44
47
  size: 1,
45
48
  textOverflow: "ellipsis"
46
- }, header)), children && /*#__PURE__*/_react.default.createElement(Content, null, children), footer && /*#__PURE__*/_react.default.createElement(Footer, {
47
- borderTop: true
49
+ }, header)), children && /*#__PURE__*/_react.default.createElement(Content, {
50
+ "data-name": "content"
51
+ }, children), footer && /*#__PURE__*/_react.default.createElement(Footer, {
52
+ sizing: "border",
53
+ borderTop: !hideFooterBorder
48
54
  }, footer));
49
55
  });
50
56
  exports.DashboardWidget = DashboardWidget;
@@ -6,7 +6,11 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = void 0;
7
7
  var _default = {
8
8
  widgets: [{
9
- name: 'sanity-tutorials'
9
+ name: 'sanity-tutorials',
10
+ layout: {
11
+ width: 'full',
12
+ height: 'full'
13
+ }
10
14
  }, {
11
15
  name: 'project-info'
12
16
  }, {
package/lib/index.js ADDED
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _exportNames = {};
7
+ Object.defineProperty(exports, "default", {
8
+ enumerable: true,
9
+ get: function get() {
10
+ return _DashboardTool.default;
11
+ }
12
+ });
13
+
14
+ var _dashboardWidget = require("./components/dashboardWidget");
15
+
16
+ Object.keys(_dashboardWidget).forEach(function (key) {
17
+ if (key === "default" || key === "__esModule") return;
18
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
19
+ if (key in exports && exports[key] === _dashboardWidget[key]) return;
20
+ Object.defineProperty(exports, key, {
21
+ enumerable: true,
22
+ get: function get() {
23
+ return _dashboardWidget[key];
24
+ }
25
+ });
26
+ });
27
+
28
+ var _DashboardTool = _interopRequireDefault(require("./DashboardTool"));
29
+
30
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -5,16 +5,12 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
- var _get2 = _interopRequireDefault(require("lodash/get"));
9
-
10
8
  var _react = _interopRequireDefault(require("react"));
11
9
 
12
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
13
11
 
14
12
  var _ui = require("@sanity/ui");
15
13
 
16
- var _DashboardTool = require("../../DashboardTool");
17
-
18
14
  var _Tutorial = _interopRequireDefault(require("./Tutorial"));
19
15
 
20
16
  var _dataAdapter = _interopRequireDefault(require("./dataAdapter"));
@@ -23,6 +19,27 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
23
19
 
24
20
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
25
21
 
22
+ var FeedItem = _ref => {
23
+ var feedItem = _ref.feedItem;
24
+ // Check to see if the feed item has the content needed to render an item with a link and poster image
25
+ var isEmpty = !feedItem.title || !feedItem.guideOrTutorial && !feedItem.externalLink && !feedItem.feedItems;
26
+
27
+ if (isEmpty) {
28
+ return null;
29
+ }
30
+
31
+ var subtitle = feedItem.description;
32
+ var _feedItem$guideOrTuto = feedItem.guideOrTutorial,
33
+ guideOrTutorial = _feedItem$guideOrTuto === void 0 ? {} : _feedItem$guideOrTuto;
34
+ return /*#__PURE__*/_react.default.createElement(_Tutorial.default, {
35
+ title: feedItem.title,
36
+ href: createUrl(guideOrTutorial.slug, guideOrTutorial._type) || feedItem.externalLink,
37
+ presenterSubtitle: subtitle,
38
+ showPlayIcon: feedItem.hasVideo,
39
+ posterURL: feedItem.poster ? urlBuilder.image(feedItem.poster).height(360).url() : undefined
40
+ });
41
+ };
42
+
26
43
  var urlBuilder = _dataAdapter.default.urlBuilder,
27
44
  getFeed = _dataAdapter.default.getFeed;
28
45
 
@@ -49,6 +66,7 @@ class SanityTutorials extends _react.default.Component {
49
66
  var templateRepoId = this.props.templateRepoId;
50
67
  this.subscription = getFeed(templateRepoId).subscribe(response => {
51
68
  this.setState({
69
+ title: response.title,
52
70
  feedItems: response.items
53
71
  });
54
72
  });
@@ -61,44 +79,76 @@ class SanityTutorials extends _react.default.Component {
61
79
  }
62
80
 
63
81
  render() {
64
- var feedItems = this.state.feedItems;
65
- var title = 'Learn about Sanity';
66
- return /*#__PURE__*/_react.default.createElement(_DashboardTool.DashboardWidget, {
67
- header: title
82
+ var _this$state = this.state,
83
+ _this$state$title = _this$state.title,
84
+ title = _this$state$title === void 0 ? 'Learn about Sanity' : _this$state$title,
85
+ feedItems = _this$state.feedItems;
86
+ var templateRepoId = this.props.templateRepoId; // Filter out items and sections for layout purposes
87
+
88
+ var sections = feedItems.filter(i => i._type === 'feedSection');
89
+ var items = feedItems.filter(i => i._type === 'feedItem');
90
+
91
+ var columns = length => length < 4 ? [1, 2, 3] : [1, 2, 3, 4];
92
+
93
+ return /*#__PURE__*/_react.default.createElement(_ui.Container, {
94
+ width: 4
95
+ }, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
96
+ space: 6,
97
+ paddingBottom: 4
98
+ }, /*#__PURE__*/_react.default.createElement(_ui.Card, {
99
+ tone: "primary",
100
+ padding: 4,
101
+ radius: 2,
102
+ border: true,
103
+ marginTop: 4,
104
+ "data-name": "sanity-tutorials-widget-docs-link"
68
105
  }, /*#__PURE__*/_react.default.createElement(_ui.Flex, {
69
- as: "ul",
70
- overflow: "auto",
71
- align: "stretch",
72
- paddingY: 2
73
- }, feedItems === null || feedItems === void 0 ? void 0 : feedItems.map((feedItem, index) => {
74
- if (!feedItem.title || !feedItem.guideOrTutorial && !feedItem.externalLink) {
75
- return null;
76
- }
77
-
78
- var presenter = feedItem.presenter || (0, _get2.default)(feedItem, 'guideOrTutorial.presenter') || {};
79
- var subtitle = (0, _get2.default)(feedItem, 'category');
80
- var _feedItem$guideOrTuto = feedItem.guideOrTutorial,
81
- guideOrTutorial = _feedItem$guideOrTuto === void 0 ? {} : _feedItem$guideOrTuto;
82
- return /*#__PURE__*/_react.default.createElement(_ui.Flex, {
106
+ direction: ['column', 'column', 'row']
107
+ }, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
108
+ space: 4,
109
+ flex: 1,
110
+ paddingRight: [0, 0, 4]
111
+ }, /*#__PURE__*/_react.default.createElement(_ui.Heading, null, "Getting Started Guide"), /*#__PURE__*/_react.default.createElement(_ui.Text, null, "It\u2019s time to learn how to build schemas, create content and connect it with other applications.")), /*#__PURE__*/_react.default.createElement(_ui.Flex, {
112
+ paddingTop: [4, 4, 0],
113
+ align: "center"
114
+ }, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
115
+ flex: 1
116
+ }, /*#__PURE__*/_react.default.createElement(_ui.Button, {
117
+ paddingY: 3,
118
+ paddingX: 5,
119
+ tone: "primary",
120
+ as: "a",
121
+ href: "https://www.sanity.io/docs?ref=dashboard-".concat(templateRepoId || 'plugin'),
122
+ text: "Go go docs",
123
+ target: "_blank"
124
+ }))))), sections && (sections === null || sections === void 0 ? void 0 : sections.length) > 0 && sections.map(section => {
125
+ var _section$sectionItems;
126
+
127
+ return (section === null || section === void 0 ? void 0 : section.sectionItems) && /*#__PURE__*/_react.default.createElement(_ui.Stack, {
128
+ space: 4,
129
+ key: section._id
130
+ }, /*#__PURE__*/_react.default.createElement(_ui.Heading, null, section.title), /*#__PURE__*/_react.default.createElement(_ui.Grid, {
131
+ as: "ul",
132
+ columns: columns(section === null || section === void 0 ? void 0 : (_section$sectionItems = section.sectionItems) === null || _section$sectionItems === void 0 ? void 0 : _section$sectionItems.length),
133
+ gap: 4
134
+ }, section === null || section === void 0 ? void 0 : section.sectionItems.map(item => /*#__PURE__*/_react.default.createElement(_ui.Flex, {
83
135
  as: "li",
84
- key: feedItem._id,
85
- paddingRight: index < (feedItems === null || feedItems === void 0 ? void 0 : feedItems.length) - 1 ? 1 : 3,
86
- paddingLeft: index === 0 ? 3 : 0,
87
- align: "stretch",
88
- flex: "0 0 27.5%",
89
- style: {
90
- minWidth: 272,
91
- width: '30%'
92
- }
93
- }, /*#__PURE__*/_react.default.createElement(_Tutorial.default, {
94
- title: feedItem.title,
95
- href: createUrl(guideOrTutorial.slug, guideOrTutorial._type) || feedItem.externalLink,
96
- presenterName: presenter.name,
97
- presenterSubtitle: subtitle,
98
- showPlayIcon: feedItem.hasVideo,
99
- posterURL: urlBuilder.image(feedItem.poster).height(360).url()
100
- }));
101
- })));
136
+ key: item._id
137
+ }, /*#__PURE__*/_react.default.createElement(FeedItem, {
138
+ feedItem: item
139
+ })))));
140
+ }), items && items.length > 0 && /*#__PURE__*/_react.default.createElement(_ui.Stack, {
141
+ space: 4
142
+ }, /*#__PURE__*/_react.default.createElement(_ui.Heading, null, title), /*#__PURE__*/_react.default.createElement(_ui.Grid, {
143
+ as: "ul",
144
+ columns: columns(items === null || items === void 0 ? void 0 : items.length),
145
+ gap: 4
146
+ }, items.map(feedItem => /*#__PURE__*/_react.default.createElement(_ui.Flex, {
147
+ as: "li",
148
+ key: feedItem._id
149
+ }, /*#__PURE__*/_react.default.createElement(FeedItem, {
150
+ feedItem: feedItem
151
+ })))))));
102
152
  }
103
153
 
104
154
  }
@@ -7,15 +7,11 @@ exports.default = void 0;
7
7
 
8
8
  var _react = _interopRequireDefault(require("react"));
9
9
 
10
- var _propTypes = _interopRequireDefault(require("prop-types"));
11
-
12
10
  var _ui = require("@sanity/ui");
13
11
 
14
- var _icons = require("@sanity/icons");
15
-
16
12
  var _styledComponents = _interopRequireDefault(require("styled-components"));
17
13
 
18
- var _templateObject, _templateObject2, _templateObject3, _templateObject4;
14
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5;
19
15
 
20
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
17
 
@@ -23,14 +19,32 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
23
19
 
24
20
  function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
25
21
 
22
+ // eslint-disable-next-line no-useless-escape
23
+ var youtubeRegex = /youtu(?:.*\/v\/|.*v\=|\.be\/)([A-Za-z0-9_-]{11})/;
26
24
  var PlayIconBox = (0, _styledComponents.default)(_ui.Box)(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n\n &:before {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 2.75em;\n height: 2.75em;\n border-radius: 50%;\n background: ", ";\n opacity: 0.75;\n }\n"])), _ref => {
27
25
  var theme = _ref.theme;
28
26
  return theme.sanity.color.card.enabled.bg;
29
27
  });
30
28
  var Root = (0, _styledComponents.default)(_ui.Flex)(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n &:hover {\n ", " {\n &:before {\n opacity: 1;\n }\n }\n }\n"])), PlayIconBox);
31
- var PosterCard = (0, _styledComponents.default)(_ui.Card)(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n width: 100%;\n padding-bottom: calc(9 / 16 * 100%);\n position: relative;\n"])));
32
-
33
- var Poster = _styledComponents.default.img(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n width: 100%;\n object-fit: cover;\n display: block;\n\n &:not([src]) {\n display: none;\n }\n"])));
29
+ var PosterCard = (0, _styledComponents.default)(_ui.Card)(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n width: 100%;\n padding-bottom: calc(9 / 16 * 100%);\n position: relative;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n"])));
30
+
31
+ var Poster = _styledComponents.default.img(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n width: 100%;\n object-fit: cover;\n display: block;\n border-radius: inherit;\n\n &:not([src]) {\n display: none;\n }\n"])));
32
+
33
+ var YoutubeContainer = (0, _styledComponents.default)(_ui.Card)(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n position: relative;\n padding-bottom: 56.25%;\n overflow: hidden;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n\n iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n"])));
34
+
35
+ var YoutubeEmbed = _ref2 => {
36
+ var embedId = _ref2.embedId;
37
+ return /*#__PURE__*/_react.default.createElement(YoutubeContainer, {
38
+ radius: 3
39
+ }, /*#__PURE__*/_react.default.createElement("iframe", {
40
+ width: "853",
41
+ height: "480",
42
+ src: "https://www.youtube.com/embed/".concat(embedId),
43
+ frameBorder: "0",
44
+ allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",
45
+ allowFullScreen: true
46
+ }));
47
+ };
34
48
 
35
49
  class Tutorial extends _react.default.PureComponent {
36
50
  render() {
@@ -39,69 +53,71 @@ class Tutorial extends _react.default.PureComponent {
39
53
  posterURL = _this$props.posterURL,
40
54
  showPlayIcon = _this$props.showPlayIcon,
41
55
  href = _this$props.href,
42
- presenterName = _this$props.presenterName,
43
56
  presenterSubtitle = _this$props.presenterSubtitle;
44
- return /*#__PURE__*/_react.default.createElement(Root, {
57
+ var isYoutube = showPlayIcon && href && href.match(youtubeRegex);
58
+ return isYoutube ? /*#__PURE__*/_react.default.createElement(_ui.Card, {
59
+ space: 2,
60
+ sizing: "border",
61
+ flex: 1,
62
+ radius: 3,
63
+ style: {
64
+ position: 'relative'
65
+ },
66
+ border: true,
67
+ paddingBottom: 2
68
+ }, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
69
+ space: 2,
70
+ height: "fill"
71
+ }, /*#__PURE__*/_react.default.createElement(YoutubeEmbed, {
72
+ embedId: href.match(youtubeRegex)[1]
73
+ }), /*#__PURE__*/_react.default.createElement(_ui.Stack, {
74
+ space: 3,
75
+ flex: 1,
76
+ padding: 2
77
+ }, /*#__PURE__*/_react.default.createElement(_ui.Text, {
78
+ as: "h3",
79
+ size: 1,
80
+ weight: "bold"
81
+ }, title), presenterSubtitle && /*#__PURE__*/_react.default.createElement(_ui.Text, {
82
+ size: 1,
83
+ muted: true
84
+ }, presenterSubtitle)))) : /*#__PURE__*/_react.default.createElement(Root, {
45
85
  flex: 1
46
86
  }, /*#__PURE__*/_react.default.createElement(_ui.Card, {
47
87
  sizing: "border",
48
88
  flex: 1,
49
- padding: 2,
50
- radius: 2,
89
+ radius: 3,
51
90
  as: "a",
52
91
  href: href,
53
92
  target: "_blank",
54
- rel: "noopener noreferrer",
55
93
  style: {
56
94
  position: 'relative'
57
- }
58
- }, /*#__PURE__*/_react.default.createElement(_ui.Flex, {
59
- direction: "column",
60
- style: {
61
- height: '100%'
62
- }
95
+ },
96
+ border: true,
97
+ paddingBottom: 2
98
+ }, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
99
+ space: 2,
100
+ height: "fill"
63
101
  }, posterURL && /*#__PURE__*/_react.default.createElement(PosterCard, {
64
- marginBottom: 1
102
+ radius: 3
65
103
  }, /*#__PURE__*/_react.default.createElement(Poster, {
66
104
  src: posterURL
67
- }), showPlayIcon && /*#__PURE__*/_react.default.createElement(PlayIconBox, {
68
- display: "flex"
105
+ })), /*#__PURE__*/_react.default.createElement(_ui.Stack, {
106
+ space: 3,
107
+ flex: 1,
108
+ padding: 2
69
109
  }, /*#__PURE__*/_react.default.createElement(_ui.Text, {
70
- align: "center"
71
- }, /*#__PURE__*/_react.default.createElement(_icons.PlayIcon, null)))), /*#__PURE__*/_react.default.createElement(_ui.Flex, {
72
- direction: "column",
73
- justify: "space-between",
74
- paddingY: 2,
75
- flex: 1
76
- }, /*#__PURE__*/_react.default.createElement(_ui.Heading, {
77
110
  as: "h3",
78
- size: 1
79
- }, title), /*#__PURE__*/_react.default.createElement(_ui.Box, {
80
- marginTop: 4
81
- }, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
82
- space: 2,
83
- flex: 1
84
- }, /*#__PURE__*/_react.default.createElement(_ui.Text, {
85
- size: 1
86
- }, presenterName), /*#__PURE__*/_react.default.createElement(_ui.Text, {
87
- size: 0,
88
- style: {
89
- opacity: 0.7
90
- }
91
- }, presenterSubtitle)))))));
111
+ size: 1,
112
+ weight: "bold"
113
+ }, title), presenterSubtitle && /*#__PURE__*/_react.default.createElement(_ui.Text, {
114
+ size: 1,
115
+ muted: true
116
+ }, presenterSubtitle)))));
92
117
  }
93
118
 
94
119
  }
95
120
 
96
- _defineProperty(Tutorial, "propTypes", {
97
- title: _propTypes.default.string.isRequired,
98
- posterURL: _propTypes.default.string,
99
- href: _propTypes.default.string.isRequired,
100
- showPlayIcon: _propTypes.default.bool,
101
- presenterName: _propTypes.default.string.isRequired,
102
- presenterSubtitle: _propTypes.default.string.isRequired
103
- });
104
-
105
121
  _defineProperty(Tutorial, "defaultProps", {
106
122
  posterURL: null,
107
123
  showPlayIcon: false
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@sanity/dashboard",
3
- "version": "2.30.3-shopify.4+c6e043695",
3
+ "version": "2.30.4-dashboard-test.26+9e862be1b",
4
4
  "description": "Tool for rendering dashboard widgets",
5
- "main": "./lib/DashboardTool.js",
5
+ "main": "./lib/index.js",
6
6
  "types": "./dist/dts",
7
7
  "author": "Sanity.io <hello@sanity.io>",
8
8
  "license": "MIT",
@@ -22,13 +22,13 @@
22
22
  "dependencies": {
23
23
  "@sanity/icons": "^1.2.6",
24
24
  "@sanity/image-url": "^1.0.1",
25
- "@sanity/types": "2.30.3-shopify.4+c6e043695",
25
+ "@sanity/types": "2.30.4-dashboard-test.26+9e862be1b",
26
26
  "@sanity/ui": "^0.37.9",
27
27
  "lodash": "^4.17.15",
28
28
  "rxjs": "^6.5.3"
29
29
  },
30
30
  "devDependencies": {
31
- "@sanity/base": "2.30.3-shopify.4+c6e043695",
31
+ "@sanity/base": "2.30.4-dashboard-test.26+9e862be1b",
32
32
  "prop-types": "^15.6.0",
33
33
  "rimraf": "^2.7.1"
34
34
  },
@@ -47,5 +47,5 @@
47
47
  "url": "https://github.com/sanity-io/sanity/issues"
48
48
  },
49
49
  "homepage": "https://www.sanity.io/",
50
- "gitHead": "c6e04369504c2c4bb7d42c700ac3dba271cc0080"
50
+ "gitHead": "9e862be1ba9c86218d7640fdd4388c14fc693211"
51
51
  }