@appbaseio/reactivesearch-vue 2.0.0-alpha.4 → 3.0.0-alpha.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 (109) hide show
  1. package/README.md +9 -9
  2. package/dist/@appbaseio/reactivesearch-vue.umd.js +21316 -29369
  3. package/dist/@appbaseio/reactivesearch-vue.umd.js.map +1 -1
  4. package/dist/@appbaseio/reactivesearch-vue.umd.min.js +5 -19
  5. package/dist/@appbaseio/reactivesearch-vue.umd.min.js.map +1 -1
  6. package/dist/cjs/Button-ad042719.js +59 -0
  7. package/dist/cjs/Card-f5ab024a.js +27 -0
  8. package/dist/cjs/{ComponentWrapper-ad3dad02.js → ComponentWrapper-611cf7f9.js} +44 -58
  9. package/dist/cjs/Container-29f049b2.js +12 -0
  10. package/dist/cjs/DropDown-dc184468.js +700 -0
  11. package/dist/cjs/DynamicRangeSlider.js +106 -157
  12. package/dist/cjs/Flex-d5675ea6.js +48 -0
  13. package/dist/cjs/FormControlList-fadd792f.js +42 -0
  14. package/dist/cjs/Input-088dfcb4.js +74 -0
  15. package/dist/cjs/ListItem-d57d648d.js +42 -0
  16. package/dist/cjs/MultiDropdownList.js +124 -240
  17. package/dist/cjs/MultiList.js +124 -262
  18. package/dist/cjs/MultiRange.js +87 -133
  19. package/dist/cjs/{Pagination-71e85fa9.js → Pagination-b5ddc906.js} +70 -83
  20. package/dist/cjs/PreferencesConsumer-22d1b49f.js +73 -0
  21. package/dist/cjs/RangeInput.js +163 -171
  22. package/dist/cjs/RangeSlider.js +81 -109
  23. package/dist/cjs/ReactiveBase.js +139 -156
  24. package/dist/cjs/ReactiveComponent-a6108189.js +2184 -0
  25. package/dist/cjs/ReactiveComponent.js +46 -340
  26. package/dist/cjs/ReactiveGoogleMap.js +451 -660
  27. package/dist/cjs/ReactiveList.js +180 -305
  28. package/dist/cjs/ResultCard.js +36 -36
  29. package/dist/cjs/ResultList.js +48 -56
  30. package/dist/cjs/SelectedFilters.js +62 -69
  31. package/dist/cjs/SingleDropdownList.js +117 -177
  32. package/dist/cjs/SingleList.js +122 -206
  33. package/dist/cjs/SingleRange.js +78 -105
  34. package/dist/cjs/StateProvider.js +35 -38
  35. package/dist/cjs/Title-8802a218.js +12 -0
  36. package/dist/cjs/ToggleButton.js +72 -119
  37. package/dist/cjs/{_rollupPluginBabelHelpers-c705cbe6.js → _rollupPluginBabelHelpers-f8b843f8.js} +0 -15
  38. package/dist/cjs/{index-6a167fe0.js → index-d8d8f291.js} +38 -108
  39. package/dist/cjs/index.js +44 -41
  40. package/dist/cjs/initReactivesearch.js +63 -150
  41. package/dist/cjs/install.js +47 -43
  42. package/dist/cjs/ssr-6c8a72e1.js +66 -0
  43. package/dist/cjs/{utils-d6a52588.js → utils-83fd01e9.js} +7 -16
  44. package/dist/cjs/version.js +1 -1
  45. package/dist/cjs/{vueTypes-727b7c63.js → vueTypes-1bf00978.js} +8 -19
  46. package/dist/es/Button-474510e3.js +53 -0
  47. package/dist/es/{Card-450683f1.js → Card-38cbe652.js} +3 -3
  48. package/dist/es/{ComponentWrapper-424e86fd.js → ComponentWrapper-3dfe6931.js} +44 -58
  49. package/dist/es/{Container-ba826e96.js → Container-d00219f7.js} +2 -2
  50. package/dist/es/DropDown-029ffd42.js +690 -0
  51. package/dist/es/DynamicRangeSlider.js +106 -157
  52. package/dist/es/Flex-a08e22d7.js +46 -0
  53. package/dist/es/FormControlList-fe6eaee4.js +38 -0
  54. package/dist/es/Input-ad474a55.js +69 -0
  55. package/dist/es/{ListItem-cad14c5e.js → ListItem-16756c02.js} +7 -8
  56. package/dist/es/MultiDropdownList.js +124 -240
  57. package/dist/es/MultiList.js +124 -262
  58. package/dist/es/MultiRange.js +87 -133
  59. package/dist/es/{Pagination-784bf143.js → Pagination-72bd1d9e.js} +70 -83
  60. package/dist/es/PreferencesConsumer-24e88f3b.js +71 -0
  61. package/dist/es/RangeInput.js +163 -170
  62. package/dist/es/RangeSlider.js +81 -109
  63. package/dist/es/ReactiveBase.js +138 -154
  64. package/dist/es/ReactiveComponent-0a97eb1e.js +2178 -0
  65. package/dist/es/ReactiveComponent.js +42 -337
  66. package/dist/es/ReactiveGoogleMap.js +446 -654
  67. package/dist/es/ReactiveList.js +178 -302
  68. package/dist/es/ResultCard.js +36 -36
  69. package/dist/es/ResultList.js +48 -56
  70. package/dist/es/SelectedFilters.js +62 -69
  71. package/dist/es/SingleDropdownList.js +117 -177
  72. package/dist/es/SingleList.js +122 -206
  73. package/dist/es/SingleRange.js +78 -105
  74. package/dist/es/StateProvider.js +36 -39
  75. package/dist/es/{Title-3342664a.js → Title-863dfa42.js} +2 -2
  76. package/dist/es/ToggleButton.js +72 -119
  77. package/dist/es/{_rollupPluginBabelHelpers-76660dab.js → _rollupPluginBabelHelpers-ded08042.js} +0 -15
  78. package/dist/es/{index-7788a843.js → index-4520a598.js} +39 -107
  79. package/dist/es/index.js +30 -32
  80. package/dist/es/initReactivesearch.js +63 -150
  81. package/dist/es/install.js +49 -41
  82. package/dist/es/{ssr-b2c0b401.js → ssr-584c278d.js} +37 -8
  83. package/dist/es/{utils-9e68acee.js → utils-9e5a16a1.js} +7 -16
  84. package/dist/es/version.js +1 -1
  85. package/dist/es/{vueTypes-b8146772.js → vueTypes-f1923c72.js} +8 -19
  86. package/package.json +10 -9
  87. package/dist/cjs/Button-446f819e.js +0 -68
  88. package/dist/cjs/CancelSvg-9f258f4f.js +0 -449
  89. package/dist/cjs/Card-642547a8.js +0 -30
  90. package/dist/cjs/Container-daf30918.js +0 -15
  91. package/dist/cjs/DataSearch-aa04dc6e.js +0 -2352
  92. package/dist/cjs/DataSearch.js +0 -30
  93. package/dist/cjs/DropDown-c479bbb0.js +0 -328
  94. package/dist/cjs/Flex-aa517a13.js +0 -52
  95. package/dist/cjs/FormControlList-c195a592.js +0 -47
  96. package/dist/cjs/Input-e6603a7e.js +0 -79
  97. package/dist/cjs/ListItem-8c9e0d68.js +0 -46
  98. package/dist/cjs/Title-1de7d0f4.js +0 -15
  99. package/dist/cjs/install-b97dbac4.js +0 -1409
  100. package/dist/cjs/ssr-3027b848.js +0 -39
  101. package/dist/es/Button-d8bc15ea.js +0 -59
  102. package/dist/es/CancelSvg-4cfae5fd.js +0 -440
  103. package/dist/es/DataSearch-b86a6675.js +0 -2337
  104. package/dist/es/DataSearch.js +0 -22
  105. package/dist/es/DropDown-05a644a5.js +0 -322
  106. package/dist/es/Flex-1f0795c3.js +0 -47
  107. package/dist/es/FormControlList-c22d64f6.js +0 -40
  108. package/dist/es/Input-7a2a9fac.js +0 -71
  109. package/dist/es/install-ac8a1edb.js +0 -1402
@@ -6,29 +6,31 @@ function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'defau
6
6
 
7
7
  var configureStore = require('@appbaseio/reactivecore');
8
8
  var configureStore__default = _interopDefault(configureStore);
9
- require('./_rollupPluginBabelHelpers-c705cbe6.js');
10
- var VueTypes = _interopDefault(require('vue-types'));
11
9
  var constants = require('@appbaseio/reactivecore/lib/utils/constants');
12
- require('emotion');
10
+ require('./_rollupPluginBabelHelpers-f8b843f8.js');
11
+ var vue = require('vue');
12
+ var VueTypes = _interopDefault(require('vue-types'));
13
13
  require('@appbaseio/vue-emotion');
14
+ require('emotion');
14
15
  require('polished');
15
- var Button = require('./Button-446f819e.js');
16
- var vueTypes = require('./vueTypes-727b7c63.js');
16
+ var Button = require('./Button-ad042719.js');
17
+ var vueTypes = require('./vueTypes-1bf00978.js');
17
18
  require('@appbaseio/reactivecore/lib/utils/transform');
18
19
  require('redux');
19
- var index = require('./index-6a167fe0.js');
20
- var ComponentWrapper = require('./ComponentWrapper-ad3dad02.js');
21
- var Title = require('./Title-1de7d0f4.js');
22
- var Container = require('./Container-daf30918.js');
20
+ var index = require('./index-d8d8f291.js');
21
+ var ComponentWrapper = require('./ComponentWrapper-611cf7f9.js');
22
+ var PreferencesConsumer = require('./PreferencesConsumer-22d1b49f.js');
23
+ var Title = require('./Title-8802a218.js');
24
+ var Container = require('./Container-29f049b2.js');
23
25
 
24
26
  var updateQuery = configureStore.Actions.updateQuery,
25
- setQueryOptions = configureStore.Actions.setQueryOptions,
26
- setCustomQuery = configureStore.Actions.setCustomQuery;
27
+ setQueryOptions = configureStore.Actions.setQueryOptions,
28
+ setCustomQuery = configureStore.Actions.setCustomQuery;
27
29
  var isEqual = configureStore.helper.isEqual,
28
- checkValueChange = configureStore.helper.checkValueChange,
29
- getClassName = configureStore.helper.getClassName,
30
- getOptionsFromQuery = configureStore.helper.getOptionsFromQuery,
31
- handleA11yAction = configureStore.helper.handleA11yAction;
30
+ checkValueChange = configureStore.helper.checkValueChange,
31
+ getClassName = configureStore.helper.getClassName,
32
+ getOptionsFromQuery = configureStore.helper.getOptionsFromQuery,
33
+ handleA11yAction = configureStore.helper.handleA11yAction;
32
34
  var ToggleButton = {
33
35
  name: 'ToggleButton',
34
36
  props: {
@@ -63,17 +65,12 @@ var ToggleButton = {
63
65
  var value = this.selectedValue || props.value || props.defaultValue || [];
64
66
  var currentValue = ToggleButton.parseValue(value, props);
65
67
  this.setValue(currentValue);
66
-
67
68
  if (this.$data.currentValue.length) {
68
69
  this.handleToggle(this.$data.currentValue, true, props, hasMounted);
69
70
  }
70
71
  },
71
72
  created: function created() {
72
- if (!this.enableAppbase && this.$props.index) {
73
- console.warn('Warning(ReactiveSearch): In order to use the `index` prop, the `enableAppbase` prop must be set to true in `ReactiveBase`.');
74
- } // Set custom query in store
75
-
76
-
73
+ // Set custom query in store
77
74
  index.updateCustomQuery(this.componentId, this.setCustomQuery, this.$props, this.currentValue);
78
75
  },
79
76
  watch: {
@@ -100,7 +97,6 @@ var ToggleButton = {
100
97
  } else {
101
98
  // else selectedValue will be a string
102
99
  var currentValue = this.$data.currentValue[0] ? this.$data.currentValue[0].value : null;
103
-
104
100
  if (!isEqual(currentValue, this.selectedValue) && !isEqual(oldVal, this.selectedValue)) {
105
101
  this.handleToggle(this.selectedValue || [], true, this.$props);
106
102
  }
@@ -117,19 +113,15 @@ var ToggleButton = {
117
113
  if (isDefaultValue === void 0) {
118
114
  isDefaultValue = false;
119
115
  }
120
-
121
116
  if (props === void 0) {
122
117
  props = this.$props;
123
118
  }
124
-
125
119
  if (hasMounted === void 0) {
126
120
  hasMounted = true;
127
121
  }
128
-
129
122
  var currentValue = this.$data.currentValue;
130
123
  var toggleValue = value;
131
124
  var finalValue = [];
132
-
133
125
  if (isDefaultValue) {
134
126
  finalValue = ToggleButton.parseValue(toggleValue, props);
135
127
  } else if (this.$props.multiSelect) {
@@ -143,7 +135,6 @@ var ToggleButton = {
143
135
  return item.value === toggleValue.value;
144
136
  }) ? [] : [toggleValue];
145
137
  }
146
-
147
138
  this.setValue(finalValue, props, hasMounted);
148
139
  },
149
140
  setReact: function setReact(props) {
@@ -153,24 +144,18 @@ var ToggleButton = {
153
144
  },
154
145
  setValue: function setValue(value, props, hasMounted) {
155
146
  var _this = this;
156
-
157
147
  if (props === void 0) {
158
148
  props = this.$props;
159
149
  }
160
-
161
150
  if (hasMounted === void 0) {
162
151
  hasMounted = true;
163
152
  }
164
-
165
153
  var performUpdate = function performUpdate() {
166
154
  var handleUpdates = function handleUpdates() {
167
155
  _this.updateQuery(value, props);
168
-
169
156
  _this.$emit('valueChange', value);
170
-
171
157
  _this.$emit('value-change', value);
172
158
  };
173
-
174
159
  if (hasMounted) {
175
160
  _this.currentValue = value;
176
161
  handleUpdates();
@@ -178,27 +163,21 @@ var ToggleButton = {
178
163
  handleUpdates();
179
164
  }
180
165
  };
181
-
182
166
  checkValueChange(props.componentId, props.multiSelect ? value : value[0], props.beforeValueChange, performUpdate);
183
167
  },
184
168
  updateQuery: function updateQuery(value, props) {
185
169
  var filterValue = value;
186
-
187
170
  if (!props.multiSelect) {
188
171
  filterValue = value[0] ? value[0].value : null;
189
172
  }
190
-
191
173
  var customQuery = props.customQuery;
192
174
  var query = ToggleButton.defaultQuery(value, props);
193
-
194
175
  if (customQuery) {
195
176
  var _ref = customQuery(value, props) || {};
196
-
197
177
  query = _ref.query;
198
178
  this.setQueryOptions(props.componentId, getOptionsFromQuery(customQuery(value, props)), false);
199
179
  index.updateCustomQuery(props.componentId, this.setCustomQuery, props, value);
200
180
  }
201
-
202
181
  this.updateQueryHandler({
203
182
  componentId: props.componentId,
204
183
  query: query,
@@ -212,30 +191,24 @@ var ToggleButton = {
212
191
  },
213
192
  handleClick: function handleClick(item) {
214
193
  var _this$$props = this.$props,
215
- enableStrictSelection = _this$$props.enableStrictSelection,
216
- multiSelect = _this$$props.multiSelect;
217
-
194
+ enableStrictSelection = _this$$props.enableStrictSelection,
195
+ multiSelect = _this$$props.multiSelect;
218
196
  if (enableStrictSelection && !multiSelect && this.$data.currentValue.find(function (stateItem) {
219
197
  return isEqual(item, stateItem);
220
198
  })) {
221
199
  return false;
222
200
  }
223
-
224
201
  var value = this.$props.value;
225
-
226
202
  if (value === undefined) {
227
203
  this.handleToggle(item);
228
204
  } else {
229
205
  this.$emit('change', item.value);
230
206
  }
231
-
232
207
  return true;
233
208
  },
234
209
  renderButton: function renderButton(item) {
235
210
  var _this2 = this;
236
-
237
- var h = this.$createElement;
238
- var renderItem = this.$scopedSlots.renderItem || this.renderItem;
211
+ var renderItem = this.$slots.renderItem || this.renderItem;
239
212
  var isSelected = this.$data.currentValue.some(function (value) {
240
213
  return value.value === item.value;
241
214
  });
@@ -245,41 +218,46 @@ var ToggleButton = {
245
218
  handleClick: function handleClick() {
246
219
  return _this2.handleClick(item);
247
220
  }
248
- }) : h(Button.Button, {
221
+ }) : vue.createVNode(Button.Button, {
249
222
  "class": getClassName(this.$props.innerClass, 'button') + " " + (isSelected ? 'active' : ''),
250
- "on": {
251
- "click": function click() {
252
- return _this2.handleClick(item);
253
- },
254
- "keypress": function keypress(e) {
255
- return handleA11yAction(e, function () {
256
- return _this2.handleClick(item);
257
- });
258
- }
223
+ "onClick": function onClick() {
224
+ return _this2.handleClick(item);
259
225
  },
260
226
  "key": item.value,
261
- "attrs": {
262
- "primary": isSelected,
263
- "large": true,
264
- "tabIndex": isSelected ? '-1' : '0'
227
+ "primary": isSelected,
228
+ "large": true,
229
+ "tabIndex": isSelected ? '-1' : '0',
230
+ "onKeypress": function onKeypress(e) {
231
+ return handleA11yAction(e, function () {
232
+ return _this2.handleClick(item);
233
+ });
265
234
  }
266
- }, [item.label]);
235
+ }, {
236
+ "default": function _default() {
237
+ return [item.label];
238
+ }
239
+ });
267
240
  }
268
241
  },
269
242
  render: function render() {
270
243
  var _this3 = this;
271
-
272
- var h = arguments[0];
273
- return h(Container.Container, {
244
+ return vue.createVNode(Container.Container, {
274
245
  "class": Button.toggleButtons
275
- }, [this.$props.title && h(Title.Title, {
276
- "class": getClassName(this.$props.innerClass, 'title')
277
- }, [this.$props.title]), this.$props.data.map(function (item) {
278
- return _this3.renderButton(item);
279
- })]);
246
+ }, {
247
+ "default": function _default() {
248
+ return [_this3.$props.title && vue.createVNode(Title.Title, {
249
+ "class": getClassName(_this3.$props.innerClass, 'title')
250
+ }, {
251
+ "default": function _default() {
252
+ return [_this3.$props.title];
253
+ }
254
+ }), _this3.$props.data.map(function (item) {
255
+ return _this3.renderButton(item);
256
+ })];
257
+ }
258
+ });
280
259
  }
281
260
  };
282
-
283
261
  ToggleButton.parseValue = function (value, props) {
284
262
  if (Array.isArray(value)) {
285
263
  if (typeof value[0] === 'string') {
@@ -287,70 +265,45 @@ ToggleButton.parseValue = function (value, props) {
287
265
  return value.includes(item.value);
288
266
  });
289
267
  }
290
-
291
268
  return value;
292
269
  }
293
-
294
270
  return props.data.filter(function (item) {
295
271
  return item.value === value;
296
272
  });
297
273
  };
298
-
299
274
  ToggleButton.defaultQuery = function (value, props) {
300
- var query = null;
301
-
302
- if (value && value.length) {
303
- query = {
304
- bool: {
305
- boost: 1.0,
306
- minimum_should_match: 1,
307
- should: value.map(function (item) {
308
- var _term;
309
-
310
- return {
311
- term: (_term = {}, _term[props.dataField] = item.value, _term)
312
- };
313
- })
314
- }
315
- };
316
- }
317
-
318
- if (query && props.nestedField) {
319
- return {
320
- query: {
321
- nested: {
322
- path: props.nestedField,
323
- query: query
324
- }
325
- }
326
- };
327
- }
328
-
329
- return query;
275
+ return {
276
+ query: {
277
+ queryFormat: props.queryFormat,
278
+ dataField: props.dataField,
279
+ value: value,
280
+ nestedField: props.nestedField,
281
+ selectAllLabel: props.selectAllLabel,
282
+ showMissing: props.showMissing,
283
+ multiSelect: props.multiSelect
284
+ }
285
+ };
330
286
  };
331
-
332
287
  var mapStateToProps = function mapStateToProps(state, props) {
333
288
  return {
334
289
  selectedValue: state.selectedValues[props.componentId] && state.selectedValues[props.componentId].value || null,
335
- componentProps: state.props[props.componentId],
336
- enableAppbase: state.config.enableAppbase
290
+ componentProps: state.props[props.componentId]
337
291
  };
338
292
  };
339
-
340
293
  var mapDispatchtoProps = {
341
294
  updateQueryHandler: updateQuery,
342
295
  setQueryOptions: setQueryOptions,
343
296
  setCustomQuery: setCustomQuery
344
297
  };
345
- var RcConnected = ComponentWrapper.ComponentWrapper(index.connect(mapStateToProps, mapDispatchtoProps)(ToggleButton), {
298
+ var TBConnected = PreferencesConsumer.PreferencesConsumer(ComponentWrapper.ComponentWrapper(index.connect(mapStateToProps, mapDispatchtoProps)(ToggleButton), {
346
299
  componentType: constants.componentTypes.toggleButton
347
- });
348
-
349
- ToggleButton.install = function (Vue) {
350
- Vue.component(ToggleButton.name, RcConnected);
351
- }; // Add componentType for SSR
352
-
353
-
354
- ToggleButton.componentType = constants.componentTypes.toggleButton;
300
+ }));
301
+ TBConnected.name = ToggleButton.name;
302
+ TBConnected.install = function (Vue) {
303
+ Vue.component(TBConnected.name, TBConnected);
304
+ };
305
+ // Add componentType for SSR
306
+ TBConnected.componentType = constants.componentTypes.toggleButton;
355
307
 
356
- exports.default = ToggleButton;
308
+ exports.TBConnected = TBConnected;
309
+ exports.default = TBConnected;
@@ -4,26 +4,21 @@ function _extends() {
4
4
  _extends = Object.assign ? Object.assign.bind() : function (target) {
5
5
  for (var i = 1; i < arguments.length; i++) {
6
6
  var source = arguments[i];
7
-
8
7
  for (var key in source) {
9
8
  if (Object.prototype.hasOwnProperty.call(source, key)) {
10
9
  target[key] = source[key];
11
10
  }
12
11
  }
13
12
  }
14
-
15
13
  return target;
16
14
  };
17
15
  return _extends.apply(this, arguments);
18
16
  }
19
-
20
17
  function _inheritsLoose(subClass, superClass) {
21
18
  subClass.prototype = Object.create(superClass.prototype);
22
19
  subClass.prototype.constructor = subClass;
23
-
24
20
  _setPrototypeOf(subClass, superClass);
25
21
  }
26
-
27
22
  function _setPrototypeOf(o, p) {
28
23
  _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
29
24
  o.__proto__ = p;
@@ -31,47 +26,37 @@ function _setPrototypeOf(o, p) {
31
26
  };
32
27
  return _setPrototypeOf(o, p);
33
28
  }
34
-
35
29
  function _objectWithoutPropertiesLoose(source, excluded) {
36
30
  if (source == null) return {};
37
31
  var target = {};
38
32
  var sourceKeys = Object.keys(source);
39
33
  var key, i;
40
-
41
34
  for (i = 0; i < sourceKeys.length; i++) {
42
35
  key = sourceKeys[i];
43
36
  if (excluded.indexOf(key) >= 0) continue;
44
37
  target[key] = source[key];
45
38
  }
46
-
47
39
  return target;
48
40
  }
49
-
50
41
  function _taggedTemplateLiteralLoose(strings, raw) {
51
42
  if (!raw) {
52
43
  raw = strings.slice(0);
53
44
  }
54
-
55
45
  strings.raw = raw;
56
46
  return strings;
57
47
  }
58
-
59
48
  function _toPrimitive(input, hint) {
60
49
  if (typeof input !== "object" || input === null) return input;
61
50
  var prim = input[Symbol.toPrimitive];
62
-
63
51
  if (prim !== undefined) {
64
52
  var res = prim.call(input, hint || "default");
65
53
  if (typeof res !== "object") return res;
66
54
  throw new TypeError("@@toPrimitive must return a primitive value.");
67
55
  }
68
-
69
56
  return (hint === "string" ? String : Number)(input);
70
57
  }
71
-
72
58
  function _toPropertyKey(arg) {
73
59
  var key = _toPrimitive(arg, "string");
74
-
75
60
  return typeof key === "symbol" ? key : String(key);
76
61
  }
77
62