huly-mcp-selfhost 2.1.0 → 3.2.0

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 (200) hide show
  1. package/.env.example +39 -2
  2. package/README.md +462 -16
  3. package/dist/connection.d.ts +8 -0
  4. package/dist/connection.js +13 -1
  5. package/dist/connection.js.map +1 -1
  6. package/dist/env.d.ts +1 -0
  7. package/dist/env.js +17 -0
  8. package/dist/env.js.map +1 -0
  9. package/dist/guard.d.ts +28 -0
  10. package/dist/guard.js +152 -0
  11. package/dist/guard.js.map +1 -0
  12. package/dist/guides/costs.md +48 -0
  13. package/dist/guides/features.md +49 -0
  14. package/dist/guides/onboarding.md +56 -0
  15. package/dist/guides/workflow.md +57 -0
  16. package/dist/index.js +18 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/junit-cli.d.ts +8 -0
  19. package/dist/junit-cli.js +106 -0
  20. package/dist/junit-cli.js.map +1 -0
  21. package/dist/registry.d.ts +18 -0
  22. package/dist/registry.js +318 -0
  23. package/dist/registry.js.map +1 -0
  24. package/dist/resources.d.ts +12 -0
  25. package/dist/resources.js +212 -0
  26. package/dist/resources.js.map +1 -0
  27. package/dist/schemas.d.ts +1269 -17
  28. package/dist/schemas.js +890 -97
  29. package/dist/schemas.js.map +1 -1
  30. package/dist/server.d.ts +27 -1
  31. package/dist/server.js +197 -128
  32. package/dist/server.js.map +1 -1
  33. package/dist/tools/activity.d.ts +10 -0
  34. package/dist/tools/activity.js +62 -0
  35. package/dist/tools/activity.js.map +1 -0
  36. package/dist/tools/agent.d.ts +156 -0
  37. package/dist/tools/agent.js +523 -0
  38. package/dist/tools/agent.js.map +1 -0
  39. package/dist/tools/attachments.d.ts +4 -4
  40. package/dist/tools/calendar.d.ts +49 -0
  41. package/dist/tools/calendar.js +116 -0
  42. package/dist/tools/calendar.js.map +1 -0
  43. package/dist/tools/cards.d.ts +87 -0
  44. package/dist/tools/cards.js +246 -0
  45. package/dist/tools/cards.js.map +1 -0
  46. package/dist/tools/channels.d.ts +76 -7
  47. package/dist/tools/channels.js +86 -5
  48. package/dist/tools/channels.js.map +1 -1
  49. package/dist/tools/comments.d.ts +16 -4
  50. package/dist/tools/comments.js +26 -9
  51. package/dist/tools/comments.js.map +1 -1
  52. package/dist/tools/components.d.ts +5 -5
  53. package/dist/tools/components.js +4 -22
  54. package/dist/tools/components.js.map +1 -1
  55. package/dist/tools/contacts.d.ts +69 -0
  56. package/dist/tools/contacts.js +130 -0
  57. package/dist/tools/contacts.js.map +1 -0
  58. package/dist/tools/crm.d.ts +61 -0
  59. package/dist/tools/crm.js +117 -0
  60. package/dist/tools/crm.js.map +1 -0
  61. package/dist/tools/documents.d.ts +35 -12
  62. package/dist/tools/documents.js +107 -22
  63. package/dist/tools/documents.js.map +1 -1
  64. package/dist/tools/drive.d.ts +107 -0
  65. package/dist/tools/drive.js +277 -0
  66. package/dist/tools/drive.js.map +1 -0
  67. package/dist/tools/fields.d.ts +33 -0
  68. package/dist/tools/fields.js +124 -0
  69. package/dist/tools/fields.js.map +1 -0
  70. package/dist/tools/generic.d.ts +72 -0
  71. package/dist/tools/generic.js +242 -0
  72. package/dist/tools/generic.js.map +1 -0
  73. package/dist/tools/github.d.ts +21 -0
  74. package/dist/tools/github.js +80 -0
  75. package/dist/tools/github.js.map +1 -0
  76. package/dist/tools/hr.d.ts +97 -0
  77. package/dist/tools/hr.js +150 -0
  78. package/dist/tools/hr.js.map +1 -0
  79. package/dist/tools/inbox.d.ts +23 -0
  80. package/dist/tools/inbox.js +76 -0
  81. package/dist/tools/inbox.js.map +1 -0
  82. package/dist/tools/inventory.d.ts +61 -0
  83. package/dist/tools/inventory.js +103 -0
  84. package/dist/tools/inventory.js.map +1 -0
  85. package/dist/tools/issues.d.ts +63 -12
  86. package/dist/tools/issues.js +259 -48
  87. package/dist/tools/issues.js.map +1 -1
  88. package/dist/tools/labels.d.ts +52 -4
  89. package/dist/tools/labels.js +86 -4
  90. package/dist/tools/labels.js.map +1 -1
  91. package/dist/tools/log-time.d.ts +15 -1
  92. package/dist/tools/log-time.js +70 -6
  93. package/dist/tools/log-time.js.map +1 -1
  94. package/dist/tools/meetings.d.ts +30 -0
  95. package/dist/tools/meetings.js +78 -0
  96. package/dist/tools/meetings.js.map +1 -0
  97. package/dist/tools/members.d.ts +1 -1
  98. package/dist/tools/members.js +17 -1
  99. package/dist/tools/members.js.map +1 -1
  100. package/dist/tools/message-templates.d.ts +54 -0
  101. package/dist/tools/message-templates.js +88 -0
  102. package/dist/tools/message-templates.js.map +1 -0
  103. package/dist/tools/milestones.d.ts +9 -9
  104. package/dist/tools/organizations.d.ts +5 -5
  105. package/dist/tools/organizations.js +2 -1
  106. package/dist/tools/organizations.js.map +1 -1
  107. package/dist/tools/overview.d.ts +55 -0
  108. package/dist/tools/overview.js +395 -0
  109. package/dist/tools/overview.js.map +1 -0
  110. package/dist/tools/planner.d.ts +60 -0
  111. package/dist/tools/planner.js +145 -0
  112. package/dist/tools/planner.js.map +1 -0
  113. package/dist/tools/process.d.ts +50 -0
  114. package/dist/tools/process.js +137 -0
  115. package/dist/tools/process.js.map +1 -0
  116. package/dist/tools/products.d.ts +17 -0
  117. package/dist/tools/products.js +45 -0
  118. package/dist/tools/products.js.map +1 -0
  119. package/dist/tools/projects.d.ts +17 -4
  120. package/dist/tools/projects.js +31 -2
  121. package/dist/tools/projects.js.map +1 -1
  122. package/dist/tools/qms.d.ts +57 -0
  123. package/dist/tools/qms.js +171 -0
  124. package/dist/tools/qms.js.map +1 -0
  125. package/dist/tools/recruiting.d.ts +112 -0
  126. package/dist/tools/recruiting.js +203 -0
  127. package/dist/tools/recruiting.js.map +1 -0
  128. package/dist/tools/relations.d.ts +45 -3
  129. package/dist/tools/relations.js +128 -39
  130. package/dist/tools/relations.js.map +1 -1
  131. package/dist/tools/search.d.ts +14 -1
  132. package/dist/tools/search.js +29 -1
  133. package/dist/tools/search.js.map +1 -1
  134. package/dist/tools/sharing.d.ts +62 -0
  135. package/dist/tools/sharing.js +149 -0
  136. package/dist/tools/sharing.js.map +1 -0
  137. package/dist/tools/statuses.d.ts +3 -3
  138. package/dist/tools/surveys.d.ts +22 -0
  139. package/dist/tools/surveys.js +53 -0
  140. package/dist/tools/surveys.js.map +1 -0
  141. package/dist/tools/templates.d.ts +95 -0
  142. package/dist/tools/templates.js +260 -0
  143. package/dist/tools/templates.js.map +1 -0
  144. package/dist/tools/test-automation.d.ts +81 -0
  145. package/dist/tools/test-automation.js +225 -0
  146. package/dist/tools/test-automation.js.map +1 -0
  147. package/dist/tools/testing.d.ts +234 -0
  148. package/dist/tools/testing.js +401 -0
  149. package/dist/tools/testing.js.map +1 -0
  150. package/dist/tools/workspace-admin.d.ts +55 -0
  151. package/dist/tools/workspace-admin.js +117 -0
  152. package/dist/tools/workspace-admin.js.map +1 -0
  153. package/dist/tools/workspaces.d.ts +1 -1
  154. package/dist/utils/attributes.d.ts +37 -0
  155. package/dist/utils/attributes.js +188 -0
  156. package/dist/utils/attributes.js.map +1 -0
  157. package/dist/utils/classes.d.ts +51 -0
  158. package/dist/utils/classes.js +73 -0
  159. package/dist/utils/classes.js.map +1 -0
  160. package/dist/utils/content.d.ts +11 -0
  161. package/dist/utils/content.js +86 -0
  162. package/dist/utils/content.js.map +1 -0
  163. package/dist/utils/errors.js +1 -1
  164. package/dist/utils/errors.js.map +1 -1
  165. package/dist/utils/files.d.ts +5 -0
  166. package/dist/utils/files.js +50 -0
  167. package/dist/utils/files.js.map +1 -0
  168. package/dist/utils/format.d.ts +2 -0
  169. package/dist/utils/format.js +7 -13
  170. package/dist/utils/format.js.map +1 -1
  171. package/dist/utils/junit.d.ts +13 -0
  172. package/dist/utils/junit.js +81 -0
  173. package/dist/utils/junit.js.map +1 -0
  174. package/dist/utils/markdown.js +9 -4
  175. package/dist/utils/markdown.js.map +1 -1
  176. package/dist/utils/meeting.d.ts +13 -0
  177. package/dist/utils/meeting.js +118 -0
  178. package/dist/utils/meeting.js.map +1 -0
  179. package/dist/utils/people.d.ts +25 -0
  180. package/dist/utils/people.js +80 -0
  181. package/dist/utils/people.js.map +1 -0
  182. package/dist/utils/redact.d.ts +3 -0
  183. package/dist/utils/redact.js +26 -0
  184. package/dist/utils/redact.js.map +1 -0
  185. package/dist/utils/resolve.d.ts +17 -0
  186. package/dist/utils/resolve.js +54 -0
  187. package/dist/utils/resolve.js.map +1 -0
  188. package/dist/utils/spec.d.ts +10 -0
  189. package/dist/utils/spec.js +90 -0
  190. package/dist/utils/spec.js.map +1 -0
  191. package/dist/utils/storage.js +7 -3
  192. package/dist/utils/storage.js.map +1 -1
  193. package/dist/utils/tasks.d.ts +22 -0
  194. package/dist/utils/tasks.js +81 -0
  195. package/dist/utils/tasks.js.map +1 -0
  196. package/dist/watch.d.ts +62 -0
  197. package/dist/watch.js +405 -0
  198. package/dist/watch.js.map +1 -0
  199. package/package.json +4 -3
  200. package/scripts/setup.js +3 -1
@@ -0,0 +1,260 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.createIssueFromTemplate = exports.deleteIssueTemplate = exports.updateIssueTemplate = exports.createIssueTemplate = exports.getIssueTemplate = exports.listIssueTemplates = void 0;
40
+ // Issue templates (tracker:class:IssueTemplate): reusable issues with sub-issues.
41
+ // Like Huly's CreateIssueTemplate dialog; "issue from template" copies the template into
42
+ // a new issue plus one sub-issue per child, as Huly's CreateIssue + SubIssues do.
43
+ const tracker_1 = __importStar(require("@hcengineering/tracker"));
44
+ const tags_1 = __importDefault(require("@hcengineering/tags"));
45
+ const core_1 = require("@hcengineering/core");
46
+ const connection_1 = require("../connection");
47
+ const errors_1 = require("../utils/errors");
48
+ const format_1 = require("../utils/format");
49
+ const people_1 = require("../utils/people");
50
+ const issues_1 = require("./issues");
51
+ const labels_1 = require("./labels");
52
+ const agent_1 = require("./agent");
53
+ const PRIORITY = { NoPriority: tracker_1.IssuePriority.NoPriority, Urgent: tracker_1.IssuePriority.Urgent, High: tracker_1.IssuePriority.High, Medium: tracker_1.IssuePriority.Medium, Low: tracker_1.IssuePriority.Low };
54
+ const PRIORITY_NAME = Object.fromEntries(Object.entries(PRIORITY).map(([k, v]) => [v, k]));
55
+ async function findProject(client, identifier) {
56
+ const project = await client.findOne(tracker_1.default.class.Project, { identifier });
57
+ if (project == null)
58
+ throw new Error(`Project '${identifier}' not found.`);
59
+ return project;
60
+ }
61
+ async function byLabel(client, _class, project, label, what) {
62
+ if (label == null)
63
+ return null;
64
+ const all = await client.findAll(_class, { space: project._id });
65
+ const hit = all.find((x) => String(x.label).toLowerCase() === label.toLowerCase());
66
+ if (hit == null)
67
+ throw new Error(`${what} '${label}' not found in ${String(project.identifier)}. Available: ${all.map((x) => x.label).join(', ') || 'none'}.`);
68
+ return hit._id;
69
+ }
70
+ async function labelIds(client, names) {
71
+ const out = [];
72
+ for (const name of names ?? []) {
73
+ const tag = await client.findOne(tags_1.default.class.TagElement, { targetClass: tracker_1.default.class.Issue, title: name });
74
+ if (tag == null)
75
+ throw new Error(`Label '${name}' not found (create it first with create_label).`);
76
+ out.push(tag._id);
77
+ }
78
+ return out;
79
+ }
80
+ async function findTemplate(client, ref, projectIdentifier) {
81
+ const byId = await client.findOne(tracker_1.default.class.IssueTemplate, { _id: ref });
82
+ if (byId != null)
83
+ return byId;
84
+ const query = {};
85
+ if (projectIdentifier != null)
86
+ query.space = (await findProject(client, projectIdentifier))._id;
87
+ const all = await client.findAll(tracker_1.default.class.IssueTemplate, query);
88
+ const hits = all.filter((t) => String(t.title).toLowerCase() === ref.toLowerCase());
89
+ if (hits.length === 1)
90
+ return hits[0];
91
+ if (hits.length > 1)
92
+ throw new Error(`Template '${ref}' exists in several projects — pass projectIdentifier.`);
93
+ throw new Error(`Template '${ref}' not found.`);
94
+ }
95
+ async function templateData(client, project, t) {
96
+ return {
97
+ title: t.title.trim(),
98
+ description: (0, format_1.textToMarkup)(t.description ?? ''),
99
+ priority: PRIORITY[t.priority ?? 'NoPriority'],
100
+ assignee: t.assignee != null ? (await (0, people_1.findPerson)(client, t.assignee))._id : null,
101
+ component: await byLabel(client, tracker_1.default.class.Component, project, t.componentLabel, 'Component'),
102
+ milestone: await byLabel(client, tracker_1.default.class.Milestone, project, t.milestoneLabel, 'Milestone'),
103
+ estimation: t.estimation ?? 0,
104
+ labels: await labelIds(client, t.labels)
105
+ };
106
+ }
107
+ /** Names for display/creation: assignee, component, milestone and labels of a template (or child). */
108
+ async function names(client, t, people) {
109
+ const component = t.component != null ? (await client.findOne(tracker_1.default.class.Component, { _id: t.component }))?.label : undefined;
110
+ const milestone = t.milestone != null ? (await client.findOne(tracker_1.default.class.Milestone, { _id: t.milestone }))?.label : undefined;
111
+ const labels = (t.labels ?? []).length > 0 ? await client.findAll(tags_1.default.class.TagElement, { _id: { $in: t.labels } }) : [];
112
+ return { assignee: t.assignee != null ? people.get(t.assignee) : undefined, component, milestone, labels: labels.map((l) => l.title) };
113
+ }
114
+ function describe(t, n) {
115
+ const bits = [(0, format_1.priorityLabel)(t.priority)];
116
+ if (n.assignee != null)
117
+ bits.push(`@${n.assignee}`);
118
+ if (n.component != null)
119
+ bits.push(`component ${n.component}`);
120
+ if (n.milestone != null)
121
+ bits.push(`milestone ${n.milestone}`);
122
+ if ((t.estimation ?? 0) > 0)
123
+ bits.push(`${String(t.estimation)}d`);
124
+ if (n.labels.length > 0)
125
+ bits.push(`labels ${n.labels.join(', ')}`);
126
+ return bits.join(' · ');
127
+ }
128
+ exports.listIssueTemplates = (0, errors_1.wrapToolHandler)(async (args) => {
129
+ const client = await (0, connection_1.getConnection)(args.workspace);
130
+ const query = {};
131
+ if (args.projectIdentifier != null)
132
+ query.space = (await findProject(client, args.projectIdentifier))._id;
133
+ const templates = await client.findAll(tracker_1.default.class.IssueTemplate, query);
134
+ if (templates.length === 0)
135
+ return 'No issue templates.';
136
+ const projects = await client.findAll(tracker_1.default.class.Project, {});
137
+ const key = new Map(projects.map((p) => [p._id, p.identifier]));
138
+ return `## Issue templates (${templates.length})\n\n${templates.map((t) => `- **${String(t.title)}** [${String(key.get(t.space) ?? '?')}]${(t.children ?? []).length > 0 ? ` · ${String(t.children.length)} sub-issue(s)` : ''} — \`${String(t._id)}\``).join('\n')}`;
139
+ });
140
+ exports.getIssueTemplate = (0, errors_1.wrapToolHandler)(async (args) => {
141
+ const client = await (0, connection_1.getConnection)(args.workspace);
142
+ const t = await findTemplate(client, args.template, args.projectIdentifier);
143
+ const people = await (0, people_1.peopleNames)(client);
144
+ const lines = [`## Template: ${String(t.title)}`, '', describe(t, await names(client, t, people)), `**Id:** \`${String(t._id)}\``];
145
+ const desc = (0, format_1.markupToText)(t.description);
146
+ if (desc !== '')
147
+ lines.push('', '### Description', desc);
148
+ if ((t.children ?? []).length > 0) {
149
+ lines.push('', `### Sub-issues (${String(t.children.length)})`);
150
+ for (const c of t.children)
151
+ lines.push(`- **${String(c.title)}** — ${describe(c, await names(client, c, people))}`);
152
+ }
153
+ return lines.join('\n');
154
+ });
155
+ exports.createIssueTemplate = (0, errors_1.wrapToolHandler)(async (args) => {
156
+ const client = await (0, connection_1.getConnection)(args.workspace);
157
+ const project = await findProject(client, args.projectIdentifier);
158
+ const existing = await client.findOne(tracker_1.default.class.IssueTemplate, { space: project._id, title: args.title.trim() });
159
+ if (existing != null)
160
+ return `ℹ️ Template **${args.title}** already exists in ${args.projectIdentifier} — \`${String(existing._id)}\`.`;
161
+ const data = await templateData(client, project, args);
162
+ const children = [];
163
+ for (const c of args.children ?? [])
164
+ children.push({ id: (0, core_1.generateId)(), ...(await templateData(client, project, c)) });
165
+ const id = await client.createDoc(tracker_1.default.class.IssueTemplate, project._id, { ...data, children, comments: 0, attachments: 0, relations: [] });
166
+ return `✅ Template **${args.title}** created in ${args.projectIdentifier}${children.length > 0 ? ` with ${children.length} sub-issue(s)` : ''} — \`${String(id)}\`.`;
167
+ });
168
+ exports.updateIssueTemplate = (0, errors_1.wrapToolHandler)(async (args) => {
169
+ const client = await (0, connection_1.getConnection)(args.workspace);
170
+ const t = await findTemplate(client, args.template, args.projectIdentifier);
171
+ const project = await client.findOne(tracker_1.default.class.Project, { _id: t.space });
172
+ const update = {};
173
+ if (args.title != null)
174
+ update.title = args.title.trim();
175
+ if (args.description != null)
176
+ update.description = (0, format_1.textToMarkup)(args.description);
177
+ if (args.priority != null)
178
+ update.priority = PRIORITY[args.priority];
179
+ if (args.assignee !== undefined)
180
+ update.assignee = args.assignee != null ? (await (0, people_1.findPerson)(client, args.assignee))._id : null;
181
+ if (args.componentLabel !== undefined)
182
+ update.component = await byLabel(client, tracker_1.default.class.Component, project, args.componentLabel, 'Component');
183
+ if (args.milestoneLabel !== undefined)
184
+ update.milestone = await byLabel(client, tracker_1.default.class.Milestone, project, args.milestoneLabel, 'Milestone');
185
+ if (args.estimation != null)
186
+ update.estimation = args.estimation;
187
+ if (args.labels != null)
188
+ update.labels = await labelIds(client, args.labels);
189
+ if (args.children != null) {
190
+ const children = [];
191
+ for (const c of args.children)
192
+ children.push({ id: (0, core_1.generateId)(), ...(await templateData(client, project, c)) });
193
+ update.children = children;
194
+ }
195
+ if (Object.keys(update).length === 0)
196
+ throw new Error('Nothing to change.');
197
+ await client.updateDoc(tracker_1.default.class.IssueTemplate, t.space, t._id, update);
198
+ return `✅ Template **${String(update.title ?? t.title)}** updated: ${Object.keys(update).join(', ')}.`;
199
+ });
200
+ exports.deleteIssueTemplate = (0, errors_1.wrapToolHandler)(async (args) => {
201
+ const client = await (0, connection_1.getConnection)(args.workspace);
202
+ const t = await findTemplate(client, args.template, args.projectIdentifier);
203
+ await client.removeDoc(tracker_1.default.class.IssueTemplate, t.space, t._id);
204
+ return `✅ Template **${String(t.title)}** deleted.`;
205
+ });
206
+ const text = (r) => r.content[0].text;
207
+ exports.createIssueFromTemplate = (0, errors_1.wrapToolHandler)(async (args) => {
208
+ const client = await (0, connection_1.getConnection)(args.workspace);
209
+ const t = await findTemplate(client, args.template, args.projectIdentifier);
210
+ const project = await client.findOne(tracker_1.default.class.Project, { _id: t.space });
211
+ const people = await (0, people_1.peopleNames)(client);
212
+ const top = await names(client, t, people);
213
+ const title = args.title ?? String(t.title);
214
+ const description = (0, format_1.markupToText)(t.description);
215
+ const ws = args.workspace;
216
+ let id;
217
+ let childIds = [];
218
+ if ((t.children ?? []).length > 0) {
219
+ const kids = [];
220
+ for (const c of t.children) {
221
+ const n = await names(client, c, people);
222
+ kids.push({ title: String(c.title), description: (0, format_1.markupToText)(c.description) || undefined, priority: PRIORITY_NAME[c.priority], assignee: n.assignee, componentLabel: n.component, milestoneLabel: n.milestone, labels: n.labels });
223
+ }
224
+ const out = text(await (0, agent_1.createIssueTree)({ workspace: ws, projectIdentifier: project.identifier, epic: { title, description: description || undefined, priority: PRIORITY_NAME[t.priority], labels: top.labels }, children: kids, skipDuplicates: false, dryRun: false }));
225
+ const m = /under \*\*([A-Z][A-Z0-9]*-\d+)\*\*/.exec(out);
226
+ if (m == null)
227
+ throw new Error(`Unexpected result while creating the issue tree: ${out}`);
228
+ id = m[1];
229
+ childIds = [...out.matchAll(/^- ([A-Z][A-Z0-9]*-\d+):/gm)].map((x) => x[1]);
230
+ }
231
+ else {
232
+ const out = text(await (0, issues_1.createIssue)({ workspace: ws, projectIdentifier: project.identifier, title, description: description || undefined, priority: PRIORITY_NAME[t.priority] ?? 'NoPriority' }));
233
+ const m = /\*\*([A-Z][A-Z0-9]*-\d+)\*\*/.exec(out);
234
+ if (m == null)
235
+ throw new Error(`Unexpected result while creating the issue: ${out}`);
236
+ id = m[1];
237
+ for (const l of top.labels)
238
+ await (0, labels_1.addLabel)({ workspace: ws, identifier: id, labelName: l });
239
+ }
240
+ const fields = {};
241
+ if (top.assignee != null)
242
+ fields.assignee = top.assignee;
243
+ if (top.component != null)
244
+ fields.componentLabel = top.component;
245
+ if (top.milestone != null)
246
+ fields.milestoneLabel = top.milestone;
247
+ if (Object.keys(fields).length > 0)
248
+ await (0, issues_1.updateIssue)({ workspace: ws, identifier: id, ...fields });
249
+ // Estimation (man-days in templates, hours on issues in Huly 0.7 — both store the same number).
250
+ const estimates = [[id, t.estimation ?? 0], ...childIds.map((cid, i) => [cid, t.children[i]?.estimation ?? 0])];
251
+ for (const [iid, est] of estimates) {
252
+ if (est <= 0)
253
+ continue;
254
+ const issue = await client.findOne(tracker_1.default.class.Issue, { identifier: iid });
255
+ if (issue != null)
256
+ await client.updateDoc(tracker_1.default.class.Issue, issue.space, issue._id, { estimation: est });
257
+ }
258
+ return `✅ Created **${id}** "${title}" from template "${String(t.title)}"${(t.children ?? []).length > 0 ? ` with ${String(t.children.length)} sub-issue(s)` : ''}.`;
259
+ });
260
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/tools/templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ export interface ImportOptions {
2
+ workspace?: string;
3
+ project: string;
4
+ xml: string;
5
+ runName?: string;
6
+ parentSuite?: string;
7
+ createMissing?: boolean;
8
+ dryRun?: boolean;
9
+ }
10
+ export interface ImportSummary {
11
+ text: string;
12
+ passed: number;
13
+ failed: number;
14
+ skipped: number;
15
+ created: number;
16
+ unmatched: number;
17
+ runId?: string;
18
+ }
19
+ /** Imports JUnit XML as a new test run; one Huly suite per JUnit suite (under parentSuite, if given). */
20
+ export declare function importJUnit(o: ImportOptions): Promise<ImportSummary>;
21
+ export declare const importTestResults: (args: {
22
+ workspace: string;
23
+ project: string;
24
+ xml?: string | undefined;
25
+ file?: string | undefined;
26
+ runName?: string | undefined;
27
+ parentSuite?: string | undefined;
28
+ createMissing?: boolean | undefined;
29
+ dryRun?: boolean | undefined;
30
+ }) => Promise<{
31
+ content: Array<{
32
+ type: 'text';
33
+ text: string;
34
+ }>;
35
+ }>;
36
+ export declare const getTestReport: (args: {
37
+ workspace?: string | undefined;
38
+ project: string;
39
+ runs?: number | undefined;
40
+ limit?: number | undefined;
41
+ }) => Promise<{
42
+ content: Array<{
43
+ type: 'text';
44
+ text: string;
45
+ }>;
46
+ }>;
47
+ export declare const createIssueFromTestResult: (args: {
48
+ workspace: string;
49
+ result: string;
50
+ projectIdentifier: string;
51
+ title?: string | undefined;
52
+ priority?: "High" | "Low" | "Medium" | "NoPriority" | "Urgent" | undefined;
53
+ notes?: string | undefined;
54
+ componentLabel?: string | undefined;
55
+ milestoneLabel?: string | undefined;
56
+ assignee?: string | undefined;
57
+ }) => Promise<{
58
+ content: Array<{
59
+ type: 'text';
60
+ text: string;
61
+ }>;
62
+ }>;
63
+ export declare const createTestCases: (args: {
64
+ workspace: string;
65
+ project: string;
66
+ suite: string;
67
+ createSuite?: boolean | undefined;
68
+ parentSuite?: string | undefined;
69
+ cases: {
70
+ name: string;
71
+ description?: string | undefined;
72
+ type?: "Functional" | "Performance" | "Regression" | "Security" | "Smoke" | "Usability" | undefined;
73
+ priority?: "High" | "Low" | "Medium" | "Urgent" | undefined;
74
+ assignee?: string | undefined;
75
+ }[];
76
+ }) => Promise<{
77
+ content: Array<{
78
+ type: 'text';
79
+ text: string;
80
+ }>;
81
+ }>;
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createTestCases = exports.createIssueFromTestResult = exports.getTestReport = exports.importTestResults = void 0;
4
+ exports.importJUnit = importJUnit;
5
+ // Test management beyond clicking: CI results in (JUnit XML), bugs out of failed results, a report
6
+ // over recent runs (failing now, flaky, never run) and bulk case creation.
7
+ const promises_1 = require("node:fs/promises");
8
+ const core_1 = require("@hcengineering/core");
9
+ const connection_1 = require("../connection");
10
+ const errors_1 = require("../utils/errors");
11
+ const content_1 = require("../utils/content");
12
+ const people_1 = require("../utils/people");
13
+ const junit_1 = require("../utils/junit");
14
+ const testing_1 = require("./testing");
15
+ const issues_1 = require("./issues");
16
+ const MAX_DETAILS = 4000;
17
+ const UNTESTED = 0;
18
+ const BLOCKED = 1;
19
+ const PASSED = 2;
20
+ const FAILED = 3;
21
+ const resultComment = (c) => {
22
+ if (c.status === 'passed')
23
+ return undefined;
24
+ const parts = [c.status === 'skipped' ? `Skipped${c.message != null ? `: ${c.message}` : ''}` : `**${c.message ?? 'Failed'}**`];
25
+ if (c.details != null)
26
+ parts.push('```\n' + (c.details.length > MAX_DETAILS ? c.details.slice(0, MAX_DETAILS) + '\n… (truncated)' : c.details) + '\n```');
27
+ if (c.time != null)
28
+ parts.push(`Duration: ${c.time.toFixed(2)} s`);
29
+ return parts.join('\n\n');
30
+ };
31
+ /** Imports JUnit XML as a new test run; one Huly suite per JUnit suite (under parentSuite, if given). */
32
+ async function importJUnit(o) {
33
+ const cases = (0, junit_1.parseJUnit)(o.xml);
34
+ if (cases.length === 0)
35
+ throw new Error('The report contains no test cases.');
36
+ const client = await (0, connection_1.getConnection)(o.workspace);
37
+ const project = await (0, testing_1.findProject)(client, o.project);
38
+ const parent = o.parentSuite != null ? await (0, testing_1.findSuite)(client, project, o.parentSuite) : undefined;
39
+ const parentId = parent?._id ?? testing_1.TM.NoParent;
40
+ const create = o.createMissing !== false;
41
+ const suites = await client.findAll(testing_1.TM.Suite, { space: project._id, parent: parentId });
42
+ const existing = await client.findAll(testing_1.TM.Case, { space: project._id });
43
+ const suiteIds = new Map();
44
+ for (const sName of new Set(cases.map((c) => c.suite)))
45
+ suiteIds.set(sName, suites.find((s) => String(s.name).toLowerCase() === sName.toLowerCase())?._id);
46
+ const plan = cases.map((c) => {
47
+ const sid = suiteIds.get(c.suite);
48
+ const hit = sid != null ? existing.find((x) => x.attachedTo === sid && String(x.name).toLowerCase() === c.name.toLowerCase()) : undefined;
49
+ return { c, caseId: hit?._id, isNew: hit == null };
50
+ });
51
+ const missing = plan.filter((p) => p.isNew);
52
+ const newSuites = [...suiteIds].filter(([, id]) => id == null).map(([s]) => s);
53
+ const count = (s) => cases.filter((c) => c.status === s).length;
54
+ const summary = { text: '', passed: count('passed'), failed: count('failed'), skipped: count('skipped'), created: create ? missing.length : 0, unmatched: create ? 0 : missing.length };
55
+ const runName = o.runName ?? `CI ${new Date().toISOString().slice(0, 16).replace('T', ' ')}`;
56
+ const head = `${summary.passed} passed, ${summary.failed} failed, ${summary.skipped} skipped`;
57
+ if (o.dryRun === true) {
58
+ summary.text = [`Dry run: would create run **${runName}** in ${String(project.name)} — ${head}.`,
59
+ create ? `Would create ${newSuites.length} suite(s) and ${missing.length} case(s).` : `${missing.length} case(s) have no match and would be left out (createMissing: false).`,
60
+ 'Nothing was changed.'].join('\n');
61
+ return summary;
62
+ }
63
+ if (!create && missing.length === cases.length)
64
+ throw new Error(`None of the ${cases.length} test(s) match a case in ${String(project.name)} — import with createMissing: true.`);
65
+ for (const s of newSuites) {
66
+ if (!create)
67
+ continue;
68
+ suiteIds.set(s, await client.createDoc(testing_1.TM.Suite, project._id, { name: s, description: '', parent: parentId }));
69
+ }
70
+ if (create) {
71
+ for (const p of missing) {
72
+ const sid = suiteIds.get(p.c.suite);
73
+ p.caseId = await client.addCollection(testing_1.TM.Case, project._id, sid, testing_1.TM.Suite, 'testCases', {
74
+ name: p.c.name, description: null, type: (0, testing_1.idx)(testing_1.CASE_TYPES, 'Regression'), priority: (0, testing_1.idx)(testing_1.CASE_PRIORITIES, 'Medium'), status: 3 /* Approved */, assignee: null, attachments: 0
75
+ });
76
+ }
77
+ }
78
+ const runId = await client.createDoc(testing_1.TM.Run, project._id, { name: runName, description: null });
79
+ for (const p of plan) {
80
+ if (p.caseId == null)
81
+ continue;
82
+ const comment = resultComment(p.c);
83
+ await client.addCollection(testing_1.TM.Result, project._id, runId, testing_1.TM.Run, 'results', {
84
+ name: p.c.name,
85
+ testCase: p.caseId,
86
+ testSuite: suiteIds.get(p.c.suite),
87
+ description: comment != null ? await (0, content_1.writeMarkup)(o.workspace, `testresult-${(0, core_1.generateId)()}`, comment) : null,
88
+ status: p.c.status === 'passed' ? PASSED : p.c.status === 'failed' ? FAILED : UNTESTED,
89
+ assignee: null
90
+ });
91
+ }
92
+ summary.runId = runId;
93
+ const failed = cases.filter((c) => c.status === 'failed').slice(0, 15).map((c) => `- ❌ ${c.suite} › ${c.name}${c.message != null ? ` — ${c.message.slice(0, 160)}` : ''}`);
94
+ summary.text = [
95
+ `✅ Run **${runName}** imported into ${String(project.name)} — ${head} — \`${runId}\``,
96
+ create && missing.length > 0 ? `Created ${newSuites.length} suite(s) and ${missing.length} new case(s).` : '',
97
+ !create && missing.length > 0 ? `⚠️ ${missing.length} test(s) without a matching case were left out.` : '',
98
+ failed.length > 0 ? `\n### Failed\n${failed.join('\n')}${summary.failed > 15 ? `\n… ${summary.failed - 15} more` : ''}` : ''
99
+ ].filter((x) => x !== '').join('\n');
100
+ return summary;
101
+ }
102
+ exports.importTestResults = (0, errors_1.wrapToolHandler)(async (args) => {
103
+ if ((args.xml == null) === (args.file == null))
104
+ throw new Error('Pass either xml (the report) or file (a path on the machine running this server).');
105
+ const xml = args.xml ?? await (0, promises_1.readFile)(args.file, 'utf8');
106
+ return (await importJUnit({ workspace: args.workspace, project: args.project, xml, runName: args.runName, parentSuite: args.parentSuite, createMissing: args.createMissing, dryRun: args.dryRun })).text;
107
+ });
108
+ const SYMBOL = ['·', '⛔', '✅', '❌'];
109
+ exports.getTestReport = (0, errors_1.wrapToolHandler)(async (args) => {
110
+ const client = await (0, connection_1.getConnection)(args.workspace);
111
+ const project = await (0, testing_1.findProject)(client, args.project);
112
+ const runs = (await client.findAll(testing_1.TM.Run, { space: project._id }, { sort: { createdOn: core_1.SortingOrder.Descending }, limit: args.runs ?? 10 })).sort((a, b) => Number(a.createdOn ?? 0) - Number(b.createdOn ?? 0));
113
+ const cases = await client.findAll(testing_1.TM.Case, { space: project._id });
114
+ const suites = await client.findAll(testing_1.TM.Suite, { space: project._id });
115
+ if (cases.length === 0)
116
+ return `No test cases in ${String(project.name)}.`;
117
+ const results = runs.length > 0 ? await client.findAll(testing_1.TM.Result, { attachedTo: { $in: runs.map((r) => r._id) } }) : [];
118
+ const history = new Map();
119
+ for (const r of runs) {
120
+ for (const res of results.filter((x) => x.attachedTo === r._id)) {
121
+ const h = history.get(res.testCase) ?? [];
122
+ h.push(res.status ?? UNTESTED);
123
+ history.set(res.testCase, h);
124
+ }
125
+ }
126
+ const suiteName = (id) => String(suites.find((s) => s._id === id)?.name ?? '?');
127
+ const label = (c) => `${suiteName(c.attachedTo)} › ${String(c.name)}`;
128
+ const tested = (h) => (h ?? []).filter((s) => s === PASSED || s === FAILED);
129
+ const switches = (h) => h.slice(1).filter((s, i) => s !== h[i]).length;
130
+ const latest = (c) => tested(history.get(c._id)).at(-1);
131
+ const failing = cases.filter((c) => latest(c) === FAILED);
132
+ const flaky = cases.filter((c) => switches(tested(history.get(c._id))) >= 2);
133
+ const never = cases.filter((c) => tested(history.get(c._id)).length === 0);
134
+ const blocked = cases.filter((c) => (history.get(c._id) ?? []).at(-1) === BLOCKED);
135
+ const withLatest = cases.filter((c) => latest(c) != null);
136
+ const rate = withLatest.length > 0 ? Math.round(100 * withLatest.filter((c) => latest(c) === PASSED).length / withLatest.length) : undefined;
137
+ const line = (c) => `- ${label(c)} ${(history.get(c._id) ?? []).map((s) => SYMBOL[s] ?? '?').join('')} — \`${String(c._id)}\``;
138
+ const max = args.limit ?? 25;
139
+ const section = (title, list) => list.length === 0 ? [] : ['', `### ${title} (${list.length})`, ...list.slice(0, max).map(line), ...(list.length > max ? [`… ${list.length - max} more`] : [])];
140
+ const bySuite = suites.map((s) => {
141
+ const mine = cases.filter((c) => c.attachedTo === s._id);
142
+ if (mine.length === 0)
143
+ return undefined;
144
+ const p = mine.filter((c) => latest(c) === PASSED).length;
145
+ const f = mine.filter((c) => latest(c) === FAILED).length;
146
+ return `| ${String(s.name)} | ${mine.length} | ${p} | ${f} | ${mine.length - p - f} |`;
147
+ }).filter((x) => x != null);
148
+ return [
149
+ `## Test report: ${String(project.name)}`,
150
+ `${cases.length} case(s) · last ${runs.length} run(s)${runs.length > 0 ? ` (${String(runs[0].name)} → ${String(runs.at(-1).name)})` : ''} · pass rate of latest results: ${rate != null ? `${rate}%` : '—'}`,
151
+ 'History oldest → newest: ✅ passed ❌ failed ⛔ blocked · untested',
152
+ ...section('Failing now', failing),
153
+ ...section('Flaky (flipped between pass and fail at least twice)', flaky),
154
+ ...section('Blocked in the latest run', blocked),
155
+ ...section('Never run in these runs', never),
156
+ ...(bySuite.length > 0 ? ['', '### By suite (latest result)', '| Suite | Cases | Passed | Failed | Not run |', '|---|---|---|---|---|', ...bySuite] : [])
157
+ ].join('\n');
158
+ });
159
+ exports.createIssueFromTestResult = (0, errors_1.wrapToolHandler)(async (args) => {
160
+ const client = await (0, connection_1.getConnection)(args.workspace);
161
+ const result = await (0, testing_1.findDoc)(client, testing_1.TM.Result, args.result, 'Test result');
162
+ const testCase = await client.findOne(testing_1.TM.Case, { _id: result.testCase });
163
+ const run = await client.findOne(testing_1.TM.Run, { _id: result.attachedTo });
164
+ const steps = testCase != null ? await (0, content_1.readMarkup)(args.workspace, testCase.description) : '';
165
+ const outcome = await (0, content_1.readMarkup)(args.workspace, result.description);
166
+ const description = [
167
+ `Test **${String(result.name)}** ${(0, testing_1.name)(testing_1.RESULT_STATUSES, result.status ?? UNTESTED).toLowerCase()} in run "${String(run?.name ?? '?')}".`,
168
+ steps.trim() !== '' ? `## Steps\n\n${steps}` : '',
169
+ outcome.trim() !== '' ? `## Result\n\n${outcome}` : '',
170
+ args.notes != null ? `## Notes\n\n${args.notes}` : ''
171
+ ].filter((x) => x !== '').join('\n\n');
172
+ const created = (await (0, issues_1.createIssue)({ workspace: args.workspace, projectIdentifier: args.projectIdentifier, title: args.title ?? `Test failed: ${String(result.name)}`, description, priority: args.priority ?? 'High' })).content[0].text;
173
+ const identifier = /\*\*([A-Z0-9]+-\d+)\*\*/.exec(created)?.[1];
174
+ if (identifier == null)
175
+ throw new Error(`Issue created, but its identifier could not be read: ${created}`);
176
+ const extra = [];
177
+ if (args.componentLabel != null || args.milestoneLabel != null || args.assignee != null) {
178
+ await (0, issues_1.updateIssue)({ workspace: args.workspace, identifier, componentLabel: args.componentLabel, milestoneLabel: args.milestoneLabel, assignee: args.assignee });
179
+ extra.push(...[args.componentLabel != null ? `component ${args.componentLabel}` : '', args.milestoneLabel != null ? `milestone ${args.milestoneLabel}` : '', args.assignee != null ? `assignee ${args.assignee}` : ''].filter((x) => x !== ''));
180
+ }
181
+ const issue = await client.findOne('tracker:class:Issue', { identifier });
182
+ if (issue != null && testCase != null) {
183
+ await client.updateDoc('tracker:class:Issue', issue.space, issue._id, { relations: [...(issue.relations ?? []), { _id: testCase._id, _class: testing_1.TM.Case }] });
184
+ }
185
+ await client.addCollection('chunter:class:ChatMessage', result.space, result._id, testing_1.TM.Result, 'comments', { message: `Bug filed: ${identifier}` });
186
+ return `✅ **${identifier}** filed from test result "${String(result.name)}"${extra.length > 0 ? ` (${extra.join(', ')})` : ''}; related to the test case, and the result has a comment pointing to it.`;
187
+ });
188
+ exports.createTestCases = (0, errors_1.wrapToolHandler)(async (args) => {
189
+ const client = await (0, connection_1.getConnection)(args.workspace);
190
+ const project = await (0, testing_1.findProject)(client, args.project);
191
+ let suite;
192
+ try {
193
+ suite = await (0, testing_1.findSuite)(client, project, args.suite);
194
+ }
195
+ catch (e) {
196
+ if (args.createSuite !== true)
197
+ throw e;
198
+ const parent = args.parentSuite != null ? await (0, testing_1.findSuite)(client, project, args.parentSuite) : undefined;
199
+ suite = { _id: await client.createDoc(testing_1.TM.Suite, project._id, { name: args.suite, description: '', parent: parent?._id ?? testing_1.TM.NoParent }), name: args.suite };
200
+ }
201
+ const existing = await client.findAll(testing_1.TM.Case, { space: project._id, attachedTo: suite._id });
202
+ const seen = new Set(existing.map((c) => String(c.name).toLowerCase()));
203
+ const made = [];
204
+ const skipped = [];
205
+ for (const c of args.cases) {
206
+ if (seen.has(c.name.toLowerCase())) {
207
+ skipped.push(c.name);
208
+ continue;
209
+ }
210
+ seen.add(c.name.toLowerCase());
211
+ const assignee = c.assignee != null ? (await (0, people_1.findPerson)(client, c.assignee))._id : null;
212
+ await client.addCollection(testing_1.TM.Case, project._id, suite._id, testing_1.TM.Suite, 'testCases', {
213
+ name: c.name,
214
+ description: c.description != null && c.description !== '' ? await (0, content_1.writeMarkup)(args.workspace, `testcase-${(0, core_1.generateId)()}`, c.description) : null,
215
+ type: (0, testing_1.idx)(testing_1.CASE_TYPES, c.type ?? 'Functional'),
216
+ priority: (0, testing_1.idx)(testing_1.CASE_PRIORITIES, c.priority ?? 'Medium'),
217
+ status: 0,
218
+ assignee,
219
+ attachments: 0
220
+ });
221
+ made.push(c.name);
222
+ }
223
+ return `✅ ${made.length} case(s) created in "${String(suite.name)}"${skipped.length > 0 ? `; skipped ${skipped.length} that already exist: ${skipped.slice(0, 10).join(', ')}` : ''}.`;
224
+ });
225
+ //# sourceMappingURL=test-automation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-automation.js","sourceRoot":"","sources":["../../src/tools/test-automation.ts"],"names":[],"mappings":";;;;AAAA,mGAAmG;AACnG,2EAA2E;AAC3E,+CAA2C;AAC3C,8CAA8D;AAC9D,8CAA6C;AAC7C,4CAAiD;AACjD,8CAA0D;AAC1D,4CAA4C;AAC5C,0CAA2D;AAC3D,uCAAwH;AACxH,qCAAmD;AAInD,MAAM,WAAW,GAAG,IAAI,CAAA;AACxB,MAAM,QAAQ,GAAG,CAAC,CAAC;AAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AAAC,MAAM,MAAM,GAAG,CAAC,CAAC;AAAC,MAAM,MAAM,GAAG,CAAC,CAAA;AAczE,MAAM,aAAa,GAAG,CAAC,CAAY,EAAsB,EAAE;IACzD,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAA;IAC3C,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,IAAI,QAAQ,IAAI,CAAC,CAAA;IAC/H,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAA;IACzJ,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAClE,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AAC3B,CAAC,CAAA;AAED,yGAAyG;AAClG,KAAK,sBAAuB,CAAgB;IACjD,MAAM,KAAK,GAAG,IAAA,kBAAU,EAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IAC7E,MAAM,MAAM,GAAQ,MAAM,IAAA,0BAAa,EAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IACpD,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAW,EAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAA;IACpD,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,IAAA,mBAAS,EAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAClG,MAAM,QAAQ,GAAW,MAAM,EAAE,GAAG,IAAI,YAAE,CAAC,QAAQ,CAAA;IACnD,MAAM,MAAM,GAAG,CAAC,CAAC,aAAa,KAAK,KAAK,CAAA;IACxC,MAAM,MAAM,GAAU,MAAM,MAAM,CAAC,OAAO,CAAC,YAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;IAC9F,MAAM,QAAQ,GAAU,MAAM,MAAM,CAAC,OAAO,CAAC,YAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC7E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAA;IACtD,KAAK,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA;IAE1J,MAAM,IAAI,GAA6D,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACrF,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;QACjC,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACzI,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,IAAI,IAAI,EAAE,CAAA;IACpD,CAAC,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;IAC9E,MAAM,KAAK,GAAG,CAAC,CAAsB,EAAU,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,MAAM,CAAA;IAC5F,MAAM,OAAO,GAAkB,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAA;IACtM,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAA;IAC5F,MAAM,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,YAAY,OAAO,CAAC,MAAM,YAAY,OAAO,CAAC,OAAO,UAAU,CAAA;IAE7F,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,GAAG,CAAC,+BAA+B,OAAO,SAAS,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,GAAG;YAC9F,MAAM,CAAC,CAAC,CAAC,gBAAgB,SAAS,CAAC,MAAM,iBAAiB,OAAO,CAAC,MAAM,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,sEAAsE;YAC7K,sBAAsB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACpC,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,eAAe,KAAK,CAAC,MAAM,4BAA4B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAA;IAEjL,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM;YAAE,SAAQ;QACrB,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,MAAM,CAAC,SAAS,CAAC,YAAE,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;IAChH,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAE,CAAA;YACpC,CAAC,CAAC,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,YAAE,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,YAAE,CAAC,KAAK,EAAE,WAAW,EAAE;gBACtF,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAA,aAAG,EAAC,oBAAU,EAAE,YAAY,CAAC,EAAE,QAAQ,EAAE,IAAA,aAAG,EAAC,yBAAe,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;aAC3K,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,YAAE,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;IAC/F,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI;YAAE,SAAQ;QAC9B,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAClC,MAAM,MAAM,CAAC,aAAa,CAAC,YAAE,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,YAAE,CAAC,GAAG,EAAE,SAAS,EAAE;YAC3E,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;YACd,QAAQ,EAAE,CAAC,CAAC,MAAM;YAClB,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAClC,WAAW,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,IAAA,qBAAW,EAAC,CAAC,CAAC,SAAS,EAAE,cAAc,IAAA,iBAAU,GAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI;YAC3G,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;YACtF,QAAQ,EAAE,IAAI;SACf,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,CAAC,KAAK,GAAG,KAAK,CAAA;IACrB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC1K,OAAO,CAAC,IAAI,GAAG;QACb,WAAW,OAAO,oBAAoB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,QAAQ,KAAK,IAAI;QACrF,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,SAAS,CAAC,MAAM,iBAAiB,OAAO,CAAC,MAAM,eAAe,CAAC,CAAC,CAAC,EAAE;QAC7G,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,iDAAiD,CAAC,CAAC,CAAC,EAAE;QAC1G,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;KAC7H,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACpC,OAAO,OAAO,CAAA;AAChB,CAAC;AAEY,QAAA,iBAAiB,GAAG,IAAA,wBAAe,EAA4C,KAAK,EAAE,IAAI,EAAE,EAAE;IACzG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAA;IACpJ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,MAAM,IAAA,mBAAQ,EAAC,IAAI,CAAC,IAAK,EAAE,MAAM,CAAC,CAAA;IAC1D,OAAO,CAAC,MAAM,WAAW,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AAC1M,CAAC,CAAC,CAAA;AAEF,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;AAEtB,QAAA,aAAa,GAAG,IAAA,wBAAe,EAAwC,KAAK,EAAE,IAAI,EAAE,EAAE;IACjG,MAAM,MAAM,GAAQ,MAAM,IAAA,0BAAa,EAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACvD,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAW,EAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;IACvD,MAAM,IAAI,GAAU,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,YAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,mBAAY,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAA;IAClO,MAAM,KAAK,GAAU,MAAM,MAAM,CAAC,OAAO,CAAC,YAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC1E,MAAM,MAAM,GAAU,MAAM,MAAM,CAAC,OAAO,CAAC,YAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC5E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,oBAAoB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAA;IAC1E,MAAM,OAAO,GAAU,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC9H,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAA;IAC3C,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAChE,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;YACzC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAA;YAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAG,CAAC,EAAU,EAAU,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,IAAI,IAAI,GAAG,CAAC,CAAA;IAC/F,MAAM,KAAK,GAAG,CAAC,CAAM,EAAU,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAA;IAClF,MAAM,MAAM,GAAG,CAAC,CAAuB,EAAY,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM,CAAC,CAAA;IAC3G,MAAM,QAAQ,GAAG,CAAC,CAAW,EAAU,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IACxF,MAAM,MAAM,GAAG,CAAC,CAAM,EAAsB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAChF,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAA;IACzD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IAC5E,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAA;IAC1E,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAA;IAClF,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAA;IACzD,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC5I,MAAM,IAAI,GAAG,CAAC,CAAM,EAAU,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAA;IAC3I,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAA;IAC5B,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,IAAW,EAAY,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACxN,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,GAAG,CAAC,CAAA;QACxD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAA;QACvC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,MAAM,CAAA;QACpH,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAA;IACxF,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAA;IAC3B,OAAO;QACL,mBAAmB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACzC,GAAG,KAAK,CAAC,MAAM,mBAAmB,IAAI,CAAC,MAAM,UAAU,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,mCAAmC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE;QAC5M,iEAAiE;QACjE,GAAG,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC;QAClC,GAAG,OAAO,CAAC,sDAAsD,EAAE,KAAK,CAAC;QACzE,GAAG,OAAO,CAAC,2BAA2B,EAAE,OAAO,CAAC;QAChD,GAAG,OAAO,CAAC,yBAAyB,EAAE,KAAK,CAAC;QAC5C,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,8BAA8B,EAAE,+CAA+C,EAAE,uBAAuB,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1J,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC,CAAC,CAAA;AAEW,QAAA,yBAAyB,GAAG,IAAA,wBAAe,EAAoD,KAAK,EAAE,IAAI,EAAE,EAAE;IACzH,MAAM,MAAM,GAAQ,MAAM,IAAA,0BAAa,EAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACvD,MAAM,MAAM,GAAG,MAAM,IAAA,iBAAO,EAAC,MAAM,EAAE,YAAE,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAC3E,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,YAAE,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;IACxE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,YAAE,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAA;IACpE,MAAM,KAAK,GAAG,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,IAAA,oBAAU,EAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC5F,MAAM,OAAO,GAAG,MAAM,IAAA,oBAAU,EAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;IACpE,MAAM,WAAW,GAAG;QAClB,UAAU,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAA,cAAI,EAAC,yBAAe,EAAE,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,WAAW,EAAE,YAAY,MAAM,CAAC,GAAG,EAAE,IAAI,IAAI,GAAG,CAAC,IAAI;QACzI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;QACjD,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;QACtD,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;KACtD,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACtC,MAAM,OAAO,GAAG,CAAC,MAAM,IAAA,oBAAW,EAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,gBAAgB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,MAAM,EAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAChP,MAAM,UAAU,GAAG,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC/D,IAAI,UAAU,IAAI,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,OAAO,EAAE,CAAC,CAAA;IAC1G,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;QACxF,MAAM,IAAA,oBAAW,EAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAS,CAAC,CAAA;QACtK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IACjP,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;IACzE,IAAI,KAAK,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACtC,MAAM,MAAM,CAAC,SAAS,CAAC,qBAAqB,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,YAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;IAC5J,CAAC;IACD,MAAM,MAAM,CAAC,aAAa,CAAC,2BAA2B,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,YAAE,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,cAAc,UAAU,EAAE,EAAE,CAAC,CAAA;IACjJ,OAAO,OAAO,UAAU,8BAA8B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,0EAA0E,CAAA;AACzM,CAAC,CAAC,CAAA;AAEW,QAAA,eAAe,GAAG,IAAA,wBAAe,EAA0C,KAAK,EAAE,IAAI,EAAE,EAAE;IACrG,MAAM,MAAM,GAAQ,MAAM,IAAA,0BAAa,EAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACvD,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAW,EAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;IACvD,IAAI,KAAU,CAAA;IACd,IAAI,CAAC;QAAC,KAAK,GAAG,MAAM,IAAA,mBAAS,EAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IAAC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACtE,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI;YAAE,MAAM,CAAC,CAAA;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,IAAA,mBAAS,EAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACxG,KAAK,GAAG,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC,SAAS,CAAC,YAAE,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,YAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAA;IAC7J,CAAC;IACD,MAAM,QAAQ,GAAU,MAAM,MAAM,CAAC,OAAO,CAAC,YAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAA;IACpG,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IACvE,MAAM,IAAI,GAAa,EAAE,CAAC;IAAC,MAAM,OAAO,GAAa,EAAE,CAAA;IACvD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAC,SAAQ;QAAC,CAAC;QACtE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;QAC9B,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,IAAA,mBAAU,EAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;QACvF,MAAM,MAAM,CAAC,aAAa,CAAC,YAAE,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,YAAE,CAAC,KAAK,EAAE,WAAW,EAAE;YACjF,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,IAAI,IAAI,CAAC,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,IAAA,qBAAW,EAAC,IAAI,CAAC,SAAS,EAAE,YAAY,IAAA,iBAAU,GAAE,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;YAChJ,IAAI,EAAE,IAAA,aAAG,EAAC,oBAAU,EAAE,CAAC,CAAC,IAAI,IAAI,YAAY,CAAC;YAC7C,QAAQ,EAAE,IAAA,aAAG,EAAC,yBAAe,EAAE,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC;YACtD,MAAM,EAAE,CAAC;YACT,QAAQ;YACR,WAAW,EAAE,CAAC;SACf,CAAC,CAAA;QACF,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IACnB,CAAC;IACD,OAAO,KAAK,IAAI,CAAC,MAAM,wBAAwB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,OAAO,CAAC,MAAM,wBAAwB,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAA;AACxL,CAAC,CAAC,CAAA"}