@decaf-ts/mcp-server 0.0.2 → 0.0.4
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.
- package/LICENSE.md +86 -21
- package/README.md +13 -13
- package/dist/mcp-server.cjs +893 -187
- package/dist/mcp-server.esm.cjs +888 -180
- package/lib/McpWrapper.cjs +189 -0
- package/lib/McpWrapper.d.ts +101 -0
- package/lib/bin/cli.cjs +30 -54
- package/lib/bin/cli.d.ts +18 -44
- package/lib/constants.cjs +12 -0
- package/lib/constants.d.ts +8 -0
- package/lib/esm/McpWrapper.d.ts +101 -0
- package/lib/esm/McpWrapper.js +182 -0
- package/lib/esm/bin/cli.d.ts +18 -44
- package/lib/esm/bin/cli.js +28 -55
- package/lib/esm/constants.d.ts +8 -0
- package/lib/esm/constants.js +9 -0
- package/lib/esm/index.d.ts +5 -26
- package/lib/esm/index.js +6 -27
- package/lib/esm/mcp/index.d.ts +1 -0
- package/lib/esm/mcp/index.js +2 -0
- package/lib/esm/metadata.d.ts +9 -0
- package/lib/esm/metadata.js +22 -0
- package/lib/esm/modules/decoration/index.d.ts +0 -0
- package/lib/esm/modules/decoration/index.js +2 -0
- package/lib/esm/modules/mcp/decoration-assist.d.ts +39 -0
- package/lib/esm/modules/mcp/decoration-assist.js +353 -0
- package/lib/esm/modules/mcp/decorator-tools.d.ts +118 -0
- package/lib/esm/modules/mcp/decorator-tools.js +237 -0
- package/lib/esm/modules/mcp/index.d.ts +2 -0
- package/lib/esm/modules/mcp/index.js +3 -0
- package/lib/esm/modules/mcp/mcp-module.d.ts +230 -0
- package/lib/esm/modules/mcp/mcp-module.js +406 -0
- package/lib/esm/types.d.ts +15 -0
- package/lib/esm/types.js +2 -0
- package/lib/esm/utils.d.ts +54 -13
- package/lib/esm/utils.js +78 -15
- package/lib/index.cjs +6 -28
- package/lib/index.d.ts +5 -26
- package/lib/mcp/index.cjs +17 -0
- package/lib/mcp/index.d.ts +1 -0
- package/lib/metadata.cjs +25 -0
- package/lib/metadata.d.ts +9 -0
- package/lib/modules/decoration/index.cjs +2 -0
- package/lib/modules/decoration/index.d.ts +0 -0
- package/lib/modules/mcp/decoration-assist.cjs +360 -0
- package/lib/modules/mcp/decoration-assist.d.ts +39 -0
- package/lib/modules/mcp/decorator-tools.cjs +243 -0
- package/lib/modules/mcp/decorator-tools.d.ts +118 -0
- package/lib/modules/mcp/index.cjs +24 -0
- package/lib/modules/mcp/index.d.ts +2 -0
- package/lib/modules/mcp/mcp-module.cjs +452 -0
- package/lib/modules/mcp/mcp-module.d.ts +230 -0
- package/lib/types.cjs +3 -0
- package/lib/types.d.ts +15 -0
- package/lib/utils.cjs +116 -16
- package/lib/utils.d.ts +54 -13
- package/package.json +35 -7
- package/lib/esm/namespace/Class.d.ts +0 -74
- package/lib/esm/namespace/Class.js +0 -73
- package/lib/esm/namespace/Interface.d.ts +0 -17
- package/lib/esm/namespace/Interface.js +0 -2
- package/lib/esm/namespace/children/ChildClass.d.ts +0 -44
- package/lib/esm/namespace/children/ChildClass.js +0 -43
- package/lib/esm/namespace/children/ChildInterface.d.ts +0 -22
- package/lib/esm/namespace/children/ChildInterface.js +0 -2
- package/lib/esm/namespace/children/Enum.d.ts +0 -14
- package/lib/esm/namespace/children/Enum.js +0 -16
- package/lib/esm/namespace/children/function.d.ts +0 -31
- package/lib/esm/namespace/children/function.js +0 -33
- package/lib/esm/namespace/children/index.d.ts +0 -25
- package/lib/esm/namespace/children/index.js +0 -26
- package/lib/esm/namespace/index.d.ts +0 -18
- package/lib/esm/namespace/index.js +0 -19
- package/lib/esm/namespace/type.d.ts +0 -28
- package/lib/esm/namespace/type.js +0 -2
- package/lib/namespace/Class.cjs +0 -77
- package/lib/namespace/Class.d.ts +0 -74
- package/lib/namespace/Interface.cjs +0 -3
- package/lib/namespace/Interface.d.ts +0 -17
- package/lib/namespace/children/ChildClass.cjs +0 -47
- package/lib/namespace/children/ChildClass.d.ts +0 -44
- package/lib/namespace/children/ChildInterface.cjs +0 -3
- package/lib/namespace/children/ChildInterface.d.ts +0 -22
- package/lib/namespace/children/Enum.cjs +0 -19
- package/lib/namespace/children/Enum.d.ts +0 -14
- package/lib/namespace/children/function.cjs +0 -36
- package/lib/namespace/children/function.d.ts +0 -31
- package/lib/namespace/children/index.cjs +0 -42
- package/lib/namespace/children/index.d.ts +0 -25
- package/lib/namespace/index.cjs +0 -35
- package/lib/namespace/index.d.ts +0 -18
- package/lib/namespace/type.cjs +0 -3
- package/lib/namespace/type.d.ts +0 -28
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.decoratorTools = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
function escapeRegExp(value) {
|
|
10
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
11
|
+
}
|
|
12
|
+
function formatDecorator(spec) {
|
|
13
|
+
const args = (spec.args || []).map((arg) => JSON.stringify(arg)).join(", ");
|
|
14
|
+
return `@${spec.name}(${args})`;
|
|
15
|
+
}
|
|
16
|
+
function ensureDirectory(filePath) {
|
|
17
|
+
fs_1.default.mkdirSync(path_1.default.dirname(filePath), { recursive: true });
|
|
18
|
+
}
|
|
19
|
+
function collectDecoratorNames(classDecorators, properties) {
|
|
20
|
+
const names = new Set();
|
|
21
|
+
names.add("model");
|
|
22
|
+
for (const decorator of classDecorators || []) {
|
|
23
|
+
names.add(decorator.name);
|
|
24
|
+
}
|
|
25
|
+
for (const property of properties || []) {
|
|
26
|
+
for (const decorator of property.decorators || []) {
|
|
27
|
+
names.add(decorator.name);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return names;
|
|
31
|
+
}
|
|
32
|
+
function ensureImport(content, importsFrom, decorators) {
|
|
33
|
+
/* istanbul ignore next */
|
|
34
|
+
if (!decorators.size)
|
|
35
|
+
return content;
|
|
36
|
+
const importRegex = new RegExp(`import\\s+\\{([^}]+)\\}\\s+from\\s+["']${escapeRegExp(importsFrom)}["'];`);
|
|
37
|
+
const match = content.match(importRegex);
|
|
38
|
+
const sorted = Array.from(decorators).sort();
|
|
39
|
+
if (match) {
|
|
40
|
+
const existing = match[1]
|
|
41
|
+
.split(",")
|
|
42
|
+
.map((name) => name.trim())
|
|
43
|
+
.filter(Boolean);
|
|
44
|
+
const merged = Array.from(new Set([...existing, ...sorted])).sort();
|
|
45
|
+
return content.replace(importRegex, `import { ${merged.join(", ")} } from "${importsFrom}";`);
|
|
46
|
+
}
|
|
47
|
+
const importLine = `import { ${sorted.join(", ")} } from "${importsFrom}";`;
|
|
48
|
+
return `${importLine}\n\n${content}`;
|
|
49
|
+
}
|
|
50
|
+
function addPropertyBlock(property) {
|
|
51
|
+
const decorators = (property.decorators || [])
|
|
52
|
+
.map(formatDecorator)
|
|
53
|
+
.join("\n ");
|
|
54
|
+
const decoratorBlock = decorators ? ` ${decorators}\n` : "";
|
|
55
|
+
return `${decoratorBlock} ${property.name}: ${property.type};`;
|
|
56
|
+
}
|
|
57
|
+
function removePropertyBlock(content, propertyName) {
|
|
58
|
+
const lines = content.split(/\r?\n/);
|
|
59
|
+
const result = [];
|
|
60
|
+
for (let i = 0; i < lines.length; i++) {
|
|
61
|
+
const line = lines[i];
|
|
62
|
+
if (line.trim().startsWith(`@`) &&
|
|
63
|
+
lines[i + 1]?.includes(`${propertyName}:`)) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (line.includes(`${propertyName}:`)) {
|
|
67
|
+
// skip this line and any trailing blank line
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
result.push(line);
|
|
71
|
+
}
|
|
72
|
+
return result.join("\n");
|
|
73
|
+
}
|
|
74
|
+
function insertDecorator(content, decorator, target) {
|
|
75
|
+
const decoratorLine = formatDecorator(decorator);
|
|
76
|
+
if (target.kind === "class") {
|
|
77
|
+
const classRegex = /(export\s+class\s+[^\s{]+\s*\{)/;
|
|
78
|
+
if (content.includes(decoratorLine))
|
|
79
|
+
return content;
|
|
80
|
+
return content.replace(classRegex, `${decoratorLine}\n$1`);
|
|
81
|
+
}
|
|
82
|
+
if (!target.name)
|
|
83
|
+
return content;
|
|
84
|
+
const propertyRegex = new RegExp(`(^\\s*)(?:@.*\\n\\1)*${escapeRegExp(target.name)}:`, "m");
|
|
85
|
+
const match = propertyRegex.exec(content);
|
|
86
|
+
if (!match)
|
|
87
|
+
return content;
|
|
88
|
+
const indent = match[1] || " ";
|
|
89
|
+
if (content.includes(`${indent}${decoratorLine}`))
|
|
90
|
+
return content;
|
|
91
|
+
return (content.slice(0, match.index) +
|
|
92
|
+
`${indent}${decoratorLine}\n` +
|
|
93
|
+
content.slice(match.index));
|
|
94
|
+
}
|
|
95
|
+
function removeDecorator(content, decoratorName, target) {
|
|
96
|
+
const decoratorRegex = new RegExp(`^\\s*@${escapeRegExp(decoratorName)}\\([^)]*\\)`, "m");
|
|
97
|
+
if (target.kind === "class") {
|
|
98
|
+
return content.replace(decoratorRegex, "");
|
|
99
|
+
}
|
|
100
|
+
if (target.name) {
|
|
101
|
+
const pattern = new RegExp(`(^\\s*@${escapeRegExp(decoratorName)}\\([^)]*\\)\\s*$\\n)(?=\\s*${escapeRegExp(target.name)}:)`, "m");
|
|
102
|
+
return content.replace(pattern, "");
|
|
103
|
+
}
|
|
104
|
+
return content;
|
|
105
|
+
}
|
|
106
|
+
function writeIfChanged(filePath, content) {
|
|
107
|
+
ensureDirectory(filePath);
|
|
108
|
+
fs_1.default.writeFileSync(filePath, content);
|
|
109
|
+
}
|
|
110
|
+
exports.decoratorTools = {
|
|
111
|
+
createOrUpdateModelTool: {
|
|
112
|
+
name: "create-or-update-model",
|
|
113
|
+
description: "Create or update a validation-ready model class",
|
|
114
|
+
execute: async (args) => {
|
|
115
|
+
if (!args.overwrite && fs_1.default.existsSync(args.filePath)) {
|
|
116
|
+
throw new Error(`File already exists at ${args.filePath}`);
|
|
117
|
+
}
|
|
118
|
+
const decorators = collectDecoratorNames(args.classDecorators, args.properties);
|
|
119
|
+
let content = `@model()`;
|
|
120
|
+
for (const decorator of args.classDecorators || []) {
|
|
121
|
+
content += `\n${formatDecorator(decorator)}`;
|
|
122
|
+
}
|
|
123
|
+
const properties = (args.properties || [])
|
|
124
|
+
.map(addPropertyBlock)
|
|
125
|
+
.join("\n\n");
|
|
126
|
+
content += `\nexport class ${args.className} {\n${properties ? `${properties}\n` : ""}}\n`;
|
|
127
|
+
content = ensureImport(content, args.importsFrom, decorators);
|
|
128
|
+
writeIfChanged(args.filePath, content);
|
|
129
|
+
return { filePath: args.filePath };
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
addAttributeTool: {
|
|
133
|
+
name: "add-attribute",
|
|
134
|
+
description: "Add a decorated attribute to an existing model",
|
|
135
|
+
execute: async (args) => {
|
|
136
|
+
if (!fs_1.default.existsSync(args.filePath)) {
|
|
137
|
+
throw new Error(`Model file not found at ${args.filePath}`);
|
|
138
|
+
}
|
|
139
|
+
let content = fs_1.default.readFileSync(args.filePath, "utf8");
|
|
140
|
+
if (content.includes(`${args.attribute.name}:`)) {
|
|
141
|
+
return { filePath: args.filePath };
|
|
142
|
+
}
|
|
143
|
+
const decorators = collectDecoratorNames(undefined, [args.attribute]);
|
|
144
|
+
content = ensureImport(content, args.importsFrom, decorators);
|
|
145
|
+
const insertionPoint = content.lastIndexOf("}");
|
|
146
|
+
const block = addPropertyBlock(args.attribute);
|
|
147
|
+
const before = content.slice(0, insertionPoint).replace(/\s*$/, "");
|
|
148
|
+
const after = content.slice(insertionPoint);
|
|
149
|
+
const updated = `${before}\n${block}\n${after}`;
|
|
150
|
+
writeIfChanged(args.filePath, updated);
|
|
151
|
+
return { filePath: args.filePath };
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
removeAttributeTool: {
|
|
155
|
+
name: "remove-attribute",
|
|
156
|
+
description: "Remove an attribute from a model class",
|
|
157
|
+
execute: async (args) => {
|
|
158
|
+
if (!fs_1.default.existsSync(args.filePath))
|
|
159
|
+
return { filePath: args.filePath };
|
|
160
|
+
const content = fs_1.default.readFileSync(args.filePath, "utf8");
|
|
161
|
+
const updated = removePropertyBlock(content, args.attributeName);
|
|
162
|
+
writeIfChanged(args.filePath, updated);
|
|
163
|
+
return { filePath: args.filePath };
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
applyDecoratorTool: {
|
|
167
|
+
name: "apply-decorator",
|
|
168
|
+
description: "Apply a decorator to a class or property",
|
|
169
|
+
execute: async (args) => {
|
|
170
|
+
if (!fs_1.default.existsSync(args.filePath)) {
|
|
171
|
+
throw new Error(`Model file not found at ${args.filePath}`);
|
|
172
|
+
}
|
|
173
|
+
let content = fs_1.default.readFileSync(args.filePath, "utf8");
|
|
174
|
+
const decorators = new Set([args.decorator.name]);
|
|
175
|
+
content = ensureImport(content, args.importsFrom, decorators);
|
|
176
|
+
content = insertDecorator(content, args.decorator, args.target);
|
|
177
|
+
writeIfChanged(args.filePath, content);
|
|
178
|
+
return { filePath: args.filePath };
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
removeDecoratorTool: {
|
|
182
|
+
name: "remove-decorator",
|
|
183
|
+
description: "Remove a decorator from a class or property",
|
|
184
|
+
execute: async (args) => {
|
|
185
|
+
if (!fs_1.default.existsSync(args.filePath))
|
|
186
|
+
return { filePath: args.filePath };
|
|
187
|
+
let content = fs_1.default.readFileSync(args.filePath, "utf8");
|
|
188
|
+
content = removeDecorator(content, args.decoratorName, args.target);
|
|
189
|
+
writeIfChanged(args.filePath, content);
|
|
190
|
+
return { filePath: args.filePath };
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
scaffoldValidatorTool: {
|
|
194
|
+
name: "scaffold-validator",
|
|
195
|
+
description: "Scaffold a validator class and optional decorator",
|
|
196
|
+
execute: async (args) => {
|
|
197
|
+
const classFile = path_1.default.join(args.validatorsDir, `${args.name}.ts`);
|
|
198
|
+
ensureDirectory(classFile);
|
|
199
|
+
const classContent = `export class ${args.name} {\n validate(value: unknown): boolean {\n return value !== undefined;\n }\n}\n`;
|
|
200
|
+
fs_1.default.writeFileSync(classFile, classContent);
|
|
201
|
+
let decoratorFile;
|
|
202
|
+
if (args.decoratorDir) {
|
|
203
|
+
decoratorFile = path_1.default.join(args.decoratorDir, `${args.name}Decorator.ts`);
|
|
204
|
+
ensureDirectory(decoratorFile);
|
|
205
|
+
fs_1.default.writeFileSync(decoratorFile, `export function ${args.name}Decorator() {\n return () => void 0;\n}\n`);
|
|
206
|
+
}
|
|
207
|
+
return { classFile, decoratorFile };
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
scaffoldSerializerTool: {
|
|
211
|
+
name: "scaffold-serializer",
|
|
212
|
+
description: "Scaffold a serializer class and optional registry",
|
|
213
|
+
execute: async (args) => {
|
|
214
|
+
const classFile = path_1.default.join(args.dir, `${args.name}.ts`);
|
|
215
|
+
ensureDirectory(classFile);
|
|
216
|
+
fs_1.default.writeFileSync(classFile, `export class ${args.name} {\n serialize(value: unknown): string {\n return JSON.stringify(value);\n }\n}\n`);
|
|
217
|
+
let registerFile;
|
|
218
|
+
if (args.registerDir) {
|
|
219
|
+
registerFile = path_1.default.join(args.registerDir, `${args.name}Register.ts`);
|
|
220
|
+
ensureDirectory(registerFile);
|
|
221
|
+
fs_1.default.writeFileSync(registerFile, `export function register${args.name}() {\n return ${args.setDefault ? "'default'" : "'optional'"};\n}\n`);
|
|
222
|
+
}
|
|
223
|
+
return { classFile, registerFile };
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
scaffoldHashingTool: {
|
|
227
|
+
name: "scaffold-hashing",
|
|
228
|
+
description: "Scaffold a hashing function and optional registry",
|
|
229
|
+
execute: async (args) => {
|
|
230
|
+
const functionFile = path_1.default.join(args.dir, `${args.name}.ts`);
|
|
231
|
+
ensureDirectory(functionFile);
|
|
232
|
+
fs_1.default.writeFileSync(functionFile, `export function ${args.name}(value: string): string {\n return value.split('').reverse().join('');\n}\n`);
|
|
233
|
+
let registerFile;
|
|
234
|
+
if (args.registerDir) {
|
|
235
|
+
registerFile = path_1.default.join(args.registerDir, `${args.name}Register.ts`);
|
|
236
|
+
ensureDirectory(registerFile);
|
|
237
|
+
fs_1.default.writeFileSync(registerFile, `export function register${args.name}() {\n return ${args.setDefault ? "'default'" : "'optional'"};\n}\n`);
|
|
238
|
+
}
|
|
239
|
+
return { functionFile, registerFile };
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
};
|
|
243
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9yLXRvb2xzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21vZHVsZXMvbWNwL2RlY29yYXRvci10b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBYXhCLFNBQVMsWUFBWSxDQUFDLEtBQWE7SUFDakMsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxJQUFtQjtJQUMxQyxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVFLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDO0FBQ2xDLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxRQUFnQjtJQUN2QyxZQUFFLENBQUMsU0FBUyxDQUFDLGNBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM1RCxDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FDNUIsZUFBNEMsRUFDNUMsVUFBdUM7SUFFdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUNoQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25CLEtBQUssTUFBTSxTQUFTLElBQUksZUFBZSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzlDLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFDRCxLQUFLLE1BQU0sUUFBUSxJQUFJLFVBQVUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUN4QyxLQUFLLE1BQU0sU0FBUyxJQUFJLFFBQVEsQ0FBQyxVQUFVLElBQUksRUFBRSxFQUFFLENBQUM7WUFDbEQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FDbkIsT0FBZSxFQUNmLFdBQW1CLEVBQ25CLFVBQXVCO0lBRXZCLDBCQUEwQjtJQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUk7UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUNyQyxNQUFNLFdBQVcsR0FBRyxJQUFJLE1BQU0sQ0FDNUIsMENBQTBDLFlBQVksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUMzRSxDQUFDO0lBQ0YsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN6QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBRTdDLElBQUksS0FBSyxFQUFFLENBQUM7UUFDVixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO2FBQ3RCLEtBQUssQ0FBQyxHQUFHLENBQUM7YUFDVixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUMxQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FDcEIsV0FBVyxFQUNYLFlBQVksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxXQUFXLElBQUksQ0FDekQsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxZQUFZLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksV0FBVyxJQUFJLENBQUM7SUFDNUUsT0FBTyxHQUFHLFVBQVUsT0FBTyxPQUFPLEVBQUUsQ0FBQztBQUN2QyxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxRQUF1QjtJQUMvQyxNQUFNLFVBQVUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO1NBQzNDLEdBQUcsQ0FBQyxlQUFlLENBQUM7U0FDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hCLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzdELE9BQU8sR0FBRyxjQUFjLEtBQUssUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDbEUsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQUMsT0FBZSxFQUFFLFlBQW9CO0lBQ2hFLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckMsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBQzVCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDdEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLElBQ0UsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7WUFDM0IsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsR0FBRyxZQUFZLEdBQUcsQ0FBQyxFQUMxQyxDQUFDO1lBQ0QsU0FBUztRQUNYLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEMsNkNBQTZDO1lBQzdDLFNBQVM7UUFDWCxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FDdEIsT0FBZSxFQUNmLFNBQXdCLEVBQ3hCLE1BR0M7SUFFRCxNQUFNLGFBQWEsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDakQsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQzVCLE1BQU0sVUFBVSxHQUFHLGlDQUFpQyxDQUFDO1FBQ3JELElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7WUFBRSxPQUFPLE9BQU8sQ0FBQztRQUNwRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEdBQUcsYUFBYSxNQUFNLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDakMsTUFBTSxhQUFhLEdBQUcsSUFBSSxNQUFNLENBQzlCLHdCQUF3QixZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQ3BELEdBQUcsQ0FDSixDQUFDO0lBQ0YsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxQyxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQzNCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDaEMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxHQUFHLGFBQWEsRUFBRSxDQUFDO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDbEUsT0FBTyxDQUNMLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDN0IsR0FBRyxNQUFNLEdBQUcsYUFBYSxJQUFJO1FBQzdCLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUMzQixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsZUFBZSxDQUN0QixPQUFlLEVBQ2YsYUFBcUIsRUFDckIsTUFHQztJQUVELE1BQU0sY0FBYyxHQUFHLElBQUksTUFBTSxDQUMvQixTQUFTLFlBQVksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUNqRCxHQUFHLENBQ0osQ0FBQztJQUNGLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUM1QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoQixNQUFNLE9BQU8sR0FBRyxJQUFJLE1BQU0sQ0FDeEIsVUFBVSxZQUFZLENBQUMsYUFBYSxDQUFDLDhCQUE4QixZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQ2hHLEdBQUcsQ0FDSixDQUFDO1FBQ0YsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLFFBQWdCLEVBQUUsT0FBZTtJQUN2RCxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUIsWUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUVZLFFBQUEsY0FBYyxHQUFHO0lBQzVCLHVCQUF1QixFQUFFO1FBQ3ZCLElBQUksRUFBRSx3QkFBd0I7UUFDOUIsV0FBVyxFQUFFLGlEQUFpRDtRQUM5RCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBT2YsRUFBRSxFQUFFO1lBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksWUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDcEQsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDN0QsQ0FBQztZQUNELE1BQU0sVUFBVSxHQUFHLHFCQUFxQixDQUN0QyxJQUFJLENBQUMsZUFBZSxFQUNwQixJQUFJLENBQUMsVUFBVSxDQUNoQixDQUFDO1lBQ0YsSUFBSSxPQUFPLEdBQUcsVUFBVSxDQUFDO1lBQ3pCLEtBQUssTUFBTSxTQUFTLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDbkQsT0FBTyxJQUFJLEtBQUssZUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDL0MsQ0FBQztZQUNELE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7aUJBQ3ZDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hCLE9BQU8sSUFBSSxrQkFBa0IsSUFBSSxDQUFDLFNBQVMsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO1lBQzNGLE9BQU8sR0FBRyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDOUQsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDckMsQ0FBQztLQUNGO0lBQ0QsZ0JBQWdCLEVBQUU7UUFDaEIsSUFBSSxFQUFFLGVBQWU7UUFDckIsV0FBVyxFQUFFLGdEQUFnRDtRQUM3RCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBS2YsRUFBRSxFQUFFO1lBQ0gsSUFBSSxDQUFDLFlBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzlELENBQUM7WUFDRCxJQUFJLE9BQU8sR0FBRyxZQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDckQsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3JDLENBQUM7WUFDRCxNQUFNLFVBQVUsR0FBRyxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN0RSxPQUFPLEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzlELE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEQsTUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQy9DLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDcEUsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM1QyxNQUFNLE9BQU8sR0FBRyxHQUFHLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDaEQsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDckMsQ0FBQztLQUNGO0lBQ0QsbUJBQW1CLEVBQUU7UUFDbkIsSUFBSSxFQUFFLGtCQUFrQjtRQUN4QixXQUFXLEVBQUUsd0NBQXdDO1FBQ3JELE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFJZixFQUFFLEVBQUU7WUFDSCxJQUFJLENBQUMsWUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RFLE1BQU0sT0FBTyxHQUFHLFlBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN2RCxNQUFNLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2pFLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JDLENBQUM7S0FDRjtJQUNELGtCQUFrQixFQUFFO1FBQ2xCLElBQUksRUFBRSxpQkFBaUI7UUFDdkIsV0FBVyxFQUFFLDBDQUEwQztRQUN2RCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBTWYsRUFBRSxFQUFFO1lBQ0gsSUFBSSxDQUFDLFlBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzlELENBQUM7WUFDRCxJQUFJLE9BQU8sR0FBRyxZQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDckQsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDMUQsT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM5RCxPQUFPLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoRSxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN2QyxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNyQyxDQUFDO0tBQ0Y7SUFDRCxtQkFBbUIsRUFBRTtRQUNuQixJQUFJLEVBQUUsa0JBQWtCO1FBQ3hCLFdBQVcsRUFBRSw2Q0FBNkM7UUFDMUQsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUtmLEVBQUUsRUFBRTtZQUNILElBQUksQ0FBQyxZQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdEUsSUFBSSxPQUFPLEdBQUcsWUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3JELE9BQU8sR0FBRyxlQUFlLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BFLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JDLENBQUM7S0FDRjtJQUNELHFCQUFxQixFQUFFO1FBQ3JCLElBQUksRUFBRSxvQkFBb0I7UUFDMUIsV0FBVyxFQUFFLG1EQUFtRDtRQUNoRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBSWYsRUFBRSxFQUFFO1lBQ0gsTUFBTSxTQUFTLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUM7WUFDbkUsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzNCLE1BQU0sWUFBWSxHQUFHLGdCQUFnQixJQUFJLENBQUMsSUFBSSxzRkFBc0YsQ0FBQztZQUNySSxZQUFFLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUMxQyxJQUFJLGFBQWlDLENBQUM7WUFDdEMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3RCLGFBQWEsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUN2QixJQUFJLENBQUMsWUFBWSxFQUNqQixHQUFHLElBQUksQ0FBQyxJQUFJLGNBQWMsQ0FDM0IsQ0FBQztnQkFDRixlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQy9CLFlBQUUsQ0FBQyxhQUFhLENBQ2QsYUFBYSxFQUNiLG1CQUFtQixJQUFJLENBQUMsSUFBSSw0Q0FBNEMsQ0FDekUsQ0FBQztZQUNKLENBQUM7WUFDRCxPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBQ3RDLENBQUM7S0FDRjtJQUNELHNCQUFzQixFQUFFO1FBQ3RCLElBQUksRUFBRSxxQkFBcUI7UUFDM0IsV0FBVyxFQUFFLG1EQUFtRDtRQUNoRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBS2YsRUFBRSxFQUFFO1lBQ0gsTUFBTSxTQUFTLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUM7WUFDekQsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzNCLFlBQUUsQ0FBQyxhQUFhLENBQ2QsU0FBUyxFQUNULGdCQUFnQixJQUFJLENBQUMsSUFBSSx3RkFBd0YsQ0FDbEgsQ0FBQztZQUNGLElBQUksWUFBZ0MsQ0FBQztZQUNyQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDckIsWUFBWSxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDO2dCQUN0RSxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzlCLFlBQUUsQ0FBQyxhQUFhLENBQ2QsWUFBWSxFQUNaLDJCQUEyQixJQUFJLENBQUMsSUFBSSxrQkFBa0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLFFBQVEsQ0FDM0csQ0FBQztZQUNKLENBQUM7WUFDRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxDQUFDO1FBQ3JDLENBQUM7S0FDRjtJQUNELG1CQUFtQixFQUFFO1FBQ25CLElBQUksRUFBRSxrQkFBa0I7UUFDeEIsV0FBVyxFQUFFLG1EQUFtRDtRQUNoRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBS2YsRUFBRSxFQUFFO1lBQ0gsTUFBTSxZQUFZLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUM7WUFDNUQsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzlCLFlBQUUsQ0FBQyxhQUFhLENBQ2QsWUFBWSxFQUNaLG1CQUFtQixJQUFJLENBQUMsSUFBSSw4RUFBOEUsQ0FDM0csQ0FBQztZQUNGLElBQUksWUFBZ0MsQ0FBQztZQUNyQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDckIsWUFBWSxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDO2dCQUN0RSxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzlCLFlBQUUsQ0FBQyxhQUFhLENBQ2QsWUFBWSxFQUNaLDJCQUEyQixJQUFJLENBQUMsSUFBSSxrQkFBa0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLFFBQVEsQ0FDM0csQ0FBQztZQUNKLENBQUM7WUFDRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDO1FBQ3hDLENBQUM7S0FDRjtDQUNPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5leHBvcnQgdHlwZSBEZWNvcmF0b3JTcGVjID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGFyZ3M/OiB1bmtub3duW107XG59O1xuXG5leHBvcnQgdHlwZSBBdHRyaWJ1dGVTcGVjID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgZGVjb3JhdG9ycz86IERlY29yYXRvclNwZWNbXTtcbn07XG5cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZTogc3RyaW5nKSB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdERlY29yYXRvcihzcGVjOiBEZWNvcmF0b3JTcGVjKTogc3RyaW5nIHtcbiAgY29uc3QgYXJncyA9IChzcGVjLmFyZ3MgfHwgW10pLm1hcCgoYXJnKSA9PiBKU09OLnN0cmluZ2lmeShhcmcpKS5qb2luKFwiLCBcIik7XG4gIHJldHVybiBgQCR7c3BlYy5uYW1lfSgke2FyZ3N9KWA7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZURpcmVjdG9yeShmaWxlUGF0aDogc3RyaW5nKSB7XG4gIGZzLm1rZGlyU3luYyhwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdERlY29yYXRvck5hbWVzKFxuICBjbGFzc0RlY29yYXRvcnM6IERlY29yYXRvclNwZWNbXSB8IHVuZGVmaW5lZCxcbiAgcHJvcGVydGllczogQXR0cmlidXRlU3BlY1tdIHwgdW5kZWZpbmVkXG4pIHtcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgbmFtZXMuYWRkKFwibW9kZWxcIik7XG4gIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGNsYXNzRGVjb3JhdG9ycyB8fCBbXSkge1xuICAgIG5hbWVzLmFkZChkZWNvcmF0b3IubmFtZSk7XG4gIH1cbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBwcm9wZXJ0aWVzIHx8IFtdKSB7XG4gICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgcHJvcGVydHkuZGVjb3JhdG9ycyB8fCBbXSkge1xuICAgICAgbmFtZXMuYWRkKGRlY29yYXRvci5uYW1lKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5hbWVzO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVJbXBvcnQoXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgaW1wb3J0c0Zyb206IHN0cmluZyxcbiAgZGVjb3JhdG9yczogU2V0PHN0cmluZz5cbikge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAoIWRlY29yYXRvcnMuc2l6ZSkgcmV0dXJuIGNvbnRlbnQ7XG4gIGNvbnN0IGltcG9ydFJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICBgaW1wb3J0XFxcXHMrXFxcXHsoW159XSspXFxcXH1cXFxccytmcm9tXFxcXHMrW1wiJ10ke2VzY2FwZVJlZ0V4cChpbXBvcnRzRnJvbSl9W1wiJ107YFxuICApO1xuICBjb25zdCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goaW1wb3J0UmVnZXgpO1xuICBjb25zdCBzb3J0ZWQgPSBBcnJheS5mcm9tKGRlY29yYXRvcnMpLnNvcnQoKTtcblxuICBpZiAobWF0Y2gpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IG1hdGNoWzFdXG4gICAgICAuc3BsaXQoXCIsXCIpXG4gICAgICAubWFwKChuYW1lKSA9PiBuYW1lLnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgbWVyZ2VkID0gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5leGlzdGluZywgLi4uc29ydGVkXSkpLnNvcnQoKTtcbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlKFxuICAgICAgaW1wb3J0UmVnZXgsXG4gICAgICBgaW1wb3J0IHsgJHttZXJnZWQuam9pbihcIiwgXCIpfSB9IGZyb20gXCIke2ltcG9ydHNGcm9tfVwiO2BcbiAgICApO1xuICB9XG5cbiAgY29uc3QgaW1wb3J0TGluZSA9IGBpbXBvcnQgeyAke3NvcnRlZC5qb2luKFwiLCBcIil9IH0gZnJvbSBcIiR7aW1wb3J0c0Zyb219XCI7YDtcbiAgcmV0dXJuIGAke2ltcG9ydExpbmV9XFxuXFxuJHtjb250ZW50fWA7XG59XG5cbmZ1bmN0aW9uIGFkZFByb3BlcnR5QmxvY2socHJvcGVydHk6IEF0dHJpYnV0ZVNwZWMpIHtcbiAgY29uc3QgZGVjb3JhdG9ycyA9IChwcm9wZXJ0eS5kZWNvcmF0b3JzIHx8IFtdKVxuICAgIC5tYXAoZm9ybWF0RGVjb3JhdG9yKVxuICAgIC5qb2luKFwiXFxuICBcIik7XG4gIGNvbnN0IGRlY29yYXRvckJsb2NrID0gZGVjb3JhdG9ycyA/IGAgICR7ZGVjb3JhdG9yc31cXG5gIDogXCJcIjtcbiAgcmV0dXJuIGAke2RlY29yYXRvckJsb2NrfSAgJHtwcm9wZXJ0eS5uYW1lfTogJHtwcm9wZXJ0eS50eXBlfTtgO1xufVxuXG5mdW5jdGlvbiByZW1vdmVQcm9wZXJ0eUJsb2NrKGNvbnRlbnQ6IHN0cmluZywgcHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KC9cXHI/XFxuLyk7XG4gIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICBpZiAoXG4gICAgICBsaW5lLnRyaW0oKS5zdGFydHNXaXRoKGBAYCkgJiZcbiAgICAgIGxpbmVzW2kgKyAxXT8uaW5jbHVkZXMoYCR7cHJvcGVydHlOYW1lfTpgKVxuICAgICkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChsaW5lLmluY2x1ZGVzKGAke3Byb3BlcnR5TmFtZX06YCkpIHtcbiAgICAgIC8vIHNraXAgdGhpcyBsaW5lIGFuZCBhbnkgdHJhaWxpbmcgYmxhbmsgbGluZVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHJlc3VsdC5wdXNoKGxpbmUpO1xuICB9XG4gIHJldHVybiByZXN1bHQuam9pbihcIlxcblwiKTtcbn1cblxuZnVuY3Rpb24gaW5zZXJ0RGVjb3JhdG9yKFxuICBjb250ZW50OiBzdHJpbmcsXG4gIGRlY29yYXRvcjogRGVjb3JhdG9yU3BlYyxcbiAgdGFyZ2V0OiB7XG4gICAga2luZDogXCJjbGFzc1wiIHwgXCJwcm9wZXJ0eVwiO1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gIH1cbikge1xuICBjb25zdCBkZWNvcmF0b3JMaW5lID0gZm9ybWF0RGVjb3JhdG9yKGRlY29yYXRvcik7XG4gIGlmICh0YXJnZXQua2luZCA9PT0gXCJjbGFzc1wiKSB7XG4gICAgY29uc3QgY2xhc3NSZWdleCA9IC8oZXhwb3J0XFxzK2NsYXNzXFxzK1teXFxze10rXFxzKlxceykvO1xuICAgIGlmIChjb250ZW50LmluY2x1ZGVzKGRlY29yYXRvckxpbmUpKSByZXR1cm4gY29udGVudDtcbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlKGNsYXNzUmVnZXgsIGAke2RlY29yYXRvckxpbmV9XFxuJDFgKTtcbiAgfVxuICBpZiAoIXRhcmdldC5uYW1lKSByZXR1cm4gY29udGVudDtcbiAgY29uc3QgcHJvcGVydHlSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgYCheXFxcXHMqKSg/OkAuKlxcXFxuXFxcXDEpKiR7ZXNjYXBlUmVnRXhwKHRhcmdldC5uYW1lKX06YCxcbiAgICBcIm1cIlxuICApO1xuICBjb25zdCBtYXRjaCA9IHByb3BlcnR5UmVnZXguZXhlYyhjb250ZW50KTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIGNvbnRlbnQ7XG4gIGNvbnN0IGluZGVudCA9IG1hdGNoWzFdIHx8IFwiICBcIjtcbiAgaWYgKGNvbnRlbnQuaW5jbHVkZXMoYCR7aW5kZW50fSR7ZGVjb3JhdG9yTGluZX1gKSkgcmV0dXJuIGNvbnRlbnQ7XG4gIHJldHVybiAoXG4gICAgY29udGVudC5zbGljZSgwLCBtYXRjaC5pbmRleCkgK1xuICAgIGAke2luZGVudH0ke2RlY29yYXRvckxpbmV9XFxuYCArXG4gICAgY29udGVudC5zbGljZShtYXRjaC5pbmRleClcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRGVjb3JhdG9yKFxuICBjb250ZW50OiBzdHJpbmcsXG4gIGRlY29yYXRvck5hbWU6IHN0cmluZyxcbiAgdGFyZ2V0OiB7XG4gICAga2luZDogXCJjbGFzc1wiIHwgXCJwcm9wZXJ0eVwiO1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gIH1cbikge1xuICBjb25zdCBkZWNvcmF0b3JSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgYF5cXFxccypAJHtlc2NhcGVSZWdFeHAoZGVjb3JhdG9yTmFtZSl9XFxcXChbXildKlxcXFwpYCxcbiAgICBcIm1cIlxuICApO1xuICBpZiAodGFyZ2V0LmtpbmQgPT09IFwiY2xhc3NcIikge1xuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UoZGVjb3JhdG9yUmVnZXgsIFwiXCIpO1xuICB9XG4gIGlmICh0YXJnZXQubmFtZSkge1xuICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKFxuICAgICAgYCheXFxcXHMqQCR7ZXNjYXBlUmVnRXhwKGRlY29yYXRvck5hbWUpfVxcXFwoW14pXSpcXFxcKVxcXFxzKiRcXFxcbikoPz1cXFxccyoke2VzY2FwZVJlZ0V4cCh0YXJnZXQubmFtZSl9OilgLFxuICAgICAgXCJtXCJcbiAgICApO1xuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UocGF0dGVybiwgXCJcIik7XG4gIH1cbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbmZ1bmN0aW9uIHdyaXRlSWZDaGFuZ2VkKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZykge1xuICBlbnN1cmVEaXJlY3RvcnkoZmlsZVBhdGgpO1xuICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBjb250ZW50KTtcbn1cblxuZXhwb3J0IGNvbnN0IGRlY29yYXRvclRvb2xzID0ge1xuICBjcmVhdGVPclVwZGF0ZU1vZGVsVG9vbDoge1xuICAgIG5hbWU6IFwiY3JlYXRlLW9yLXVwZGF0ZS1tb2RlbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkNyZWF0ZSBvciB1cGRhdGUgYSB2YWxpZGF0aW9uLXJlYWR5IG1vZGVsIGNsYXNzXCIsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3M6IHtcbiAgICAgIGZpbGVQYXRoOiBzdHJpbmc7XG4gICAgICBjbGFzc05hbWU6IHN0cmluZztcbiAgICAgIGNsYXNzRGVjb3JhdG9ycz86IERlY29yYXRvclNwZWNbXTtcbiAgICAgIHByb3BlcnRpZXM6IEF0dHJpYnV0ZVNwZWNbXTtcbiAgICAgIGltcG9ydHNGcm9tOiBzdHJpbmc7XG4gICAgICBvdmVyd3JpdGU/OiBib29sZWFuO1xuICAgIH0pID0+IHtcbiAgICAgIGlmICghYXJncy5vdmVyd3JpdGUgJiYgZnMuZXhpc3RzU3luYyhhcmdzLmZpbGVQYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgYWxyZWFkeSBleGlzdHMgYXQgJHthcmdzLmZpbGVQYXRofWApO1xuICAgICAgfVxuICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IGNvbGxlY3REZWNvcmF0b3JOYW1lcyhcbiAgICAgICAgYXJncy5jbGFzc0RlY29yYXRvcnMsXG4gICAgICAgIGFyZ3MucHJvcGVydGllc1xuICAgICAgKTtcbiAgICAgIGxldCBjb250ZW50ID0gYEBtb2RlbCgpYDtcbiAgICAgIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGFyZ3MuY2xhc3NEZWNvcmF0b3JzIHx8IFtdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gYFxcbiR7Zm9ybWF0RGVjb3JhdG9yKGRlY29yYXRvcil9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSAoYXJncy5wcm9wZXJ0aWVzIHx8IFtdKVxuICAgICAgICAubWFwKGFkZFByb3BlcnR5QmxvY2spXG4gICAgICAgIC5qb2luKFwiXFxuXFxuXCIpO1xuICAgICAgY29udGVudCArPSBgXFxuZXhwb3J0IGNsYXNzICR7YXJncy5jbGFzc05hbWV9IHtcXG4ke3Byb3BlcnRpZXMgPyBgJHtwcm9wZXJ0aWVzfVxcbmAgOiBcIlwifX1cXG5gO1xuICAgICAgY29udGVudCA9IGVuc3VyZUltcG9ydChjb250ZW50LCBhcmdzLmltcG9ydHNGcm9tLCBkZWNvcmF0b3JzKTtcbiAgICAgIHdyaXRlSWZDaGFuZ2VkKGFyZ3MuZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgICAgcmV0dXJuIHsgZmlsZVBhdGg6IGFyZ3MuZmlsZVBhdGggfTtcbiAgICB9LFxuICB9LFxuICBhZGRBdHRyaWJ1dGVUb29sOiB7XG4gICAgbmFtZTogXCJhZGQtYXR0cmlidXRlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQWRkIGEgZGVjb3JhdGVkIGF0dHJpYnV0ZSB0byBhbiBleGlzdGluZyBtb2RlbFwiLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzOiB7XG4gICAgICBmaWxlUGF0aDogc3RyaW5nO1xuICAgICAgY2xhc3NOYW1lOiBzdHJpbmc7XG4gICAgICBhdHRyaWJ1dGU6IEF0dHJpYnV0ZVNwZWM7XG4gICAgICBpbXBvcnRzRnJvbTogc3RyaW5nO1xuICAgIH0pID0+IHtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhhcmdzLmZpbGVQYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsIGZpbGUgbm90IGZvdW5kIGF0ICR7YXJncy5maWxlUGF0aH1gKTtcbiAgICAgIH1cbiAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGFyZ3MuZmlsZVBhdGgsIFwidXRmOFwiKTtcbiAgICAgIGlmIChjb250ZW50LmluY2x1ZGVzKGAke2FyZ3MuYXR0cmlidXRlLm5hbWV9OmApKSB7XG4gICAgICAgIHJldHVybiB7IGZpbGVQYXRoOiBhcmdzLmZpbGVQYXRoIH07XG4gICAgICB9XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gY29sbGVjdERlY29yYXRvck5hbWVzKHVuZGVmaW5lZCwgW2FyZ3MuYXR0cmlidXRlXSk7XG4gICAgICBjb250ZW50ID0gZW5zdXJlSW1wb3J0KGNvbnRlbnQsIGFyZ3MuaW1wb3J0c0Zyb20sIGRlY29yYXRvcnMpO1xuICAgICAgY29uc3QgaW5zZXJ0aW9uUG9pbnQgPSBjb250ZW50Lmxhc3RJbmRleE9mKFwifVwiKTtcbiAgICAgIGNvbnN0IGJsb2NrID0gYWRkUHJvcGVydHlCbG9jayhhcmdzLmF0dHJpYnV0ZSk7XG4gICAgICBjb25zdCBiZWZvcmUgPSBjb250ZW50LnNsaWNlKDAsIGluc2VydGlvblBvaW50KS5yZXBsYWNlKC9cXHMqJC8sIFwiXCIpO1xuICAgICAgY29uc3QgYWZ0ZXIgPSBjb250ZW50LnNsaWNlKGluc2VydGlvblBvaW50KTtcbiAgICAgIGNvbnN0IHVwZGF0ZWQgPSBgJHtiZWZvcmV9XFxuJHtibG9ja31cXG4ke2FmdGVyfWA7XG4gICAgICB3cml0ZUlmQ2hhbmdlZChhcmdzLmZpbGVQYXRoLCB1cGRhdGVkKTtcbiAgICAgIHJldHVybiB7IGZpbGVQYXRoOiBhcmdzLmZpbGVQYXRoIH07XG4gICAgfSxcbiAgfSxcbiAgcmVtb3ZlQXR0cmlidXRlVG9vbDoge1xuICAgIG5hbWU6IFwicmVtb3ZlLWF0dHJpYnV0ZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlJlbW92ZSBhbiBhdHRyaWJ1dGUgZnJvbSBhIG1vZGVsIGNsYXNzXCIsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3M6IHtcbiAgICAgIGZpbGVQYXRoOiBzdHJpbmc7XG4gICAgICBjbGFzc05hbWU6IHN0cmluZztcbiAgICAgIGF0dHJpYnV0ZU5hbWU6IHN0cmluZztcbiAgICB9KSA9PiB7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoYXJncy5maWxlUGF0aCkpIHJldHVybiB7IGZpbGVQYXRoOiBhcmdzLmZpbGVQYXRoIH07XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGFyZ3MuZmlsZVBhdGgsIFwidXRmOFwiKTtcbiAgICAgIGNvbnN0IHVwZGF0ZWQgPSByZW1vdmVQcm9wZXJ0eUJsb2NrKGNvbnRlbnQsIGFyZ3MuYXR0cmlidXRlTmFtZSk7XG4gICAgICB3cml0ZUlmQ2hhbmdlZChhcmdzLmZpbGVQYXRoLCB1cGRhdGVkKTtcbiAgICAgIHJldHVybiB7IGZpbGVQYXRoOiBhcmdzLmZpbGVQYXRoIH07XG4gICAgfSxcbiAgfSxcbiAgYXBwbHlEZWNvcmF0b3JUb29sOiB7XG4gICAgbmFtZTogXCJhcHBseS1kZWNvcmF0b3JcIixcbiAgICBkZXNjcmlwdGlvbjogXCJBcHBseSBhIGRlY29yYXRvciB0byBhIGNsYXNzIG9yIHByb3BlcnR5XCIsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3M6IHtcbiAgICAgIGZpbGVQYXRoOiBzdHJpbmc7XG4gICAgICBjbGFzc05hbWU6IHN0cmluZztcbiAgICAgIHRhcmdldDogeyBraW5kOiBcImNsYXNzXCIgfCBcInByb3BlcnR5XCI7IG5hbWU/OiBzdHJpbmcgfTtcbiAgICAgIGRlY29yYXRvcjogRGVjb3JhdG9yU3BlYztcbiAgICAgIGltcG9ydHNGcm9tOiBzdHJpbmc7XG4gICAgfSkgPT4ge1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGFyZ3MuZmlsZVBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgZmlsZSBub3QgZm91bmQgYXQgJHthcmdzLmZpbGVQYXRofWApO1xuICAgICAgfVxuICAgICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoYXJncy5maWxlUGF0aCwgXCJ1dGY4XCIpO1xuICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IG5ldyBTZXQ8c3RyaW5nPihbYXJncy5kZWNvcmF0b3IubmFtZV0pO1xuICAgICAgY29udGVudCA9IGVuc3VyZUltcG9ydChjb250ZW50LCBhcmdzLmltcG9ydHNGcm9tLCBkZWNvcmF0b3JzKTtcbiAgICAgIGNvbnRlbnQgPSBpbnNlcnREZWNvcmF0b3IoY29udGVudCwgYXJncy5kZWNvcmF0b3IsIGFyZ3MudGFyZ2V0KTtcbiAgICAgIHdyaXRlSWZDaGFuZ2VkKGFyZ3MuZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgICAgcmV0dXJuIHsgZmlsZVBhdGg6IGFyZ3MuZmlsZVBhdGggfTtcbiAgICB9LFxuICB9LFxuICByZW1vdmVEZWNvcmF0b3JUb29sOiB7XG4gICAgbmFtZTogXCJyZW1vdmUtZGVjb3JhdG9yXCIsXG4gICAgZGVzY3JpcHRpb246IFwiUmVtb3ZlIGEgZGVjb3JhdG9yIGZyb20gYSBjbGFzcyBvciBwcm9wZXJ0eVwiLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzOiB7XG4gICAgICBmaWxlUGF0aDogc3RyaW5nO1xuICAgICAgY2xhc3NOYW1lOiBzdHJpbmc7XG4gICAgICB0YXJnZXQ6IHsga2luZDogXCJjbGFzc1wiIHwgXCJwcm9wZXJ0eVwiOyBuYW1lPzogc3RyaW5nIH07XG4gICAgICBkZWNvcmF0b3JOYW1lOiBzdHJpbmc7XG4gICAgfSkgPT4ge1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGFyZ3MuZmlsZVBhdGgpKSByZXR1cm4geyBmaWxlUGF0aDogYXJncy5maWxlUGF0aCB9O1xuICAgICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoYXJncy5maWxlUGF0aCwgXCJ1dGY4XCIpO1xuICAgICAgY29udGVudCA9IHJlbW92ZURlY29yYXRvcihjb250ZW50LCBhcmdzLmRlY29yYXRvck5hbWUsIGFyZ3MudGFyZ2V0KTtcbiAgICAgIHdyaXRlSWZDaGFuZ2VkKGFyZ3MuZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgICAgcmV0dXJuIHsgZmlsZVBhdGg6IGFyZ3MuZmlsZVBhdGggfTtcbiAgICB9LFxuICB9LFxuICBzY2FmZm9sZFZhbGlkYXRvclRvb2w6IHtcbiAgICBuYW1lOiBcInNjYWZmb2xkLXZhbGlkYXRvclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNjYWZmb2xkIGEgdmFsaWRhdG9yIGNsYXNzIGFuZCBvcHRpb25hbCBkZWNvcmF0b3JcIixcbiAgICBleGVjdXRlOiBhc3luYyAoYXJnczoge1xuICAgICAgdmFsaWRhdG9yc0Rpcjogc3RyaW5nO1xuICAgICAgZGVjb3JhdG9yRGlyPzogc3RyaW5nO1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgIH0pID0+IHtcbiAgICAgIGNvbnN0IGNsYXNzRmlsZSA9IHBhdGguam9pbihhcmdzLnZhbGlkYXRvcnNEaXIsIGAke2FyZ3MubmFtZX0udHNgKTtcbiAgICAgIGVuc3VyZURpcmVjdG9yeShjbGFzc0ZpbGUpO1xuICAgICAgY29uc3QgY2xhc3NDb250ZW50ID0gYGV4cG9ydCBjbGFzcyAke2FyZ3MubmFtZX0ge1xcbiAgdmFsaWRhdGUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcXG4gICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQ7XFxuICB9XFxufVxcbmA7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGNsYXNzRmlsZSwgY2xhc3NDb250ZW50KTtcbiAgICAgIGxldCBkZWNvcmF0b3JGaWxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoYXJncy5kZWNvcmF0b3JEaXIpIHtcbiAgICAgICAgZGVjb3JhdG9yRmlsZSA9IHBhdGguam9pbihcbiAgICAgICAgICBhcmdzLmRlY29yYXRvckRpcixcbiAgICAgICAgICBgJHthcmdzLm5hbWV9RGVjb3JhdG9yLnRzYFxuICAgICAgICApO1xuICAgICAgICBlbnN1cmVEaXJlY3RvcnkoZGVjb3JhdG9yRmlsZSk7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgZGVjb3JhdG9yRmlsZSxcbiAgICAgICAgICBgZXhwb3J0IGZ1bmN0aW9uICR7YXJncy5uYW1lfURlY29yYXRvcigpIHtcXG4gIHJldHVybiAoKSA9PiB2b2lkIDA7XFxufVxcbmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNsYXNzRmlsZSwgZGVjb3JhdG9yRmlsZSB9O1xuICAgIH0sXG4gIH0sXG4gIHNjYWZmb2xkU2VyaWFsaXplclRvb2w6IHtcbiAgICBuYW1lOiBcInNjYWZmb2xkLXNlcmlhbGl6ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTY2FmZm9sZCBhIHNlcmlhbGl6ZXIgY2xhc3MgYW5kIG9wdGlvbmFsIHJlZ2lzdHJ5XCIsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3M6IHtcbiAgICAgIGRpcjogc3RyaW5nO1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgcmVnaXN0ZXJEaXI/OiBzdHJpbmc7XG4gICAgICBzZXREZWZhdWx0PzogYm9vbGVhbjtcbiAgICB9KSA9PiB7XG4gICAgICBjb25zdCBjbGFzc0ZpbGUgPSBwYXRoLmpvaW4oYXJncy5kaXIsIGAke2FyZ3MubmFtZX0udHNgKTtcbiAgICAgIGVuc3VyZURpcmVjdG9yeShjbGFzc0ZpbGUpO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgY2xhc3NGaWxlLFxuICAgICAgICBgZXhwb3J0IGNsYXNzICR7YXJncy5uYW1lfSB7XFxuICBzZXJpYWxpemUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xcbiAgfVxcbn1cXG5gXG4gICAgICApO1xuICAgICAgbGV0IHJlZ2lzdGVyRmlsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGFyZ3MucmVnaXN0ZXJEaXIpIHtcbiAgICAgICAgcmVnaXN0ZXJGaWxlID0gcGF0aC5qb2luKGFyZ3MucmVnaXN0ZXJEaXIsIGAke2FyZ3MubmFtZX1SZWdpc3Rlci50c2ApO1xuICAgICAgICBlbnN1cmVEaXJlY3RvcnkocmVnaXN0ZXJGaWxlKTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgICByZWdpc3RlckZpbGUsXG4gICAgICAgICAgYGV4cG9ydCBmdW5jdGlvbiByZWdpc3RlciR7YXJncy5uYW1lfSgpIHtcXG4gIHJldHVybiAke2FyZ3Muc2V0RGVmYXVsdCA/IFwiJ2RlZmF1bHQnXCIgOiBcIidvcHRpb25hbCdcIn07XFxufVxcbmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNsYXNzRmlsZSwgcmVnaXN0ZXJGaWxlIH07XG4gICAgfSxcbiAgfSxcbiAgc2NhZmZvbGRIYXNoaW5nVG9vbDoge1xuICAgIG5hbWU6IFwic2NhZmZvbGQtaGFzaGluZ1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNjYWZmb2xkIGEgaGFzaGluZyBmdW5jdGlvbiBhbmQgb3B0aW9uYWwgcmVnaXN0cnlcIixcbiAgICBleGVjdXRlOiBhc3luYyAoYXJnczoge1xuICAgICAgZGlyOiBzdHJpbmc7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICByZWdpc3RlckRpcj86IHN0cmluZztcbiAgICAgIHNldERlZmF1bHQ/OiBib29sZWFuO1xuICAgIH0pID0+IHtcbiAgICAgIGNvbnN0IGZ1bmN0aW9uRmlsZSA9IHBhdGguam9pbihhcmdzLmRpciwgYCR7YXJncy5uYW1lfS50c2ApO1xuICAgICAgZW5zdXJlRGlyZWN0b3J5KGZ1bmN0aW9uRmlsZSk7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICBmdW5jdGlvbkZpbGUsXG4gICAgICAgIGBleHBvcnQgZnVuY3Rpb24gJHthcmdzLm5hbWV9KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xcbiAgcmV0dXJuIHZhbHVlLnNwbGl0KCcnKS5yZXZlcnNlKCkuam9pbignJyk7XFxufVxcbmBcbiAgICAgICk7XG4gICAgICBsZXQgcmVnaXN0ZXJGaWxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoYXJncy5yZWdpc3RlckRpcikge1xuICAgICAgICByZWdpc3RlckZpbGUgPSBwYXRoLmpvaW4oYXJncy5yZWdpc3RlckRpciwgYCR7YXJncy5uYW1lfVJlZ2lzdGVyLnRzYCk7XG4gICAgICAgIGVuc3VyZURpcmVjdG9yeShyZWdpc3RlckZpbGUpO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICAgIHJlZ2lzdGVyRmlsZSxcbiAgICAgICAgICBgZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyJHthcmdzLm5hbWV9KCkge1xcbiAgcmV0dXJuICR7YXJncy5zZXREZWZhdWx0ID8gXCInZGVmYXVsdCdcIiA6IFwiJ29wdGlvbmFsJ1wifTtcXG59XFxuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgZnVuY3Rpb25GaWxlLCByZWdpc3RlckZpbGUgfTtcbiAgICB9LFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRGVjb3JhdG9yVG9vbHMgPSB0eXBlb2YgZGVjb3JhdG9yVG9vbHM7XG4iXX0=
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
export type DecoratorSpec = {
|
|
2
|
+
name: string;
|
|
3
|
+
args?: unknown[];
|
|
4
|
+
};
|
|
5
|
+
export type AttributeSpec = {
|
|
6
|
+
name: string;
|
|
7
|
+
type: string;
|
|
8
|
+
decorators?: DecoratorSpec[];
|
|
9
|
+
};
|
|
10
|
+
export declare const decoratorTools: {
|
|
11
|
+
readonly createOrUpdateModelTool: {
|
|
12
|
+
readonly name: "create-or-update-model";
|
|
13
|
+
readonly description: "Create or update a validation-ready model class";
|
|
14
|
+
readonly execute: (args: {
|
|
15
|
+
filePath: string;
|
|
16
|
+
className: string;
|
|
17
|
+
classDecorators?: DecoratorSpec[];
|
|
18
|
+
properties: AttributeSpec[];
|
|
19
|
+
importsFrom: string;
|
|
20
|
+
overwrite?: boolean;
|
|
21
|
+
}) => Promise<{
|
|
22
|
+
filePath: string;
|
|
23
|
+
}>;
|
|
24
|
+
};
|
|
25
|
+
readonly addAttributeTool: {
|
|
26
|
+
readonly name: "add-attribute";
|
|
27
|
+
readonly description: "Add a decorated attribute to an existing model";
|
|
28
|
+
readonly execute: (args: {
|
|
29
|
+
filePath: string;
|
|
30
|
+
className: string;
|
|
31
|
+
attribute: AttributeSpec;
|
|
32
|
+
importsFrom: string;
|
|
33
|
+
}) => Promise<{
|
|
34
|
+
filePath: string;
|
|
35
|
+
}>;
|
|
36
|
+
};
|
|
37
|
+
readonly removeAttributeTool: {
|
|
38
|
+
readonly name: "remove-attribute";
|
|
39
|
+
readonly description: "Remove an attribute from a model class";
|
|
40
|
+
readonly execute: (args: {
|
|
41
|
+
filePath: string;
|
|
42
|
+
className: string;
|
|
43
|
+
attributeName: string;
|
|
44
|
+
}) => Promise<{
|
|
45
|
+
filePath: string;
|
|
46
|
+
}>;
|
|
47
|
+
};
|
|
48
|
+
readonly applyDecoratorTool: {
|
|
49
|
+
readonly name: "apply-decorator";
|
|
50
|
+
readonly description: "Apply a decorator to a class or property";
|
|
51
|
+
readonly execute: (args: {
|
|
52
|
+
filePath: string;
|
|
53
|
+
className: string;
|
|
54
|
+
target: {
|
|
55
|
+
kind: "class" | "property";
|
|
56
|
+
name?: string;
|
|
57
|
+
};
|
|
58
|
+
decorator: DecoratorSpec;
|
|
59
|
+
importsFrom: string;
|
|
60
|
+
}) => Promise<{
|
|
61
|
+
filePath: string;
|
|
62
|
+
}>;
|
|
63
|
+
};
|
|
64
|
+
readonly removeDecoratorTool: {
|
|
65
|
+
readonly name: "remove-decorator";
|
|
66
|
+
readonly description: "Remove a decorator from a class or property";
|
|
67
|
+
readonly execute: (args: {
|
|
68
|
+
filePath: string;
|
|
69
|
+
className: string;
|
|
70
|
+
target: {
|
|
71
|
+
kind: "class" | "property";
|
|
72
|
+
name?: string;
|
|
73
|
+
};
|
|
74
|
+
decoratorName: string;
|
|
75
|
+
}) => Promise<{
|
|
76
|
+
filePath: string;
|
|
77
|
+
}>;
|
|
78
|
+
};
|
|
79
|
+
readonly scaffoldValidatorTool: {
|
|
80
|
+
readonly name: "scaffold-validator";
|
|
81
|
+
readonly description: "Scaffold a validator class and optional decorator";
|
|
82
|
+
readonly execute: (args: {
|
|
83
|
+
validatorsDir: string;
|
|
84
|
+
decoratorDir?: string;
|
|
85
|
+
name: string;
|
|
86
|
+
}) => Promise<{
|
|
87
|
+
classFile: string;
|
|
88
|
+
decoratorFile: string | undefined;
|
|
89
|
+
}>;
|
|
90
|
+
};
|
|
91
|
+
readonly scaffoldSerializerTool: {
|
|
92
|
+
readonly name: "scaffold-serializer";
|
|
93
|
+
readonly description: "Scaffold a serializer class and optional registry";
|
|
94
|
+
readonly execute: (args: {
|
|
95
|
+
dir: string;
|
|
96
|
+
name: string;
|
|
97
|
+
registerDir?: string;
|
|
98
|
+
setDefault?: boolean;
|
|
99
|
+
}) => Promise<{
|
|
100
|
+
classFile: string;
|
|
101
|
+
registerFile: string | undefined;
|
|
102
|
+
}>;
|
|
103
|
+
};
|
|
104
|
+
readonly scaffoldHashingTool: {
|
|
105
|
+
readonly name: "scaffold-hashing";
|
|
106
|
+
readonly description: "Scaffold a hashing function and optional registry";
|
|
107
|
+
readonly execute: (args: {
|
|
108
|
+
dir: string;
|
|
109
|
+
name: string;
|
|
110
|
+
registerDir?: string;
|
|
111
|
+
setDefault?: boolean;
|
|
112
|
+
}) => Promise<{
|
|
113
|
+
functionFile: string;
|
|
114
|
+
registerFile: string | undefined;
|
|
115
|
+
}>;
|
|
116
|
+
};
|
|
117
|
+
};
|
|
118
|
+
export type DecoratorTools = typeof decoratorTools;
|
|
@@ -0,0 +1,24 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.default = void 0;
|
|
21
|
+
var mcp_module_1 = require("./mcp-module.cjs");
|
|
22
|
+
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(mcp_module_1).default; } });
|
|
23
|
+
__exportStar(require("./mcp-module.cjs"), exports);
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbW9kdWxlcy9tY3AvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBdUM7QUFBOUIsc0hBQUEsT0FBTyxPQUFBO0FBQ2hCLG1EQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGRlZmF1bHQgfSBmcm9tIFwiLi9tY3AtbW9kdWxlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tY3AtbW9kdWxlXCI7XG4iXX0=
|