@1money/component-ui 0.0.68 → 0.0.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 (57) hide show
  1. package/es/components/ProForm/interface.d.ts +3 -1
  2. package/es/components/ProForm/layouts/QueryFilter.js +5 -1
  3. package/es/components/ProTable/ProTable.d.ts +5 -0
  4. package/es/components/ProTable/ProTable.js +309 -0
  5. package/es/components/ProTable/constants.d.ts +12 -0
  6. package/es/components/ProTable/constants.js +12 -0
  7. package/es/components/ProTable/core/genColumns.d.ts +10 -0
  8. package/es/components/ProTable/core/genColumns.js +81 -0
  9. package/es/components/ProTable/core/genSearchFields.d.ts +19 -0
  10. package/es/components/ProTable/core/genSearchFields.js +103 -0
  11. package/es/components/ProTable/core/useAwaitableReload.d.ts +17 -0
  12. package/es/components/ProTable/core/useAwaitableReload.js +39 -0
  13. package/es/components/ProTable/core/utils.d.ts +12 -0
  14. package/es/components/ProTable/core/utils.js +21 -0
  15. package/es/components/ProTable/index.d.ts +4 -0
  16. package/es/components/ProTable/index.js +5 -0
  17. package/es/components/ProTable/interface.d.ts +132 -0
  18. package/es/components/ProTable/interface.js +2 -0
  19. package/es/components/ProTable/style/ProTable.css +47 -0
  20. package/es/components/ProTable/style/css.js +6 -0
  21. package/es/components/ProTable/style/index.d.ts +5 -0
  22. package/es/components/ProTable/style/index.js +6 -0
  23. package/es/components/ProTable/useFetchData.d.ts +48 -0
  24. package/es/components/ProTable/useFetchData.js +270 -0
  25. package/es/index.css +1 -1
  26. package/es/index.d.ts +2 -0
  27. package/es/index.js +2 -1
  28. package/lib/components/ProForm/interface.d.ts +3 -1
  29. package/lib/components/ProForm/layouts/QueryFilter.js +5 -1
  30. package/lib/components/ProTable/ProTable.d.ts +5 -0
  31. package/lib/components/ProTable/ProTable.js +316 -0
  32. package/lib/components/ProTable/constants.d.ts +12 -0
  33. package/lib/components/ProTable/constants.js +18 -0
  34. package/lib/components/ProTable/core/genColumns.d.ts +10 -0
  35. package/lib/components/ProTable/core/genColumns.js +87 -0
  36. package/lib/components/ProTable/core/genSearchFields.d.ts +19 -0
  37. package/lib/components/ProTable/core/genSearchFields.js +111 -0
  38. package/lib/components/ProTable/core/useAwaitableReload.d.ts +17 -0
  39. package/lib/components/ProTable/core/useAwaitableReload.js +46 -0
  40. package/lib/components/ProTable/core/utils.d.ts +12 -0
  41. package/lib/components/ProTable/core/utils.js +28 -0
  42. package/lib/components/ProTable/index.d.ts +4 -0
  43. package/lib/components/ProTable/index.js +33 -0
  44. package/lib/components/ProTable/interface.d.ts +132 -0
  45. package/lib/components/ProTable/interface.js +6 -0
  46. package/lib/components/ProTable/style/ProTable.css +47 -0
  47. package/lib/components/ProTable/style/css.js +8 -0
  48. package/lib/components/ProTable/style/index.d.ts +5 -0
  49. package/lib/components/ProTable/style/index.js +8 -0
  50. package/lib/components/ProTable/useFetchData.d.ts +48 -0
  51. package/lib/components/ProTable/useFetchData.js +277 -0
  52. package/lib/index.css +1 -1
  53. package/lib/index.d.ts +2 -0
  54. package/lib/index.js +8 -1
  55. package/package.json +6 -1
  56. package/scripts/mcp-server/examples.generated.json +156 -0
  57. package/scripts/mcp-server/index.generated.json +733 -1
@@ -0,0 +1,270 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
3
+ var __awaiter = this && this.__awaiter || function (thisArg, _arguments, P, generator) {
4
+ function adopt(value) {
5
+ return value instanceof P ? value : new P(function (resolve) {
6
+ resolve(value);
7
+ });
8
+ }
9
+ return new (P || (P = Promise))(function (resolve, reject) {
10
+ function fulfilled(value) {
11
+ try {
12
+ step(generator.next(value));
13
+ } catch (e) {
14
+ reject(e);
15
+ }
16
+ }
17
+ function rejected(value) {
18
+ try {
19
+ step(generator["throw"](value));
20
+ } catch (e) {
21
+ reject(e);
22
+ }
23
+ }
24
+ function step(result) {
25
+ result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
26
+ }
27
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
28
+ });
29
+ };
30
+ import { useEffect, useRef } from 'react';
31
+ import { useLatest, useMemoizedFn, useSafeState } from '@1money/hooks';
32
+ import { useAwaitableReload } from './core/useAwaitableReload';
33
+ /**
34
+ * Owns the request lifecycle for ProTable: data, loading, and pagination.
35
+ *
36
+ * One effect is the single fetch path. It reads its query inputs from the
37
+ * **render closure** (never a lagging ref), so every state change — search,
38
+ * sort, filter, params, page — refetches with correct values. An awaitable
39
+ * reload signal lets imperative callers force the same effect and `await` it.
40
+ *
41
+ * `runRequest` aborts the previous in-flight request (`AbortController`, exposed
42
+ * to `request` as `{ signal }`), tags itself with a request id, and drops stale
43
+ * or aborted responses.
44
+ */
45
+ export function useFetchData(options) {
46
+ var _this = this;
47
+ var request = options.request,
48
+ manual = options.manual,
49
+ manualRequest = options.manualRequest,
50
+ debounceTime = options.debounceTime,
51
+ postData = options.postData,
52
+ polling = options.polling,
53
+ params = options.params,
54
+ defaultData = options.defaultData,
55
+ paginated = options.paginated,
56
+ defaultCurrent = options.defaultCurrent,
57
+ defaultPageSize = options.defaultPageSize,
58
+ searchParams = options.searchParams,
59
+ sort = options.sort,
60
+ filter = options.filter,
61
+ onLoad = options.onLoad,
62
+ onLoadingChange = options.onLoadingChange,
63
+ onRequestError = options.onRequestError;
64
+ var _useSafeState = useSafeState(defaultData !== null && defaultData !== void 0 ? defaultData : []),
65
+ _useSafeState2 = _slicedToArray(_useSafeState, 2),
66
+ dataSource = _useSafeState2[0],
67
+ setDataSource = _useSafeState2[1];
68
+ var _useSafeState3 = useSafeState(false),
69
+ _useSafeState4 = _slicedToArray(_useSafeState3, 2),
70
+ loading = _useSafeState4[0],
71
+ setLoadingState = _useSafeState4[1];
72
+ var _useSafeState5 = useSafeState({
73
+ current: defaultCurrent,
74
+ pageSize: defaultPageSize,
75
+ total: 0
76
+ }),
77
+ _useSafeState6 = _slicedToArray(_useSafeState5, 2),
78
+ pageInfo = _useSafeState6[0],
79
+ setPageInfoState = _useSafeState6[1];
80
+ var reloadSignal = useAwaitableReload();
81
+ var reqRef = useLatest(request);
82
+ var callbacks = useLatest({
83
+ onLoad: onLoad,
84
+ onLoadingChange: onLoadingChange,
85
+ onRequestError: onRequestError,
86
+ postData: postData
87
+ });
88
+ var loadingRef = useLatest(loading);
89
+ var requestIdRef = useRef(0);
90
+ var abortRef = useRef(null);
91
+ var skipFirstRef = useRef(manualRequest === true);
92
+ var prevParamsRef = useRef(undefined);
93
+ var debounceTimerRef = useRef(undefined);
94
+ // Set right before a polling-triggered refetch so it can refresh silently
95
+ // (without flashing the main loading overlay). Consumed at the start of runRequest.
96
+ var silentRef = useRef(false);
97
+ var setLoading = useMemoizedFn(function (next) {
98
+ var _a, _b;
99
+ setLoadingState(next);
100
+ (_b = (_a = callbacks.current).onLoadingChange) === null || _b === void 0 ? void 0 : _b.call(_a, next);
101
+ });
102
+ var setPageInfo = useMemoizedFn(function (info) {
103
+ setPageInfoState(function (prev) {
104
+ var merged = Object.assign(Object.assign({}, prev), info);
105
+ if (merged.current === prev.current && merged.pageSize === prev.pageSize && merged.total === prev.total) {
106
+ return prev;
107
+ }
108
+ return merged;
109
+ });
110
+ });
111
+ // The single network entry point: abort the previous request, then apply data
112
+ // while guarding against stale / aborted responses.
113
+ var runRequest = useMemoizedFn(function (merged, st, ft) {
114
+ return __awaiter(_this, void 0, void 0, /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
115
+ var _a, _b, _c, _d, _e, _f, req, silent, abort, requestId, result, raw, next, _t;
116
+ return _regeneratorRuntime.wrap(function (_context) {
117
+ while (1) switch (_context.prev = _context.next) {
118
+ case 0:
119
+ req = reqRef.current;
120
+ if (req) {
121
+ _context.next = 1;
122
+ break;
123
+ }
124
+ return _context.abrupt("return");
125
+ case 1:
126
+ // A polling refetch refreshes silently — no loading overlay flash.
127
+ silent = silentRef.current;
128
+ silentRef.current = false;
129
+ (_a = abortRef.current) === null || _a === void 0 ? void 0 : _a.abort();
130
+ abort = new AbortController();
131
+ abortRef.current = abort;
132
+ requestId = ++requestIdRef.current;
133
+ if (!silent) setLoading(true);
134
+ _context.prev = 2;
135
+ _context.next = 3;
136
+ return req(merged, st, ft, {
137
+ signal: abort.signal
138
+ });
139
+ case 3:
140
+ result = _context.sent;
141
+ if (!(abort.signal.aborted || requestId !== requestIdRef.current)) {
142
+ _context.next = 4;
143
+ break;
144
+ }
145
+ return _context.abrupt("return");
146
+ case 4:
147
+ if (!(result.success === false)) {
148
+ _context.next = 5;
149
+ break;
150
+ }
151
+ return _context.abrupt("return");
152
+ case 5:
153
+ raw = (_b = result.data) !== null && _b !== void 0 ? _b : [];
154
+ next = callbacks.current.postData ? callbacks.current.postData(raw) : raw;
155
+ setDataSource(next);
156
+ setPageInfoState(function (prev) {
157
+ var _a;
158
+ return Object.assign(Object.assign({}, prev), {
159
+ total: (_a = result.total) !== null && _a !== void 0 ? _a : next.length
160
+ });
161
+ });
162
+ (_d = (_c = callbacks.current).onLoad) === null || _d === void 0 ? void 0 : _d.call(_c, next);
163
+ _context.next = 8;
164
+ break;
165
+ case 6:
166
+ _context.prev = 6;
167
+ _t = _context["catch"](2);
168
+ if (!(abort.signal.aborted || requestId !== requestIdRef.current)) {
169
+ _context.next = 7;
170
+ break;
171
+ }
172
+ return _context.abrupt("return");
173
+ case 7:
174
+ (_f = (_e = callbacks.current).onRequestError) === null || _f === void 0 ? void 0 : _f.call(_e, _t);
175
+ case 8:
176
+ _context.prev = 8;
177
+ if (!silent && requestId === requestIdRef.current) setLoading(false);
178
+ return _context.finish(8);
179
+ case 9:
180
+ case "end":
181
+ return _context.stop();
182
+ }
183
+ }, _callee, null, [[2, 6, 8, 9]]);
184
+ }));
185
+ });
186
+ // Build the request params from the current render closure.
187
+ var buildMerged = function buildMerged() {
188
+ return Object.assign(Object.assign(Object.assign({}, params !== null && params !== void 0 ? params : {}), searchParams), paginated ? {
189
+ current: pageInfo.current,
190
+ pageSize: pageInfo.pageSize
191
+ } : {});
192
+ };
193
+ // Only `params` (a consumer-owned prop, often an inline object) needs value
194
+ // comparison; the rest are stable internal state and compare by reference.
195
+ var paramsKey = JSON.stringify(params !== null && params !== void 0 ? params : null);
196
+ useEffect(function () {
197
+ if (manual) {
198
+ reloadSignal.settle();
199
+ return;
200
+ }
201
+ // manualRequest: swallow only the first (mount) trigger.
202
+ if (skipFirstRef.current) {
203
+ skipFirstRef.current = false;
204
+ prevParamsRef.current = paramsKey;
205
+ reloadSignal.settle();
206
+ return;
207
+ }
208
+ // A `params` change resets to page 1 first; the page change re-runs this
209
+ // effect, where the actual fetch happens (so it never double-fetches).
210
+ if (prevParamsRef.current !== paramsKey && pageInfo.current !== defaultCurrent) {
211
+ prevParamsRef.current = paramsKey;
212
+ setPageInfo({
213
+ current: defaultCurrent
214
+ });
215
+ return;
216
+ }
217
+ prevParamsRef.current = paramsKey;
218
+ var fire = function fire() {
219
+ return runRequest(buildMerged(), sort, filter)["finally"](reloadSignal.settle);
220
+ };
221
+ if (debounceTime && debounceTime > 0) {
222
+ if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current);
223
+ debounceTimerRef.current = setTimeout(fire, debounceTime);
224
+ return function () {
225
+ if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current);
226
+ };
227
+ }
228
+ void fire();
229
+ }, [paramsKey, searchParams, sort, filter, pageInfo.current, pageInfo.pageSize, reloadSignal.token, manual]);
230
+ var reload = useMemoizedFn(function () {
231
+ return manual ? Promise.resolve() : reloadSignal.request();
232
+ });
233
+ var reset = useMemoizedFn(function () {
234
+ setPageInfoState(function (prev) {
235
+ return Object.assign(Object.assign({}, prev), {
236
+ current: defaultCurrent,
237
+ pageSize: defaultPageSize
238
+ });
239
+ });
240
+ });
241
+ // Polling: re-trigger on an interval, skipping ticks while a request is in flight.
242
+ var pollingMs = typeof polling === 'function' ? polling(dataSource) : polling;
243
+ useEffect(function () {
244
+ if (manual || !pollingMs || pollingMs <= 0) return;
245
+ var id = setInterval(function () {
246
+ if (loadingRef.current) return;
247
+ silentRef.current = true;
248
+ void reloadSignal.request();
249
+ }, pollingMs);
250
+ return function () {
251
+ return clearInterval(id);
252
+ };
253
+ }, [pollingMs, manual]);
254
+ // Abort any in-flight request on unmount.
255
+ useEffect(function () {
256
+ return function () {
257
+ var _a;
258
+ return (_a = abortRef.current) === null || _a === void 0 ? void 0 : _a.abort();
259
+ };
260
+ }, []);
261
+ return {
262
+ dataSource: dataSource,
263
+ loading: loading,
264
+ pageInfo: pageInfo,
265
+ setPageInfo: setPageInfo,
266
+ reload: reload,
267
+ reset: reset
268
+ };
269
+ }
270
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvUHJvVGFibGUvdXNlRmV0Y2hEYXRhLmpzIiwiY29tcG9uZW50cy9zcmMvY29tcG9uZW50cy9Qcm9UYWJsZS91c2VGZXRjaERhdGEudHMiXSwibmFtZXMiOlsiX19hd2FpdGVyIiwidGhpc0FyZyIsIl9hcmd1bWVudHMiLCJQIiwiZ2VuZXJhdG9yIiwiYWRvcHQiLCJ2YWx1ZSIsInJlc29sdmUiLCJQcm9taXNlIiwicmVqZWN0IiwiZnVsZmlsbGVkIiwic3RlcCIsIm5leHQiLCJlIiwicmVqZWN0ZWQiLCJyZXN1bHQiLCJkb25lIiwidGhlbiIsImFwcGx5IiwidXNlRWZmZWN0IiwidXNlUmVmIiwidXNlTGF0ZXN0IiwidXNlTWVtb2l6ZWRGbiIsInVzZVNhZmVTdGF0ZSIsInVzZUF3YWl0YWJsZVJlbG9hZCIsInVzZUZldGNoRGF0YSIsIm9wdGlvbnMiLCJfdGhpcyIsInJlcXVlc3QiLCJtYW51YWwiLCJtYW51YWxSZXF1ZXN0IiwiZGVib3VuY2VUaW1lIiwicG9zdERhdGEiLCJwb2xsaW5nIiwicGFyYW1zIiwiZGVmYXVsdERhdGEiLCJwYWdpbmF0ZWQiLCJkZWZhdWx0Q3VycmVudCIsImRlZmF1bHRQYWdlU2l6ZSIsInNlYXJjaFBhcmFtcyIsInNvcnQiLCJmaWx0ZXIiLCJvbkxvYWQiLCJvbkxvYWRpbmdDaGFuZ2UiLCJvblJlcXVlc3RFcnJvciIsIl91c2VTYWZlU3RhdGUiLCJfdXNlU2FmZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5IiwiZGF0YVNvdXJjZSIsInNldERhdGFTb3VyY2UiLCJfdXNlU2FmZVN0YXRlMyIsIl91c2VTYWZlU3RhdGU0IiwibG9hZGluZyIsInNldExvYWRpbmdTdGF0ZSIsIl91c2VTYWZlU3RhdGU1IiwiY3VycmVudCIsInBhZ2VTaXplIiwidG90YWwiLCJfdXNlU2FmZVN0YXRlNiIsInBhZ2VJbmZvIiwic2V0UGFnZUluZm9TdGF0ZSIsInJlbG9hZFNpZ25hbCIsInJlcVJlZiIsImNhbGxiYWNrcyIsImxvYWRpbmdSZWYiLCJyZXF1ZXN0SWRSZWYiLCJhYm9ydFJlZiIsInNraXBGaXJzdFJlZiIsInByZXZQYXJhbXNSZWYiLCJ1bmRlZmluZWQiLCJkZWJvdW5jZVRpbWVyUmVmIiwic2lsZW50UmVmIiwic2V0TG9hZGluZyIsIl9hIiwiX2IiLCJjYWxsIiwic2V0UGFnZUluZm8iLCJpbmZvIiwicHJldiIsIm1lcmdlZCIsIk9iamVjdCIsImFzc2lnbiIsInJ1blJlcXVlc3QiLCJzdCIsImZ0IiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwiX2MiLCJfZCIsIl9lIiwiX2YiLCJyZXEiLCJzaWxlbnQiLCJhYm9ydCIsInJlcXVlc3RJZCIsInJhdyIsIl90Iiwid3JhcCIsIl9jb250ZXh0IiwiYWJydXB0IiwiQWJvcnRDb250cm9sbGVyIiwic2lnbmFsIiwic2VudCIsImFib3J0ZWQiLCJzdWNjZXNzIiwiZGF0YSIsImxlbmd0aCIsImZpbmlzaCIsInN0b3AiLCJidWlsZE1lcmdlZCIsInBhcmFtc0tleSIsIkpTT04iLCJzdHJpbmdpZnkiLCJzZXR0bGUiLCJmaXJlIiwiY2xlYXJUaW1lb3V0Iiwic2V0VGltZW91dCIsInRva2VuIiwicmVsb2FkIiwicmVzZXQiLCJwb2xsaW5nTXMiLCJpZCIsInNldEludGVydmFsIiwiY2xlYXJJbnRlcnZhbCJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFJQSxTQUFTLEdBQUksSUFBSSxJQUFJLElBQUksQ0FBQ0EsU0FBUyxJQUFLLFVBQVVDLE9BQU8sRUFBRUMsVUFBVSxFQUFFQyxDQUFDLEVBQUVDLFNBQVMsRUFBRTtFQUNyRixTQUFTQyxLQUFLQSxDQUFDQyxLQUFLLEVBQUU7SUFBRSxPQUFPQSxLQUFLLFlBQVlILENBQUMsR0FBR0csS0FBSyxHQUFHLElBQUlILENBQUMsQ0FBQyxVQUFVSSxPQUFPLEVBQUU7TUFBRUEsT0FBTyxDQUFDRCxLQUFLLENBQUM7SUFBRSxDQUFDLENBQUM7RUFBRTtFQUMzRyxPQUFPLEtBQUtILENBQUMsS0FBS0EsQ0FB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Q0FBQyxZQUFLO01BQzFCLElBQUkzRCxVQUFVLENBQUNULE9BQU8sRUFBRTtNQUN4QmdCLFNBQVMsQ0FBQ2hCLE9BQU8sR0FBRyxJQUFJO01BQ3hCLEtBQUtNLFlBQVksQ0FBQ2pDLE9BQU8sQ0FBQSxDQUFFO0lBQzdCLENBQUMsRUFBRTZGLFNBQVMsQ0FBQztJQUNiLE9BQU87TUFBQSxPQUFNRyxhQUFhLENBQUNGLEVBQUUsQ0FBQztJQUFBO0VBQ2hDLENBQUMsRUFBRSxDQUFDRCxTQUFTLEVBQUU1RixNQUFNLENBQUMsQ0FBQztFQUV2QjtFQUNBVixTQUFTLENBQUM7SUFBQSxPQUFNLFlBQUs7TUFBQSxJQUFBc0QsRUFBQTtNQUFDLE9BQUEsQ0FBQUEsRUFBQSxHQUFBUCxRQUFRLENBQUNYLE9BQU8sTUFBQSxJQUFBLElBQUFrQixFQUFBLEtBQUEsS0FBQSxDQUFBLEdBQUEsS0FBQSxDQUFBLEdBQUFBLEVBQUEsQ0FBRXFCLEtBQUssQ0FBQSxDQUFFO0lBQUEsQ0FBQTtFQUFBLEdBQUUsRUFBRSxDQUFDO0VBRXBELE9BQU87SUFBRTlDLFVBQVUsRUFBVkEsVUFBVTtJQUFFSSxPQUFPLEVBQVBBLE9BQU87SUFBRU8sUUFBUSxFQUFSQSxRQUFRO0lBQUVpQixXQUFXLEVBQVhBLFdBQVc7SUFBRTJDLE1BQU0sRUFBTkEsTUFBTTtJQUFFQyxLQUFLLEVBQUxBO0VBQUssQ0FBRTtBQUN0RSIsImZpbGUiOiJjb21wb25lbnRzL1Byb1RhYmxlL3VzZUZldGNoRGF0YS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VMYXRlc3QsIHVzZU1lbW9pemVkRm4sIHVzZVNhZmVTdGF0ZSB9IGZyb20gJ0AxbW9uZXkvaG9va3MnO1xuaW1wb3J0IHsgdXNlQXdhaXRhYmxlUmVsb2FkIH0gZnJvbSAnLi9jb3JlL3VzZUF3YWl0YWJsZVJlbG9hZCc7XG4vKipcbiAqIE93bnMgdGhlIHJlcXVlc3QgbGlmZWN5Y2xlIGZvciBQcm9UYWJsZTogZGF0YSwgbG9hZGluZywgYW5kIHBhZ2luYXRpb24uXG4gKlxuICogT25lIGVmZmVjdCBpcyB0aGUgc2luZ2xlIGZldGNoIHBhdGguIEl0IHJlYWRzIGl0cyBxdWVyeSBpbnB1dHMgZnJvbSB0aGVcbiAqICoqcmVuZGVyIGNsb3N1cmUqKiAobmV2ZXIgYSBsYWdnaW5nIHJlZiksIHNvIGV2ZXJ5IHN0YXRlIGNoYW5nZSDigJQgc2VhcmNoLFxuICogc29ydCwgZmlsdGVyLCBwYXJhbXMsIHBhZ2Ug4oCUIHJlZmV0Y2hlcyB3aXRoIGNvcnJlY3QgdmFsdWVzLiBBbiBhd2FpdGFibGVcbiAqIHJlbG9hZCBzaWduYWwgbGV0cyBpbXBlcmF0aXZlIGNhbGxlcnMgZm9yY2UgdGhlIHNhbWUgZWZmZWN0IGFuZCBgYXdhaXRgIGl0LlxuICpcbiAqIGBydW5SZXF1ZXN0YCBhYm9ydHMgdGhlIHByZXZpb3VzIGluLWZsaWdodCByZXF1ZXN0IChgQWJvcnRDb250cm9sbGVyYCwgZXhwb3NlZFxuICogdG8gYHJlcXVlc3RgIGFzIGB7IHNpZ25hbCB9YCksIHRhZ3MgaXRzZWxmIHdpdGggYSByZXF1ZXN0IGlkLCBhbmQgZHJvcHMgc3RhbGVcbiAqIG9yIGFib3J0ZWQgcmVzcG9uc2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRmV0Y2hEYXRhKG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IHJlcXVlc3QsIG1hbnVhbCwgbWFudWFsUmVxdWVzdCwgZGVib3VuY2VUaW1lLCBwb3N0RGF0YSwgcG9sbGluZywgcGFyYW1zLCBkZWZhdWx0RGF0YSwgcGFnaW5hdGVkLCBkZWZhdWx0Q3VycmVudCwgZGVmYXVsdFBhZ2VTaXplLCBzZWFyY2hQYXJhbXMsIHNvcnQsIGZpbHRlciwgb25Mb2FkLCBvbkxvYWRpbmdDaGFuZ2UsIG9uUmVxdWVzdEVycm9yLCB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBbZGF0YVNvdXJjZSwgc2V0RGF0YVNvdXJjZV0gPSB1c2VTYWZlU3RhdGUoZGVmYXVsdERhdGEgIT09IG51bGwgJiYgZGVmYXVsdERhdGEgIT09IHZvaWQgMCA/IGRlZmF1bHREYXRhIDogW10pO1xuICAgIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nU3RhdGVdID0gdXNlU2FmZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCBbcGFnZUluZm8sIHNldFBhZ2VJbmZvU3RhdGVdID0gdXNlU2FmZVN0YXRlKHtcbiAgICAgICAgY3VycmVudDogZGVmYXVsdEN1cnJlbnQsXG4gICAgICAgIHBhZ2VTaXplOiBkZWZhdWx0UGFnZVNpemUsXG4gICAgICAgIHRvdGFsOiAwLFxuICAgIH0pO1xuICAgIGNvbnN0IHJlbG9hZFNpZ25hbCA9IHVzZUF3YWl0YWJsZVJlbG9hZCgpO1xuICAgIGNvbnN0IHJlcVJlZiA9IHVzZUxhdGVzdChyZXF1ZXN0KTtcbiAgICBjb25zdCBjYWxsYmFja3MgPSB1c2VMYXRlc3QoeyBvbkxvYWQsIG9uTG9hZGluZ0NoYW5nZSwgb25SZXF1ZXN0RXJyb3IsIHBvc3REYXRhIH0pO1xuICAgIGNvbnN0IGxvYWRpbmdSZWYgPSB1c2VMYXRlc3QobG9hZGluZyk7XG4gICAgY29uc3QgcmVxdWVzdElkUmVmID0gdXNlUmVmKDApO1xuICAgIGNvbnN0IGFib3J0UmVmID0gdXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IHNraXBGaXJzdFJlZiA9IHVzZVJlZihtYW51YWxSZXF1ZXN0ID09PSB0cnVlKTtcbiAgICBjb25zdCBwcmV2UGFyYW1zUmVmID0gdXNlUmVmKHVuZGVmaW5lZCk7XG4gICAgY29uc3QgZGVib3VuY2VUaW1lclJlZiA9IHVzZVJlZih1bmRlZmluZWQpO1xuICAgIC8vIFNldCByaWdodCBiZWZvcmUgYSBwb2xsaW5nLXRyaWdnZXJlZCByZWZldGNoIHNvIGl0IGNhbiByZWZyZXNoIHNpbGVudGx5XG4gICAgLy8gKHdpdGhvdXQgZmxhc2hpbmcgdGhlIG1haW4gbG9hZGluZyBvdmVybGF5KS4gQ29uc3VtZWQgYXQgdGhlIHN0YXJ0IG9mIHJ1blJlcXVlc3QuXG4gICAgY29uc3Qgc2lsZW50UmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgICBjb25zdCBzZXRMb2FkaW5nID0gdXNlTWVtb2l6ZWRGbigobmV4dCkgPT4ge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBzZXRMb2FkaW5nU3RhdGUobmV4dCk7XG4gICAgICAgIChfYiA9IChfYSA9IGNhbGxiYWNrcy5jdXJyZW50KS5vbkxvYWRpbmdDaGFuZ2UpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCBuZXh0KTtcbiAgICB9KTtcbiAgICBjb25zdCBzZXRQYWdlSW5mbyA9IHVzZU1lbW9pemVkRm4oKGluZm8pID0+IHtcbiAgICAgICAgc2V0UGFnZUluZm9TdGF0ZSgocHJldikgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWVyZ2VkID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgaW5mbyk7XG4gICAgICAgICAgICBpZiAobWVyZ2VkLmN1cnJlbnQgPT09IHByZXYuY3VycmVudCAmJiBtZXJnZWQucGFnZVNpemUgPT09IHByZXYucGFnZVNpemUgJiYgbWVyZ2VkLnRvdGFsID09PSBwcmV2LnRvdGFsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VkO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICAvLyBUaGUgc2luZ2xlIG5ldHdvcmsgZW50cnkgcG9pbnQ6IGFib3J0IHRoZSBwcmV2aW91cyByZXF1ZXN0LCB0aGVuIGFwcGx5IGRhdGFcbiAgICAvLyB3aGlsZSBndWFyZGluZyBhZ2FpbnN0IHN0YWxlIC8gYWJvcnRlZCByZXNwb25zZXMuXG4gICAgY29uc3QgcnVuUmVxdWVzdCA9IHVzZU1lbW9pemVkRm4oKG1lcmdlZCwgc3QsIGZ0KSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mO1xuICAgICAgICBjb25zdCByZXEgPSByZXFSZWYuY3VycmVudDtcbiAgICAgICAgaWYgKCFyZXEpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIC8vIEEgcG9sbGluZyByZWZldGNoIHJlZnJlc2hlcyBzaWxlbnRseSDigJQgbm8gbG9hZGluZyBvdmVybGF5IGZsYXNoLlxuICAgICAgICBjb25zdCBzaWxlbnQgPSBzaWxlbnRSZWYuY3VycmVudDtcbiAgICAgICAgc2lsZW50UmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgKF9hID0gYWJvcnRSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFib3J0KCk7XG4gICAgICAgIGNvbnN0IGFib3J0ID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICBhYm9ydFJlZi5jdXJyZW50ID0gYWJvcnQ7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9ICsrcmVxdWVzdElkUmVmLmN1cnJlbnQ7XG4gICAgICAgIGlmICghc2lsZW50KVxuICAgICAgICAgICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHJlcShtZXJnZWQsIHN0LCBmdCwgeyBzaWduYWw6IGFib3J0LnNpZ25hbCB9KTtcbiAgICAgICAgICAgIGlmIChhYm9ydC5zaWduYWwuYWJvcnRlZCB8fCByZXF1ZXN0SWQgIT09IHJlcXVlc3RJZFJlZi5jdXJyZW50KVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcyA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgcmF3ID0gKF9iID0gcmVzdWx0LmRhdGEpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFtdO1xuICAgICAgICAgICAgY29uc3QgbmV4dCA9IGNhbGxiYWNrcy5jdXJyZW50LnBvc3REYXRhID8gY2FsbGJhY2tzLmN1cnJlbnQucG9zdERhdGEocmF3KSA6IHJhdztcbiAgICAgICAgICAgIHNldERhdGFTb3VyY2UobmV4dCk7XG4gICAgICAgICAgICBzZXRQYWdlSW5mb1N0YXRlKChwcmV2KSA9PiB7IHZhciBfYTsgcmV0dXJuIChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCB7IHRvdGFsOiAoX2EgPSByZXN1bHQudG90YWwpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG5leHQubGVuZ3RoIH0pKTsgfSk7XG4gICAgICAgICAgICAoX2QgPSAoX2MgPSBjYWxsYmFja3MuY3VycmVudCkub25Mb2FkKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuY2FsbChfYywgbmV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoYWJvcnQuc2lnbmFsLmFib3J0ZWQgfHwgcmVxdWVzdElkICE9PSByZXF1ZXN0SWRSZWYuY3VycmVudClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAoX2YgPSAoX2UgPSBjYWxsYmFja3MuY3VycmVudCkub25SZXF1ZXN0RXJyb3IpID09PSBudWxsIHx8IF9mID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZi5jYWxsKF9lLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoIXNpbGVudCAmJiByZXF1ZXN0SWQgPT09IHJlcXVlc3RJZFJlZi5jdXJyZW50KVxuICAgICAgICAgICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfSkpO1xuICAgIC8vIEJ1aWxkIHRoZSByZXF1ZXN0IHBhcmFtcyBmcm9tIHRoZSBjdXJyZW50IHJlbmRlciBjbG9zdXJlLlxuICAgIGNvbnN0IGJ1aWxkTWVyZ2VkID0gKCkgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAocGFyYW1zICE9PSBudWxsICYmIHBhcmFtcyAhPT0gdm9pZCAwID8gcGFyYW1zIDoge30pKSwgc2VhcmNoUGFyYW1zKSwgKHBhZ2luYXRlZCA/IHsgY3VycmVudDogcGFnZUluZm8uY3VycmVudCwgcGFnZVNpemU6IHBhZ2VJbmZvLnBhZ2VTaXplIH0gOiB7fSkpKTtcbiAgICAvLyBPbmx5IGBwYXJhbXNgIChhIGNvbnN1bWVyLW93bmVkIHByb3AsIG9mdGVuIGFuIGlubGluZSBvYmplY3QpIG5lZWRzIHZhbHVlXG4gICAgLy8gY29tcGFyaXNvbjsgdGhlIHJlc3QgYXJlIHN0YWJsZSBpbnRlcm5hbCBzdGF0ZSBhbmQgY29tcGFyZSBieSByZWZlcmVuY2UuXG4gICAgY29uc3QgcGFyYW1zS2V5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zICE9PSBudWxsICYmIHBhcmFtcyAhPT0gdm9pZCAwID8gcGFyYW1zIDogbnVsbCk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKG1hbnVhbCkge1xuICAgICAgICAgICAgcmVsb2FkU2lnbmFsLnNldHRsZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIG1hbnVhbFJlcXVlc3Q6IHN3YWxsb3cgb25seSB0aGUgZmlyc3QgKG1vdW50KSB0cmlnZ2VyLlxuICAgICAgICBpZiAoc2tpcEZpcnN0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHNraXBGaXJzdFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgICAgICBwcmV2UGFyYW1zUmVmLmN1cnJlbnQgPSBwYXJhbXNLZXk7XG4gICAgICAgICAgICByZWxvYWRTaWduYWwuc2V0dGxlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gQSBgcGFyYW1zYCBjaGFuZ2UgcmVzZXRzIHRvIHBhZ2UgMSBmaXJzdDsgdGhlIHBhZ2UgY2hhbmdlIHJlLXJ1bnMgdGhpc1xuICAgICAgICAvLyBlZmZlY3QsIHdoZXJlIHRoZSBhY3R1YWwgZmV0Y2ggaGFwcGVucyAoc28gaXQgbmV2ZXIgZG91YmxlLWZldGNoZXMpLlxuICAgICAgICBpZiAocHJldlBhcmFtc1JlZi5jdXJyZW50ICE9PSBwYXJhbXNLZXkgJiYgcGFnZUluZm8uY3VycmVudCAhPT0gZGVmYXVsdEN1cnJlbnQpIHtcbiAgICAgICAgICAgIHByZXZQYXJhbXNSZWYuY3VycmVudCA9IHBhcmFtc0tleTtcbiAgICAgICAgICAgIHNldFBhZ2VJbmZvKHsgY3VycmVudDogZGVmYXVsdEN1cnJlbnQgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcHJldlBhcmFtc1JlZi5jdXJyZW50ID0gcGFyYW1zS2V5O1xuICAgICAgICBjb25zdCBmaXJlID0gKCkgPT4gcnVuUmVxdWVzdChidWlsZE1lcmdlZCgpLCBzb3J0LCBmaWx0ZXIpLmZpbmFsbHkocmVsb2FkU2lnbmFsLnNldHRsZSk7XG4gICAgICAgIGlmIChkZWJvdW5jZVRpbWUgJiYgZGVib3VuY2VUaW1lID4gMCkge1xuICAgICAgICAgICAgaWYgKGRlYm91bmNlVGltZXJSZWYuY3VycmVudClcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVib3VuY2VUaW1lclJlZi5jdXJyZW50KTtcbiAgICAgICAgICAgIGRlYm91bmNlVGltZXJSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoZmlyZSwgZGVib3VuY2VUaW1lKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYm91bmNlVGltZXJSZWYuY3VycmVudClcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlYm91bmNlVGltZXJSZWYuY3VycmVudCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHZvaWQgZmlyZSgpO1xuICAgIH0sIFtwYXJhbXNLZXksIHNlYXJjaFBhcmFtcywgc29ydCwgZmlsdGVyLCBwYWdlSW5mby5jdXJyZW50LCBwYWdlSW5mby5wYWdlU2l6ZSwgcmVsb2FkU2lnbmFsLnRva2VuLCBtYW51YWxdKTtcbiAgICBjb25zdCByZWxvYWQgPSB1c2VNZW1vaXplZEZuKCgpID0+IChtYW51YWwgPyBQcm9taXNlLnJlc29sdmUoKSA6IHJlbG9hZFNpZ25hbC5yZXF1ZXN0KCkpKTtcbiAgICBjb25zdCByZXNldCA9IHVzZU1lbW9pemVkRm4oKCkgPT4ge1xuICAgICAgICBzZXRQYWdlSW5mb1N0YXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBjdXJyZW50OiBkZWZhdWx0Q3VycmVudCwgcGFnZVNpemU6IGRlZmF1bHRQYWdlU2l6ZSB9KSkpO1xuICAgIH0pO1xuICAgIC8vIFBvbGxpbmc6IHJlLXRyaWdnZXIgb24gYW4gaW50ZXJ2YWwsIHNraXBwaW5nIHRpY2tzIHdoaWxlIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgY29uc3QgcG9sbGluZ01zID0gdHlwZW9mIHBvbGxpbmcgPT09ICdmdW5jdGlvbicgPyBwb2xsaW5nKGRhdGFTb3VyY2UpIDogcG9sbGluZztcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAobWFudWFsIHx8ICFwb2xsaW5nTXMgfHwgcG9sbGluZ01zIDw9IDApXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IGlkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGxvYWRpbmdSZWYuY3VycmVudClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBzaWxlbnRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgICAgICB2b2lkIHJlbG9hZFNpZ25hbC5yZXF1ZXN0KCk7XG4gICAgICAgIH0sIHBvbGxpbmdNcyk7XG4gICAgICAgIHJldHVybiAoKSA9PiBjbGVhckludGVydmFsKGlkKTtcbiAgICB9LCBbcG9sbGluZ01zLCBtYW51YWxdKTtcbiAgICAvLyBBYm9ydCBhbnkgaW4tZmxpZ2h0IHJlcXVlc3Qgb24gdW5tb3VudC5cbiAgICB1c2VFZmZlY3QoKCkgPT4gKCkgPT4geyB2YXIgX2E7IHJldHVybiAoX2EgPSBhYm9ydFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWJvcnQoKTsgfSwgW10pO1xuICAgIHJldHVybiB7IGRhdGFTb3VyY2UsIGxvYWRpbmcsIHBhZ2VJbmZvLCBzZXRQYWdlSW5mbywgcmVsb2FkLCByZXNldCB9O1xufSIsbnVsbF0sInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMifQ==