@fieldia/map 0.0.0-stage → 0.14.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 (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +98 -2
  3. package/package.json +37 -3
  4. package/src/index.d.mts +6 -0
  5. package/src/index.d.ts +6 -0
  6. package/src/index.js +22 -0
  7. package/src/index.js.map +1 -0
  8. package/src/index.mjs +6 -0
  9. package/src/index.mjs.map +1 -0
  10. package/src/lib/area.d.mts +3 -0
  11. package/src/lib/area.d.ts +3 -0
  12. package/src/lib/area.js +591 -0
  13. package/src/lib/area.js.map +1 -0
  14. package/src/lib/area.mjs +588 -0
  15. package/src/lib/area.mjs.map +1 -0
  16. package/src/lib/geo.d.mts +72 -0
  17. package/src/lib/geo.d.ts +72 -0
  18. package/src/lib/geo.js +149 -0
  19. package/src/lib/geo.js.map +1 -0
  20. package/src/lib/geo.mjs +134 -0
  21. package/src/lib/geo.mjs.map +1 -0
  22. package/src/lib/kinds.d.mts +35 -0
  23. package/src/lib/kinds.d.ts +35 -0
  24. package/src/lib/kinds.js +127 -0
  25. package/src/lib/kinds.js.map +1 -0
  26. package/src/lib/kinds.mjs +124 -0
  27. package/src/lib/kinds.mjs.map +1 -0
  28. package/src/lib/labels.d.mts +62 -0
  29. package/src/lib/labels.d.ts +62 -0
  30. package/src/lib/labels.js +226 -0
  31. package/src/lib/labels.js.map +1 -0
  32. package/src/lib/labels.mjs +221 -0
  33. package/src/lib/labels.mjs.map +1 -0
  34. package/src/lib/leaflet-css.d.mts +2 -0
  35. package/src/lib/leaflet-css.d.ts +2 -0
  36. package/src/lib/leaflet-css.js +34 -0
  37. package/src/lib/leaflet-css.js.map +1 -0
  38. package/src/lib/leaflet-css.mjs +31 -0
  39. package/src/lib/leaflet-css.mjs.map +1 -0
  40. package/src/lib/leaflet.d.mts +15 -0
  41. package/src/lib/leaflet.d.ts +15 -0
  42. package/src/lib/leaflet.js +76 -0
  43. package/src/lib/leaflet.js.map +1 -0
  44. package/src/lib/leaflet.mjs +72 -0
  45. package/src/lib/leaflet.mjs.map +1 -0
  46. package/src/lib/map-core.d.mts +49 -0
  47. package/src/lib/map-core.d.ts +49 -0
  48. package/src/lib/map-core.js +312 -0
  49. package/src/lib/map-core.js.map +1 -0
  50. package/src/lib/map-core.mjs +308 -0
  51. package/src/lib/map-core.mjs.map +1 -0
  52. package/src/lib/place.d.mts +3 -0
  53. package/src/lib/place.d.ts +3 -0
  54. package/src/lib/place.js +363 -0
  55. package/src/lib/place.js.map +1 -0
  56. package/src/lib/place.mjs +360 -0
  57. package/src/lib/place.mjs.map +1 -0
  58. package/src/lib/providers.d.mts +152 -0
  59. package/src/lib/providers.d.ts +152 -0
  60. package/src/lib/providers.js +408 -0
  61. package/src/lib/providers.js.map +1 -0
  62. package/src/lib/providers.mjs +401 -0
  63. package/src/lib/providers.mjs.map +1 -0
  64. package/src/lib/search-box.d.mts +30 -0
  65. package/src/lib/search-box.d.ts +30 -0
  66. package/src/lib/search-box.js +155 -0
  67. package/src/lib/search-box.js.map +1 -0
  68. package/src/lib/search-box.mjs +152 -0
  69. package/src/lib/search-box.mjs.map +1 -0
  70. package/src/lib/settings.d.mts +19 -0
  71. package/src/lib/settings.d.ts +19 -0
  72. package/src/lib/settings.js +3 -0
  73. package/src/lib/settings.js.map +1 -0
  74. package/src/lib/settings.mjs +2 -0
  75. package/src/lib/settings.mjs.map +1 -0
  76. package/src/lib/styles.d.mts +11 -0
  77. package/src/lib/styles.d.ts +11 -0
  78. package/src/lib/styles.js +130 -0
  79. package/src/lib/styles.js.map +1 -0
  80. package/src/lib/styles.mjs +125 -0
  81. package/src/lib/styles.mjs.map +1 -0
  82. package/src/lib/widgets.d.mts +14 -0
  83. package/src/lib/widgets.d.ts +14 -0
  84. package/src/lib/widgets.js +21 -0
  85. package/src/lib/widgets.js.map +1 -0
  86. package/src/lib/widgets.mjs +18 -0
  87. package/src/lib/widgets.mjs.map +1 -0
@@ -0,0 +1,363 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.placeWidget = placeWidget;
4
+ const widgets_1 = require("@fieldia/widgets");
5
+ const geo_1 = require("./geo");
6
+ const labels_1 = require("./labels");
7
+ const map_core_1 = require("./map-core");
8
+ const search_box_1 = require("./search-box");
9
+ /**
10
+ * A place on a form: a click on the map, a dragged pin, an address found,
11
+ * or "My location". Kept as a GeoJSON Point in a json field, or in two
12
+ * number fields (`latitude` with `options.longitudeField`), the way Odoo
13
+ * keeps a partner's place. The coordinates stay typeable under the map:
14
+ * that is the way in without a mouse, beside Enter on the map (the place
15
+ * at its centre) and the arrow keys on the pin.
16
+ *
17
+ * Options: `longitudeField`, `addressField` (filled from the address
18
+ * found, or named from the point where the provider can), `myLocation`
19
+ * (on unless false), `search` (on unless false), `zoom` (15), `height`.
20
+ */
21
+ const PIN = `<svg viewBox="0 0 28 40" aria-hidden="true"><path class="fd-map-pin-body" d="M14 1C6.8 1 1 6.7 1 13.8 1 23.6 14 39 14 39s13-15.4 13-25.2C27 6.7 21.2 1 14 1z"/><circle class="fd-map-pin-dot" cx="14" cy="14" r="5"/></svg>`;
22
+ const round6 = (n) => Math.round(n * 1e6) / 1e6;
23
+ function placeWidget(settings) {
24
+ return (context) => {
25
+ const { form, name, field, node, id, document: doc } = context;
26
+ const options = node.options ?? {};
27
+ const labels = (0, labels_1.mapLabels)(context.locale, settings.labels?.[context.locale ?? 'en']);
28
+ const longitudeField = typeof options['longitudeField'] === 'string' ? options['longitudeField'] : null;
29
+ const addressField = typeof options['addressField'] === 'string' ? options['addressField'] : null;
30
+ const inFields = field.type === 'float';
31
+ if (inFields && !longitudeField)
32
+ throw new Error(`The place on "${name}" keeps its latitude there and needs options.longitudeField for its longitude`);
33
+ const zoom = typeof options['zoom'] === 'number' ? options['zoom'] : 15;
34
+ const search = options['search'] === false ? undefined : (settings.search ?? settings.provider.search);
35
+ const reverse = settings.reverse ?? settings.provider.reverse;
36
+ const asYouType = settings.search ? (settings.searchAsYouType ?? true) : !!settings.provider.searchAsYouType;
37
+ const geolocation = options['myLocation'] === false ? undefined : doc.defaultView?.navigator.geolocation;
38
+ let readonly = false;
39
+ let point = null;
40
+ /** The address this field last wrote: one a person typed is never written over. */
41
+ let addressWritten;
42
+ let values = form.getState().values;
43
+ const element = doc.createElement('div');
44
+ element.className = 'fd-map-field fd-place';
45
+ element.setAttribute('role', 'group');
46
+ element.setAttribute('aria-labelledby', `${id}-label`);
47
+ const tools = doc.createElement('div');
48
+ tools.className = 'fd-map-tools';
49
+ const note = doc.createElement('p');
50
+ note.className = 'fd-map-note';
51
+ note.setAttribute('aria-live', 'polite');
52
+ note.hidden = true;
53
+ const say = (words, tone) => {
54
+ note.textContent = words ?? '';
55
+ note.hidden = !words;
56
+ if (tone)
57
+ note.dataset['tone'] = tone;
58
+ else
59
+ delete note.dataset['tone'];
60
+ };
61
+ const box = (0, map_core_1.createMapBox)({
62
+ document: doc,
63
+ provider: settings.provider,
64
+ locale: context.locale ?? 'en',
65
+ labels,
66
+ name: field.label,
67
+ keys: labels.placeKeys,
68
+ center: settings.center,
69
+ zoom: settings.center ? (settings.zoom ?? 11) : undefined,
70
+ height: typeof options['height'] === 'number' ? options['height'] : undefined,
71
+ });
72
+ // ---- the coordinates, typeable -------------------------------------------
73
+ const coords = doc.createElement('div');
74
+ coords.className = 'fd-map-coords';
75
+ const coordinate = (words, inputId) => {
76
+ const label = doc.createElement('label');
77
+ const input = doc.createElement('input');
78
+ input.className = 'fd-input';
79
+ input.id = inputId;
80
+ input.inputMode = 'decimal';
81
+ input.autocomplete = 'off';
82
+ input.spellcheck = false;
83
+ label.append(words, input);
84
+ coords.append(label);
85
+ return input;
86
+ };
87
+ const lat = coordinate(labels.latitude, search ? `${id}-lat` : id);
88
+ const lng = coordinate(labels.longitude, `${id}-lng`);
89
+ const typed = () => {
90
+ const a = (0, geo_1.parseCoordinate)(lat.value);
91
+ const b = (0, geo_1.parseCoordinate)(lng.value);
92
+ const empty = !lat.value.trim() && !lng.value.trim();
93
+ const good = empty || (0, geo_1.isLatLng)(a, b);
94
+ lat.setAttribute('aria-invalid', String(!good || (a !== null && Math.abs(a) > 90)));
95
+ lng.setAttribute('aria-invalid', String(!good || (b !== null && Math.abs(b) > 180)));
96
+ if (!good)
97
+ return say(labels.notACoordinate, 'error');
98
+ say(null);
99
+ if (empty)
100
+ return set(null);
101
+ set({ lat: a, lng: b }, { fly: true, name: true });
102
+ };
103
+ for (const input of [lat, lng]) {
104
+ input.addEventListener('change', typed);
105
+ input.addEventListener('keydown', (event) => event.key === 'Enter' && (event.preventDefault(), typed()));
106
+ }
107
+ // ---- writing ---------------------------------------------------------------
108
+ function write(next) {
109
+ if (inFields) {
110
+ form.setValue(name, next ? round6(next.lat) : null);
111
+ form.setValue(longitudeField, next ? round6(next.lng) : null);
112
+ }
113
+ else
114
+ form.setValue(name, next ? (0, geo_1.asJson)((0, geo_1.writePoint)(next)) : null);
115
+ }
116
+ let naming = null;
117
+ /** The address from the point, where the provider can say one, unless a person typed their own. */
118
+ function nameFrom(at) {
119
+ if (!addressField || !reverse)
120
+ return;
121
+ const current = values[addressField];
122
+ if (current !== null && current !== undefined && current !== '' && current !== addressWritten)
123
+ return;
124
+ naming?.abort();
125
+ naming = new AbortController();
126
+ reverse({ ...at, locale: context.locale ?? 'en', signal: naming.signal })
127
+ .then((label) => {
128
+ if (!label)
129
+ return;
130
+ addressWritten = label;
131
+ form.setValue(addressField, label);
132
+ })
133
+ .catch((error) => error.name !== 'AbortError' && (0, map_core_1.warnOnce)(`Naming the place failed: ${error.message}`));
134
+ }
135
+ function set(next, how = {}) {
136
+ if (readonly)
137
+ return;
138
+ // How sure "My location" was: a circle while the place is the one it gave.
139
+ showAccuracy(next && how.within !== undefined ? { at: next, metres: how.within } : null);
140
+ if (next)
141
+ next = { lat: round6(next.lat), lng: round6(next.lng) };
142
+ point = next;
143
+ show(how.fly);
144
+ write(next);
145
+ if (next && how.address !== undefined && addressField) {
146
+ addressWritten = how.address;
147
+ form.setValue(addressField, how.address);
148
+ }
149
+ else if (next && how.name)
150
+ nameFrom(next);
151
+ }
152
+ // ---- the map and its pin ---------------------------------------------------
153
+ let marker = null;
154
+ let accuracy = null;
155
+ /** The map, once it is there: where it is and how close, for the search's "near". */
156
+ let shown = null;
157
+ /** The circle a rough location may be anywhere in, fitted into view; a desktop's is often kilometres wide. */
158
+ function showAccuracy(within) {
159
+ box.ready((map, L) => {
160
+ accuracy?.remove();
161
+ accuracy = null;
162
+ if (!within)
163
+ return;
164
+ accuracy = L.circle([within.at.lat, within.at.lng], { radius: within.metres, className: 'fd-map-accuracy', interactive: false }).addTo(map);
165
+ map.fitBounds(accuracy.getBounds(), { padding: [24, 24], maxZoom: zoom });
166
+ });
167
+ }
168
+ function show(fly = false) {
169
+ clear.hidden = readonly || !point;
170
+ box.ready((map, L) => {
171
+ if (!point) {
172
+ marker?.remove();
173
+ marker = null;
174
+ return;
175
+ }
176
+ const at = [point.lat, point.lng];
177
+ if (!marker)
178
+ marker = makeMarker(map, L, at);
179
+ else
180
+ marker.setLatLng(at);
181
+ if (marker.dragging) {
182
+ if (readonly)
183
+ marker.dragging.disable();
184
+ else
185
+ marker.dragging.enable();
186
+ }
187
+ marker.getElement()?.setAttribute('aria-label', `${field.label}: ${point.lat}, ${point.lng}`);
188
+ if (fly)
189
+ map.setView(at, Math.max(map.getZoom(), zoom));
190
+ // A rough location's circle has fitted the map already.
191
+ else if (!accuracy && !map.getBounds().contains(at))
192
+ map.setView(at, map.getZoom() < 5 ? zoom : map.getZoom());
193
+ });
194
+ }
195
+ function makeMarker(map, L, at) {
196
+ const icon = L.divIcon({ className: 'fd-map-pin', html: PIN, iconSize: [28, 40], iconAnchor: [14, 39] });
197
+ const pin = L.marker(at, { icon, draggable: !readonly, keyboard: true, autoPan: true }).addTo(map);
198
+ pin.on('dragend', () => {
199
+ const moved = pin.getLatLng();
200
+ set({ lat: moved.lat, lng: moved.lng }, { name: true });
201
+ });
202
+ // The arrow keys carry the pin a few pixels; Shift, further.
203
+ pin.getElement()?.addEventListener('keydown', (event) => {
204
+ const step = event.shiftKey ? 16 : 4;
205
+ const by = { ArrowUp: [0, -step], ArrowDown: [0, step], ArrowLeft: [-step, 0], ArrowRight: [step, 0] }[event.key];
206
+ if (!by || readonly)
207
+ return;
208
+ event.preventDefault();
209
+ event.stopPropagation();
210
+ const there = map.containerPointToLatLng(map.latLngToContainerPoint(pin.getLatLng()).add(L.point(by[0], by[1])));
211
+ set({ lat: there.lat, lng: there.lng }, { name: true });
212
+ });
213
+ return pin;
214
+ }
215
+ box.ready((map) => {
216
+ shown = map;
217
+ map.on('click', (event) => set({ lat: event.latlng.lat, lng: event.latlng.lng }, { name: true }));
218
+ // Enter on the map: the place at its centre, where the cross is.
219
+ box.element.addEventListener('keydown', (event) => {
220
+ if ((event.key !== 'Enter' && event.key !== ' ') || event.target !== box.element || readonly)
221
+ return;
222
+ event.preventDefault();
223
+ const centre = map.getCenter();
224
+ set({ lat: centre.lat, lng: centre.lng }, { name: true });
225
+ });
226
+ show(true);
227
+ });
228
+ /** "3 km", "400 m", in the page's language and its way of writing numbers. */
229
+ const distance = (metres) => metres >= 1000 ? (0, labels_1.fill)(labels.kilometres, { n: (0, widgets_1.formatNumber)(Math.round(metres / 1000), 0, context.locale ?? 'en') }) : (0, labels_1.fill)(labels.metres, { n: (0, widgets_1.formatNumber)(Math.round(metres / 10) * 10, 0, context.locale ?? 'en') });
230
+ // ---- search, my location, clear ---------------------------------------------
231
+ const found = search
232
+ ? (0, search_box_1.searchBox)({
233
+ document: doc,
234
+ id: lat.id === id ? `${id}-search` : id,
235
+ labels,
236
+ search,
237
+ asYouType: asYouType,
238
+ locale: context.locale ?? 'en',
239
+ // Nearest where the map is looking first, as a map's own search does.
240
+ near: () => {
241
+ const centre = shown?.getCenter();
242
+ return centre ? { lat: centre.lat, lng: centre.lng } : (point ?? settings.center);
243
+ },
244
+ zoom: () => shown?.getZoom(),
245
+ // A place picked: where it is (looked up now, when the provider's suggestions carry no place), and its whole address for Address.
246
+ pick: async (place) => {
247
+ const located = place.lat !== undefined && place.lng !== undefined
248
+ ? { lat: place.lat, lng: place.lng, address: undefined }
249
+ : await place.locate?.().catch((error) => ((0, map_core_1.warnOnce)(`Finding the place picked failed: ${error.message}`), null));
250
+ if (!located)
251
+ return say(labels.searchFailed, 'error');
252
+ set({ lat: located.lat, lng: located.lng }, { fly: true, address: located.address ?? [place.label, place.detail].filter(Boolean).join(', ') });
253
+ },
254
+ say,
255
+ })
256
+ : null;
257
+ if (found)
258
+ tools.append(found.element);
259
+ const myLocation = doc.createElement('button');
260
+ myLocation.type = 'button';
261
+ myLocation.className = 'fd-button';
262
+ myLocation.innerHTML = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><circle cx="12" cy="12" r="4"/><path d="M12 2v3M12 19v3M2 12h3M19 12h3"/></svg>';
263
+ myLocation.append(labels.myLocation);
264
+ let blocked = false;
265
+ myLocation.hidden = !geolocation;
266
+ myLocation.addEventListener('click', () => {
267
+ if (!geolocation)
268
+ return;
269
+ say(labels.locating);
270
+ geolocation.getCurrentPosition((position) => {
271
+ const metres = Math.round(position.coords.accuracy);
272
+ // Named only when it is sure: an address from a point kilometres off would be someone else's.
273
+ set({ lat: position.coords.latitude, lng: position.coords.longitude }, { name: metres <= 100, within: metres });
274
+ // A rough location says how rough: a desktop's comes from its network, and may be a city away.
275
+ if (metres > 100)
276
+ say((0, labels_1.fill)(labels.locatedWithin, { distance: distance(metres) }));
277
+ else
278
+ say(null);
279
+ }, (error) => {
280
+ if (error.code === error.PERMISSION_DENIED) {
281
+ blocked = true;
282
+ myLocation.hidden = true;
283
+ say(labels.locationBlocked);
284
+ }
285
+ else
286
+ say(labels.locationFailed, 'error');
287
+ }, { enableHighAccuracy: true, timeout: 10_000, maximumAge: 60_000 });
288
+ });
289
+ // Location blocked for the site: the button goes, with the reason in its place.
290
+ doc.defaultView?.navigator.permissions
291
+ ?.query({ name: 'geolocation' })
292
+ .then((status) => {
293
+ const read = () => {
294
+ blocked = status.state === 'denied';
295
+ myLocation.hidden = !geolocation || blocked || readonly;
296
+ if (blocked)
297
+ say(labels.locationBlocked);
298
+ };
299
+ read();
300
+ status.onchange = read;
301
+ })
302
+ .catch(() => undefined);
303
+ const clear = doc.createElement('button');
304
+ clear.type = 'button';
305
+ clear.className = 'fd-button fd-button-link';
306
+ clear.textContent = labels.clear;
307
+ clear.hidden = true;
308
+ clear.addEventListener('click', () => {
309
+ set(null);
310
+ say(null);
311
+ (found?.input ?? lat).focus();
312
+ });
313
+ tools.append(myLocation, clear);
314
+ element.append(tools, box.element, coords, note);
315
+ const showCoords = () => {
316
+ for (const [input, n] of [[lat, point?.lat], [lng, point?.lng]]) {
317
+ if (doc.activeElement === input)
318
+ continue;
319
+ input.value = n === undefined ? '' : String(n);
320
+ input.setAttribute('aria-invalid', 'false');
321
+ }
322
+ };
323
+ return {
324
+ element,
325
+ focus: () => (found?.input ?? lat).focus(),
326
+ destroy: () => {
327
+ naming?.abort();
328
+ found?.destroy();
329
+ box.destroy();
330
+ },
331
+ update(state) {
332
+ values = state.values;
333
+ readonly = state.readonly;
334
+ const next = inFields
335
+ ? (0, geo_1.isLatLng)(state.value, state.values[longitudeField])
336
+ ? { lat: state.value, lng: state.values[longitudeField] }
337
+ : null
338
+ : (0, geo_1.readPoint)(state.value);
339
+ const changed = next?.lat !== point?.lat || next?.lng !== point?.lng;
340
+ point = next;
341
+ tools.hidden = readonly;
342
+ myLocation.hidden = !geolocation || blocked || readonly;
343
+ for (const input of [lat, lng])
344
+ input.readOnly = readonly;
345
+ const target = found?.input ?? lat;
346
+ target.setAttribute('aria-invalid', String(state.invalid));
347
+ target.setAttribute('aria-required', String(state.required));
348
+ if (state.describedBy)
349
+ target.setAttribute('aria-describedby', state.describedBy);
350
+ else
351
+ target.removeAttribute('aria-describedby');
352
+ lat.setAttribute('aria-required', String(state.required));
353
+ showCoords();
354
+ box.refresh();
355
+ if (changed)
356
+ show();
357
+ else
358
+ clear.hidden = readonly || !point;
359
+ },
360
+ };
361
+ };
362
+ }
363
+ //# sourceMappingURL=place.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"place.js","sourceRoot":"","sources":["../../../../../libs/map/src/lib/place.ts"],"names":[],"mappings":";;AA2BA,kCAqUC;AA9VD,8CAAuH;AACvH,+BAA8F;AAC9F,qCAA2C;AAE3C,yCAAoD;AACpD,6CAAyC;AAGzC;;;;;;;;;;;GAWG;AAEH,MAAM,GAAG,GAAG,6NAA6N,CAAC;AAE1O,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AAExD,SAAgB,WAAW,CAAC,QAAqB;IAC/C,OAAO,CAAC,OAAsB,EAAU,EAAE;QACxC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;QAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,IAAA,kBAAS,EAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC;QACpF,MAAM,cAAc,GAAG,OAAO,OAAO,CAAC,gBAAgB,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACxG,MAAM,YAAY,GAAG,OAAO,OAAO,CAAC,cAAc,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAClG,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;QACxC,IAAI,QAAQ,IAAI,CAAC,cAAc;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,+EAA+E,CAAC,CAAC;QACvJ,MAAM,IAAI,GAAG,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACvG,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC9D,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC7G,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,WAAW,CAAC;QAEzG,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,KAAK,GAAkB,IAAI,CAAC;QAChC,mFAAmF;QACnF,IAAI,cAAiC,CAAC;QACtC,IAAI,MAAM,GAAoC,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC;QAErE,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACzC,OAAO,CAAC,SAAS,GAAG,uBAAuB,CAAC;QAC5C,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACtC,OAAO,CAAC,YAAY,CAAC,iBAAiB,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACvC,KAAK,CAAC,SAAS,GAAG,cAAc,CAAC;QACjC,MAAM,IAAI,GAAG,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC;QAC/B,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,MAAM,GAAG,GAAG,CAAC,KAAoB,EAAE,IAAc,EAAE,EAAE;YACnD,IAAI,CAAC,WAAW,GAAG,KAAK,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC;YACrB,IAAI,IAAI;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;;gBACjC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC,CAAC;QAEF,MAAM,GAAG,GAAG,IAAA,uBAAY,EAAC;YACvB,QAAQ,EAAE,GAAG;YACb,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;YAC9B,MAAM;YACN,IAAI,EAAE,KAAK,CAAC,KAAK;YACjB,IAAI,EAAE,MAAM,CAAC,SAAS;YACtB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;YACzD,MAAM,EAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9E,CAAC,CAAC;QAEH,6EAA6E;QAC7E,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,SAAS,GAAG,eAAe,CAAC;QACnC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,OAAe,EAAE,EAAE;YACpD,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACzC,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACzC,KAAK,CAAC,SAAS,GAAG,UAAU,CAAC;YAC7B,KAAK,CAAC,EAAE,GAAG,OAAO,CAAC;YACnB,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;YAC5B,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;YAC3B,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;YACzB,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC3B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACrB,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QACF,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnE,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,MAAM,CAAC,GAAG,IAAA,qBAAe,EAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,CAAC,GAAG,IAAA,qBAAe,EAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACrD,MAAM,IAAI,GAAG,KAAK,IAAI,IAAA,cAAQ,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACrC,GAAG,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YACpF,GAAG,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACrF,IAAI,CAAC,IAAI;gBAAE,OAAO,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YACtD,GAAG,CAAC,IAAI,CAAC,CAAC;YACV,IAAI,KAAK;gBAAE,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;YAC5B,GAAG,CAAC,EAAE,GAAG,EAAE,CAAE,EAAE,GAAG,EAAE,CAAE,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YAC/B,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACxC,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC3G,CAAC;QAED,+EAA+E;QAC/E,SAAS,KAAK,CAAC,IAAmB;YAChC,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACpD,IAAI,CAAC,QAAQ,CAAC,cAAe,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACjE,CAAC;;gBAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAA,YAAM,EAAC,IAAA,gBAAU,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACrE,CAAC;QAED,IAAI,MAAM,GAA2B,IAAI,CAAC;QAC1C,mGAAmG;QACnG,SAAS,QAAQ,CAAC,EAAU;YAC1B,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO;gBAAE,OAAO;YACtC,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;YACrC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,cAAc;gBAAE,OAAO;YACtG,MAAM,EAAE,KAAK,EAAE,CAAC;YAChB,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YAC/B,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;iBACtE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;gBACd,IAAI,CAAC,KAAK;oBAAE,OAAO;gBACnB,cAAc,GAAG,KAAK,CAAC;gBACvB,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YACrC,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAY,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,IAAA,mBAAQ,EAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACnH,CAAC;QAED,SAAS,GAAG,CAAC,IAAmB,EAAE,MAA4E,EAAE;YAC9G,IAAI,QAAQ;gBAAE,OAAO;YACrB,2EAA2E;YAC3E,YAAY,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACzF,IAAI,IAAI;gBAAE,IAAI,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAClE,KAAK,GAAG,IAAI,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,CAAC;YACZ,IAAI,IAAI,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,YAAY,EAAE,CAAC;gBACtD,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC;gBAC7B,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YAC3C,CAAC;iBAAM,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI;gBAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC9C,CAAC;QAED,+EAA+E;QAC/E,IAAI,MAAM,GAA0B,IAAI,CAAC;QACzC,IAAI,QAAQ,GAA0B,IAAI,CAAC;QAC3C,qFAAqF;QACrF,IAAI,KAAK,GAAuB,IAAI,CAAC;QAErC,8GAA8G;QAC9G,SAAS,YAAY,CAAC,MAA6C;YACjE,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;gBACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;gBACnB,QAAQ,GAAG,IAAI,CAAC;gBAChB,IAAI,CAAC,MAAM;oBAAE,OAAO;gBACpB,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC5I,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5E,CAAC,CAAC,CAAC;QACL,CAAC;QACD,SAAS,IAAI,CAAC,GAAG,GAAG,KAAK;YACvB,KAAK,CAAC,MAAM,GAAG,QAAQ,IAAI,CAAC,KAAK,CAAC;YAClC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;gBACnB,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,MAAM,EAAE,MAAM,EAAE,CAAC;oBACjB,MAAM,GAAG,IAAI,CAAC;oBACd,OAAO;gBACT,CAAC;gBACD,MAAM,EAAE,GAAqB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;gBACpD,IAAI,CAAC,MAAM;oBAAE,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;;oBACxC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBAC1B,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;oBACpB,IAAI,QAAQ;wBAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;;wBACnC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAChC,CAAC;gBACD,MAAM,CAAC,UAAU,EAAE,EAAE,YAAY,CAAC,YAAY,EAAE,GAAG,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC9F,IAAI,GAAG;oBAAE,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;gBACxD,wDAAwD;qBACnD,IAAI,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAAE,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACjH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,SAAS,UAAU,CAAC,GAAgB,EAAE,CAAgB,EAAE,EAAoB;YAC1E,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YACzG,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnG,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;gBACrB,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;gBAC9B,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,CAAC,CAAC,CAAC;YACH,6DAA6D;YAC7D,GAAG,CAAC,UAAU,EAAE,EAAE,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;gBACtD,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAClH,IAAI,CAAC,EAAE,IAAI,QAAQ;oBAAE,OAAO;gBAC5B,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,KAAK,CAAC,eAAe,EAAE,CAAC;gBACxB,MAAM,KAAK,GAAG,GAAG,CAAC,sBAAsB,CAAC,GAAG,CAAC,sBAAsB,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjH,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,CAAC,CAAC,CAAC;YACH,OAAO,GAAG,CAAC;QACb,CAAC;QAED,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAChB,KAAK,GAAG,GAAG,CAAC;YACZ,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAgC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC7H,iEAAiE;YACjE,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;gBAChD,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC,OAAO,IAAI,QAAQ;oBAAE,OAAO;gBACrG,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;gBAC/B,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5D,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,CAAC,CAAC,CAAC;QAEH,8EAA8E;QAC9E,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAE,EAAE,CAClC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAA,aAAI,EAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,IAAA,sBAAY,EAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAA,aAAI,EAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,IAAA,sBAAY,EAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;QAE1N,gFAAgF;QAChF,MAAM,KAAK,GAAG,MAAM;YAClB,CAAC,CAAC,IAAA,sBAAS,EAAC;gBACR,QAAQ,EAAE,GAAG;gBACb,EAAE,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE;gBACvC,MAAM;gBACN,MAAM;gBACN,SAAS,EAAE,SAAS;gBACpB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;gBAC9B,sEAAsE;gBACtE,IAAI,EAAE,GAAG,EAAE;oBACT,MAAM,MAAM,GAAG,KAAK,EAAE,SAAS,EAAE,CAAC;oBAClC,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACpF,CAAC;gBACD,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE;gBAC5B,kIAAkI;gBAClI,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBACpB,MAAM,OAAO,GACX,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS;wBAChD,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE;wBACxD,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,KAAY,EAAE,EAAE,CAAC,CAAC,IAAA,mBAAQ,EAAC,oCAAoC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;oBAC5H,IAAI,CAAC,OAAO;wBAAE,OAAO,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;oBACvD,GAAG,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjJ,CAAC;gBACD,GAAG;aACJ,CAAC;YACJ,CAAC,CAAC,IAAI,CAAC;QACT,IAAI,KAAK;YAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEvC,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC/C,UAAU,CAAC,IAAI,GAAG,QAAQ,CAAC;QAC3B,UAAU,CAAC,SAAS,GAAG,WAAW,CAAC;QACnC,UAAU,CAAC,SAAS,GAAG,gLAAgL,CAAC;QACxM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACrC,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,UAAU,CAAC,MAAM,GAAG,CAAC,WAAW,CAAC;QACjC,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACxC,IAAI,CAAC,WAAW;gBAAE,OAAO;YACzB,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACrB,WAAW,CAAC,kBAAkB,CAC5B,CAAC,QAAQ,EAAE,EAAE;gBACX,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACpD,8FAA8F;gBAC9F,GAAG,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;gBAChH,+FAA+F;gBAC/F,IAAI,MAAM,GAAG,GAAG;oBAAE,GAAG,CAAC,IAAA,aAAI,EAAC,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;;oBAC7E,GAAG,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;gBACR,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,iBAAiB,EAAE,CAAC;oBAC3C,OAAO,GAAG,IAAI,CAAC;oBACf,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC;oBACzB,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;gBAC9B,CAAC;;oBAAM,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YAC7C,CAAC,EACD,EAAE,kBAAkB,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAClE,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,gFAAgF;QAChF,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,WAAW;YACpC,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,aAA+B,EAAE,CAAC;aACjD,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACf,MAAM,IAAI,GAAG,GAAG,EAAE;gBAChB,OAAO,GAAG,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC;gBACpC,UAAU,CAAC,MAAM,GAAG,CAAC,WAAW,IAAI,OAAO,IAAI,QAAQ,CAAC;gBACxD,IAAI,OAAO;oBAAE,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YAC3C,CAAC,CAAC;YACF,IAAI,EAAE,CAAC;YACP,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;QACzB,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAE1B,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC1C,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC;QACtB,KAAK,CAAC,SAAS,GAAG,0BAA0B,CAAC;QAC7C,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;QACjC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;QACpB,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACnC,GAAG,CAAC,IAAI,CAAC,CAAC;YACV,GAAG,CAAC,IAAI,CAAC,CAAC;YACV,CAAC,KAAK,EAAE,KAAK,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAChC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAEjD,MAAM,UAAU,GAAG,GAAG,EAAE;YACtB,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAU,EAAE,CAAC;gBACzE,IAAI,GAAG,CAAC,aAAa,KAAK,KAAK;oBAAE,SAAS;gBAC1C,KAAK,CAAC,KAAK,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC/C,KAAK,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC,CAAC;QAEF,OAAO;YACL,OAAO;YACP,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE;YAC1C,OAAO,EAAE,GAAG,EAAE;gBACZ,MAAM,EAAE,KAAK,EAAE,CAAC;gBAChB,KAAK,EAAE,OAAO,EAAE,CAAC;gBACjB,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,CAAC;YACD,MAAM,CAAC,KAAkB;gBACvB,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;gBACtB,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;gBAC1B,MAAM,IAAI,GAAG,QAAQ;oBACnB,CAAC,CAAC,IAAA,cAAQ,EAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,cAAe,CAAC,CAAC;wBACpD,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,KAAe,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,cAAe,CAAW,EAAE;wBAC9E,CAAC,CAAC,IAAI;oBACR,CAAC,CAAC,IAAA,eAAS,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC3B,MAAM,OAAO,GAAG,IAAI,EAAE,GAAG,KAAK,KAAK,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,KAAK,KAAK,EAAE,GAAG,CAAC;gBACrE,KAAK,GAAG,IAAI,CAAC;gBACb,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC;gBACxB,UAAU,CAAC,MAAM,GAAG,CAAC,WAAW,IAAI,OAAO,IAAI,QAAQ,CAAC;gBACxD,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC;oBAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAC1D,MAAM,MAAM,GAAG,KAAK,EAAE,KAAK,IAAI,GAAG,CAAC;gBACnC,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC3D,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC7D,IAAI,KAAK,CAAC,WAAW;oBAAE,MAAM,CAAC,YAAY,CAAC,kBAAkB,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;;oBAC7E,MAAM,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC;gBAChD,GAAG,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC1D,UAAU,EAAE,CAAC;gBACb,GAAG,CAAC,OAAO,EAAE,CAAC;gBACd,IAAI,OAAO;oBAAE,IAAI,EAAE,CAAC;;oBACf,KAAK,CAAC,MAAM,GAAG,QAAQ,IAAI,CAAC,KAAK,CAAC;YACzC,CAAC;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}