@fewangsit/wangsvue-fats 1.0.1-alpha.68 → 1.0.1-alpha.69

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 (78) hide show
  1. package/animation/index.es.js +9 -8
  2. package/assetinfo/index.d.ts +5 -4
  3. package/assetinfo/index.es.js +113 -97
  4. package/backgroundimagecropper/index.es.js +14 -12
  5. package/button/index.es.js +58 -48
  6. package/buttonbulkaction/index.es.js +67 -59
  7. package/buttondownload/index.es.js +18 -18
  8. package/buttonradio/index.es.js +11 -11
  9. package/buttonscan/index.es.js +1 -1
  10. package/buttonsearch/index.es.js +14 -14
  11. package/buttonselectuser/index.es.js +29 -29
  12. package/checkbox/index.es.js +5 -5
  13. package/config/defaultProps.es.js +3 -4
  14. package/datatable/index.es.js +470 -465
  15. package/datepicker/index.es.js +17 -17
  16. package/daypicker/index.es.js +21 -21
  17. package/dialog/index.es.js +17 -15
  18. package/dialogbasictransferlog/index.es.js +89 -89
  19. package/dialogconfirm/index.es.js +33 -33
  20. package/dialogdamagelog/index.es.js +89 -89
  21. package/dialogform/index.es.js +16 -16
  22. package/dialogfulltransferlog/index.es.js +96 -96
  23. package/dialoglinkedasset/index.es.js +48 -48
  24. package/dialogprintqr/index.es.js +70 -70
  25. package/dialogreportdamage/index.es.js +57 -57
  26. package/dialogreportmissing/index.es.js +94 -86
  27. package/dialogselecttree/index.es.js +18 -16
  28. package/dialogselectuser/index.es.js +16 -16
  29. package/directives/index.d.ts +1 -0
  30. package/directives/index.es.js +1 -0
  31. package/directives/safeHtml.d.ts +16 -0
  32. package/directives/safeHtml.es.js +12 -0
  33. package/disposalreport/index.es.js +1 -1
  34. package/disposalreportbulkaction/index.es.js +40 -41
  35. package/disposalreportdialogselectasset/index.es.js +72 -72
  36. package/disposalreporttable/index.es.js +108 -108
  37. package/disposalreporttablefilter/index.es.js +16 -17
  38. package/dropdown/index.es.js +120 -117
  39. package/fieldwrapper/index.es.js +7 -7
  40. package/fileupload/index.es.js +35 -31
  41. package/hardwaresync/index.es.js +12 -12
  42. package/headercell/index.es.js +4 -4
  43. package/icon/index.es.js +26 -25
  44. package/imagecompressor/index.es.js +143 -143
  45. package/imageinputinfo/index.es.js +13 -13
  46. package/inlinemessage/index.es.js +12 -12
  47. package/inputbadge/index.es.js +42 -43
  48. package/inputnumber/index.es.js +7 -7
  49. package/inputpassword/index.es.js +9 -9
  50. package/inputrangenumber/index.es.js +16 -16
  51. package/inputsearch/index.es.js +18 -18
  52. package/inputtext/index.es.js +33 -33
  53. package/litedropdown/index.es.js +48 -40
  54. package/menuitem/index.es.js +27 -26
  55. package/multirow/index.es.js +16 -16
  56. package/multiselect/index.es.js +86 -83
  57. package/package.json +1 -1
  58. package/plugins/basei18n.d.ts +2 -2
  59. package/plugins/basei18n.es.js +48 -42
  60. package/stats.html +1 -1
  61. package/style.css +1 -1
  62. package/tabmenu/index.es.js +14 -9
  63. package/tagtype/index.es.js +33 -30
  64. package/textarea/index.es.js +3 -3
  65. package/toggledarkmode/store/index.d.ts +7 -0
  66. package/toggleswitch/index.es.js +3 -3
  67. package/treesearchinput/index.es.js +11 -11
  68. package/username/index.es.js +39 -39
  69. package/utils/baseToast.util.es.js +23 -22
  70. package/utils/index.es.js +1 -2
  71. package/utils/textFormatter.util.d.ts +32 -0
  72. package/utils/textFormatter.util.es.js +38 -10
  73. package/validatormessage/index.es.js +1 -1
  74. package/vendor/dompurify/dist/purify.es.es.js +553 -0
  75. package/wangsvue-fats.d.ts +2 -1
  76. package/wangsvue-fats.es.js +190 -186
  77. package/wangsvue-fats.esm.browser.js +17750 -17086
  78. package/wangsvue-fats.system.js +73 -72
@@ -1,2 +1,3 @@
1
1
  export { default as Focus } from './focus';
2
2
  export { default as Tooltip } from './tooltip';
3
+ export { default as SafeHtml } from './safeHtml';
@@ -1,2 +1,3 @@
1
1
  import "vue";
2
2
  import "../vendor/primevue/tooltip/tooltip.esm.es.js";
3
+ import "../vendor/dompurify/dist/purify.es.es.js";
@@ -0,0 +1,16 @@
1
+ import type { DirectiveBinding } from 'vue';
2
+ /**
3
+ * V-safe-html directive
4
+ *
5
+ * Usage:
6
+ * <div v-safe-html="htmlString"></div>
7
+ *
8
+ * - Sanitizes HTML from the binding value
9
+ * - Prevents XSS
10
+ * - Only updates when the value actually changes
11
+ */
12
+ declare const SafeHtml: {
13
+ mounted: (el: HTMLElement, binding: DirectiveBinding<string>) => void;
14
+ updated: (el: HTMLElement, binding: DirectiveBinding<string>) => void;
15
+ };
16
+ export default SafeHtml;
@@ -0,0 +1,12 @@
1
+ import { p as t } from "../vendor/dompurify/dist/purify.es.es.js";
2
+ const l = {
3
+ mounted: (a, e) => {
4
+ a.innerHTML = t.sanitize(e.value ?? "");
5
+ },
6
+ updated: (a, e) => {
7
+ e.value !== e.oldValue && (a.innerHTML = t.sanitize(e.value ?? ""));
8
+ }
9
+ };
10
+ export {
11
+ l as S
12
+ };
@@ -1,7 +1,7 @@
1
1
  import { defineComponent as r, createBlock as a, openBlock as n, withCtx as p, createElementVNode as o, createVNode as i, toDisplayString as l, unref as e, normalizeProps as c, guardReactiveProps as m } from "vue";
2
2
  import { u as _ } from "../plugins/basei18n.es.js";
3
3
  import { a as f } from "../utils/role.util.es.js";
4
- import "../event-bus/index.es.js";
4
+ import "../utils/baseToast.util.es.js";
5
5
  import { _ as d } from "../card/index.es.js";
6
6
  import { _ as u } from "../disposalreporttable/index.es.js";
7
7
  const g = {
@@ -1,57 +1,55 @@
1
- import { defineComponent as _, ref as x, shallowRef as u, createElementBlock as h, openBlock as d, Fragment as w, createVNode as v, mergeProps as R, withCtx as k, createBlock as B, createCommentVNode as V, unref as l } from "vue";
2
- import { e as p } from "../event-bus/index.es.js";
3
- import { u as y } from "../plugins/basei18n.es.js";
4
- import { _ as A } from "../buttonbulkaction/index.es.js";
5
- import { _ as C } from "../dialogconfirm/index.es.js";
6
- import { _ as D } from "../textarea/index.es.js";
7
- const S = /* @__PURE__ */ _({
1
+ import { defineComponent as g, ref as N, shallowRef as s, createElementBlock as _, openBlock as i, Fragment as x, createVNode as u, mergeProps as w, withCtx as R, createBlock as k, createCommentVNode as B } from "vue";
2
+ import { e as d } from "../event-bus/index.es.js";
3
+ import { _ as V } from "../buttonbulkaction/index.es.js";
4
+ import { _ as h } from "../dialogconfirm/index.es.js";
5
+ import { _ as y } from "../textarea/index.es.js";
6
+ const U = /* @__PURE__ */ g({
8
7
  __name: "DisposalReportBulkAction",
9
8
  props: {
10
9
  tableName: {}
11
10
  },
12
11
  emits: ["noted", "removed"],
13
- setup(c, { emit: b }) {
14
- const { t: e } = y(), r = c, s = b, o = x([]), n = u(!1), m = u(), f = [
12
+ setup(v, { emit: p }) {
13
+ const m = v, n = p, a = N([]), l = s(!1), o = s(), c = [
15
14
  {
16
- label: e("Note"),
15
+ label: "Note",
17
16
  icon: "note",
18
17
  useAdditionSlot: !0,
19
18
  command: () => {
20
- s("noted", o.value, m.value), p.emit("data-table:clear-selected-data", {
21
- tableName: r.tableName
22
- }), m.value = void 0;
19
+ n("noted", a.value, o.value), d.emit("data-table:clear-selected-data", {
20
+ tableName: m.tableName
21
+ }), o.value = void 0;
23
22
  }
24
23
  },
25
24
  {
26
- label: e("Remove from List"),
25
+ label: "Remove from List",
27
26
  icon: "delete-bin",
28
27
  danger: !0,
29
28
  command: () => {
30
- n.value = !0;
29
+ l.value = !0;
31
30
  }
32
31
  }
33
- ], g = () => {
34
- s("removed", o.value), p.emit("data-table:clear-selected-data", {
35
- tableName: r.tableName
32
+ ], b = () => {
33
+ n("removed", a.value), d.emit("data-table:clear-selected-data", {
34
+ tableName: m.tableName
36
35
  });
37
36
  };
38
- return (i, t) => (d(), h(w, null, [
39
- v(A, R({
40
- "selected-data": o.value,
41
- "onUpdate:selectedData": t[1] || (t[1] = (a) => o.value = a)
42
- }, i.$attrs, {
43
- options: f,
44
- "table-name": i.tableName,
37
+ return (r, t) => (i(), _(x, null, [
38
+ u(V, w({
39
+ "selected-data": a.value,
40
+ "onUpdate:selectedData": t[1] || (t[1] = (e) => a.value = e)
41
+ }, r.$attrs, {
42
+ options: c,
43
+ "table-name": r.tableName,
45
44
  naming: "Asset(s)"
46
45
  }), {
47
- addition: k(({ selectedOption: a }) => [
48
- (a == null ? void 0 : a.label) === l(e)("Note") ? (d(), B(D, {
46
+ addition: R(({ selectedOption: e }) => [
47
+ (e == null ? void 0 : e.label) === "Note" ? (i(), k(y, {
49
48
  key: 0,
50
- modelValue: m.value,
51
- "onUpdate:modelValue": t[0] || (t[0] = (N) => m.value = N),
49
+ modelValue: o.value,
50
+ "onUpdate:modelValue": t[0] || (t[0] = (f) => o.value = f),
52
51
  "max-input": 30,
53
52
  maxlength: 30,
54
- placeholder: l(e)("Enter note"),
55
53
  rows: 1,
56
54
  "textarea-pt": {
57
55
  root: {
@@ -59,25 +57,26 @@ const S = /* @__PURE__ */ _({
59
57
  }
60
58
  },
61
59
  class: "!max-w-[250px]",
60
+ placeholder: "Enter note",
62
61
  "prevent-input-on-max-length": ""
63
- }, null, 8, ["modelValue", "placeholder"])) : V("", !0)
62
+ }, null, 8, ["modelValue"])) : B("", !0)
64
63
  ]),
65
64
  _: 1
66
65
  }, 16, ["selected-data", "table-name"]),
67
- v(C, {
68
- visible: n.value,
69
- "onUpdate:visible": t[2] || (t[2] = (a) => n.value = a),
70
- "confirm-label": l(e)("Remove"),
71
- header: l(e)("Remove from List"),
72
- list: o.value,
73
- message: l(e)("Are you sure you want to remove it?"),
74
- onConfirm: g,
66
+ u(h, {
67
+ visible: l.value,
68
+ "onUpdate:visible": t[2] || (t[2] = (e) => l.value = e),
69
+ list: a.value,
70
+ onConfirm: b,
71
+ "confirm-label": "Remove",
72
+ header: "Remove from List",
75
73
  "list-label": "name.nameWithSequence",
74
+ message: "Are you sure you want to remove it?",
76
75
  severity: "danger"
77
- }, null, 8, ["visible", "confirm-label", "header", "list", "message"])
76
+ }, null, 8, ["visible", "list"])
78
77
  ], 64));
79
78
  }
80
79
  });
81
80
  export {
82
- S as _
81
+ U as _
83
82
  };
@@ -1,23 +1,20 @@
1
- import { defineComponent as z, mergeModels as h, useModel as M, shallowRef as y, ref as T, computed as m, createBlock as J, openBlock as U, withCtx as g, createElementVNode as l, createVNode as n, withDirectives as j, vShow as R } from "vue";
2
- import { AssetServices as _ } from "@tagsamurai/fats-api-services";
3
- import { e as V } from "../event-bus/index.es.js";
1
+ import { defineComponent as M, mergeModels as h, useModel as T, shallowRef as y, ref as J, computed as m, createBlock as U, openBlock as j, withCtx as g, createElementVNode as l, createVNode as n, toDisplayString as _, withDirectives as R, vShow as V } from "vue";
2
+ import { AssetServices as O } from "@tagsamurai/fats-api-services";
3
+ import { e as E } from "../event-bus/index.es.js";
4
4
  import "../utils/role.util.es.js";
5
- import { u as E } from "../utils/toast.util.es.js";
5
+ import { u as G } from "../utils/toast.util.es.js";
6
6
  import { _ as f } from "../badge/index.es.js";
7
- import { _ as O } from "../button/index.es.js";
8
- import { _ as G } from "../buttonfilter/index.es.js";
9
- import { _ as P } from "../buttonsearch/index.es.js";
10
- import { D as q } from "../datatable/index.es.js";
11
- import { _ as H } from "../dialog/index.es.js";
12
- import { _ as K } from "../image/index.es.js";
13
- import { _ as L } from "../filtercontainer/index.es.js";
14
- const W = { class: "flex justify-between items-center" }, Y = {
7
+ import { _ as S } from "../button/index.es.js";
8
+ import { _ as P } from "../buttonfilter/index.es.js";
9
+ import { _ as q } from "../buttonsearch/index.es.js";
10
+ import { D as H } from "../datatable/index.es.js";
11
+ import { _ as K } from "../dialog/index.es.js";
12
+ import { _ as L } from "../image/index.es.js";
13
+ import { _ as W } from "../filtercontainer/index.es.js";
14
+ const Y = { class: "flex justify-between items-center" }, Q = {
15
15
  class: "flex gap-1 items-center justify-end",
16
16
  "data-ts-section": "button-group"
17
- }, Q = { class: "flex flex-col gap-1" }, X = {
18
- class: "text-xs text-red-600",
19
- "data-ts-section": "message-validator"
20
- }, Z = { class: "flex items-center justify-end gap-1" }, pe = /* @__PURE__ */ z({
17
+ }, X = { class: "flex flex-col gap-1" }, Z = { class: "flex items-center justify-end gap-1" }, pe = /* @__PURE__ */ M({
21
18
  __name: "DisposalReportDialogSelectAsset",
22
19
  props: /* @__PURE__ */ h({
23
20
  from: {},
@@ -33,16 +30,16 @@ const W = { class: "flex justify-between items-center" }, Y = {
33
30
  visibleModifiers: {}
34
31
  }),
35
32
  emits: /* @__PURE__ */ h(["select"], ["update:visible"]),
36
- setup(b, { emit: x }) {
37
- const s = b, S = x, c = M(b, "visible"), $ = E(), i = y("select-asset-table"), d = y(!1), r = T([]), F = m(() => [
33
+ setup(b, { emit: $ }) {
34
+ const s = b, x = $, c = T(b, "visible"), F = G(), i = y("select-asset-table"), d = y(!1), r = J([]), A = m(() => [
38
35
  {
39
36
  field: "assetImage",
40
37
  header: "Photo",
41
38
  style: "min-width: 72px",
42
- bodyComponent: (t) => ({
43
- component: K,
39
+ bodyComponent: (e) => ({
40
+ component: L,
44
41
  props: {
45
- src: t.assetImage ?? t.damageImage,
42
+ src: e.assetImage ?? e.damageImage,
46
43
  size: "small"
47
44
  }
48
45
  })
@@ -61,12 +58,12 @@ const W = { class: "flex justify-between items-center" }, Y = {
61
58
  field: `${o("brand")}.name`,
62
59
  header: "Brand",
63
60
  sortable: !0,
64
- bodyComponent: (t) => {
65
- var e;
61
+ bodyComponent: (e) => {
62
+ var t;
66
63
  return {
67
64
  component: f,
68
65
  props: {
69
- label: (e = t[o("brand")]) == null ? void 0 : e.name,
66
+ label: (t = e[o("brand")]) == null ? void 0 : t.name,
70
67
  severity: "dark"
71
68
  }
72
69
  };
@@ -76,12 +73,12 @@ const W = { class: "flex justify-between items-center" }, Y = {
76
73
  field: `${o("model")}.name`,
77
74
  header: "Model/Type",
78
75
  sortable: !0,
79
- bodyComponent: (t) => {
80
- var e;
76
+ bodyComponent: (e) => {
77
+ var t;
81
78
  return {
82
79
  component: f,
83
80
  props: {
84
- label: (e = t[o("model")]) == null ? void 0 : e.name,
81
+ label: (t = e[o("model")]) == null ? void 0 : t.name,
85
82
  severity: "dark"
86
83
  }
87
84
  };
@@ -91,17 +88,17 @@ const W = { class: "flex justify-between items-center" }, Y = {
91
88
  field: `${o("group")}.name`,
92
89
  header: "Group",
93
90
  sortable: !0,
94
- bodyComponent: (t) => {
95
- var e;
91
+ bodyComponent: (e) => {
92
+ var t;
96
93
  return {
97
94
  component: f,
98
95
  props: {
99
- label: (e = t[o("group")]) == null ? void 0 : e.name
96
+ label: (t = e[o("group")]) == null ? void 0 : t.name
100
97
  }
101
98
  };
102
99
  }
103
100
  }
104
- ]), A = m(() => [
101
+ ]), w = m(() => [
105
102
  {
106
103
  label: "Name",
107
104
  field: o("name"),
@@ -128,7 +125,7 @@ const W = { class: "flex justify-between items-center" }, Y = {
128
125
  field: o("group"),
129
126
  type: "group"
130
127
  }
131
- ]), w = m(() => {
128
+ ]), C = m(() => {
132
129
  switch (s.size) {
133
130
  case "large":
134
131
  return "1000px";
@@ -137,63 +134,66 @@ const W = { class: "flex justify-between items-center" }, Y = {
137
134
  default:
138
135
  return "800px";
139
136
  }
140
- }), C = m(() => s.header ?? "Select Asset"), o = (t) => s.from === "all" ? t : `asset${t.charAt(0).toUpperCase()}${t.slice(1)}`, u = (t) => s.from === "all" ? `${t}Options` : `asset${t.charAt(0).toUpperCase()}${t.slice(1)}Options`, p = async (t) => {
137
+ }), D = m(() => s.header ?? "Select Asset"), o = (e) => s.from === "all" ? e : `asset${e.charAt(0).toUpperCase()}${e.slice(1)}`, u = (e) => s.from === "all" ? `${e}Options` : `asset${e.charAt(0).toUpperCase()}${e.slice(1)}Options`, p = async (e) => {
141
138
  var v;
142
- const e = JSON.stringify(s.selectedAssets ?? []), a = {
143
- [t]: !0,
144
- excludeId: e,
139
+ const t = JSON.stringify(s.selectedAssets ?? []), a = {
140
+ [e]: !0,
141
+ excludeId: t,
145
142
  status: JSON.stringify(s.assetStatus ?? ["Available"])
146
- }, { data: B } = await _.getAllAssetsOptions(a);
147
- return ((v = B.data) == null ? void 0 : v[t]) ?? [];
148
- }, D = async (t) => {
149
- const e = JSON.stringify(s.selectedAssets ?? []);
143
+ }, { data: z } = await O.getAllAssetsOptions(a);
144
+ return ((v = z.data) == null ? void 0 : v[e]) ?? [];
145
+ }, N = async (e) => {
146
+ const t = JSON.stringify(s.selectedAssets ?? []);
150
147
  try {
151
- const { data: a } = await _.getAllAssets({
152
- excludeId: e,
148
+ const { data: a } = await O.getAllAssets({
149
+ excludeId: t,
153
150
  status: JSON.stringify(s.assetStatus ?? ["Available"]),
154
- ...t
151
+ ...e
155
152
  });
156
153
  return a;
157
154
  } catch (a) {
158
- console.error(a), $.add({
155
+ console.error(a), F.add({
159
156
  error: a,
160
157
  message: "Error, failed to get asset list."
161
158
  });
162
159
  }
163
- }, N = () => {
164
- r.value.length === 0 ? d.value = !0 : k();
165
160
  }, k = () => {
166
- S("select", r.value), d.value = !1, c.value = !1;
161
+ r.value.length === 0 ? d.value = !0 : I();
167
162
  }, I = () => {
168
- r.value = [], V.emit("data-table:clear-selected-data", {
163
+ x("select", r.value), d.value = !1, c.value = !1;
164
+ }, B = () => {
165
+ r.value = [], E.emit("data-table:clear-selected-data", {
169
166
  tableName: i.value
170
167
  });
171
168
  };
172
- return (t, e) => (U(), J(H, {
169
+ return (e, t) => (j(), U(K, {
173
170
  visible: c.value,
174
- "onUpdate:visible": e[3] || (e[3] = (a) => c.value = a),
175
- header: C.value,
176
- pt: { root: { style: { width: w.value } } },
177
- onHide: I,
171
+ "onUpdate:visible": t[3] || (t[3] = (a) => c.value = a),
172
+ header: D.value,
173
+ pt: { root: { style: { width: C.value } } },
174
+ onHide: B,
178
175
  closable: "",
179
176
  "data-ts-section": "dialogselectasset",
180
177
  modal: ""
181
178
  }, {
182
179
  footer: g(() => [
183
- l("div", Q, [
184
- j(l("small", X, " You must pick an asset ", 512), [
185
- [R, d.value]
180
+ l("div", X, [
181
+ R(l("small", {
182
+ class: "text-xs text-red-600",
183
+ "data-ts-section": "message-validator"
184
+ }, _(e.$t("You must pick an asset")), 513), [
185
+ [V, d.value]
186
186
  ]),
187
187
  l("div", Z, [
188
- n(O, {
189
- onClick: e[2] || (e[2] = (a) => c.value = !1),
188
+ n(S, {
189
+ onClick: t[2] || (t[2] = (a) => c.value = !1),
190
190
  "data-ts-section": "button-cancel",
191
191
  label: "Cancel",
192
192
  severity: "secondary",
193
193
  text: ""
194
194
  }),
195
- n(O, {
196
- onClick: N,
195
+ n(S, {
196
+ onClick: k,
197
197
  "data-ts-section": "button-select",
198
198
  label: "Select",
199
199
  severity: "success"
@@ -202,26 +202,26 @@ const W = { class: "flex justify-between items-center" }, Y = {
202
202
  ])
203
203
  ]),
204
204
  default: g(() => [
205
- l("div", W, [
206
- e[4] || (e[4] = l("span", null, "Select asset(s) to be disposed.", -1)),
207
- l("div", Y, [
208
- n(P, { "table-name": i.value }, null, 8, ["table-name"]),
209
- n(G, { "table-name": i.value }, null, 8, ["table-name"])
205
+ l("div", Y, [
206
+ l("span", null, _(e.$t("Select asset(s) to be disposed.")), 1),
207
+ l("div", Q, [
208
+ n(q, { "table-name": i.value }, null, 8, ["table-name"]),
209
+ n(P, { "table-name": i.value }, null, 8, ["table-name"])
210
210
  ])
211
211
  ]),
212
- n(L, {
213
- fields: A.value,
212
+ n(W, {
213
+ fields: w.value,
214
214
  "table-name": i.value
215
215
  }, null, 8, ["fields", "table-name"]),
216
- n(q, {
216
+ n(H, {
217
217
  "selected-data": r.value,
218
- "onUpdate:selectedData": e[0] || (e[0] = (a) => r.value = a),
219
- columns: F.value,
220
- "fetch-function": s.fetchFunction ?? D,
218
+ "onUpdate:selectedData": t[0] || (t[0] = (a) => r.value = a),
219
+ columns: A.value,
220
+ "fetch-function": s.fetchFunction ?? N,
221
221
  rows: 10,
222
222
  "table-name": i.value,
223
223
  "use-option": !1,
224
- onRowSelect: e[1] || (e[1] = (a) => d.value = !1),
224
+ onRowSelect: t[1] || (t[1] = (a) => d.value = !1),
225
225
  "data-key": "_id",
226
226
  "data-ts-section": "dialog-select-asset-table",
227
227
  lazy: "",