@darraghor/eslint-plugin-nestjs-typed 6.10.2 → 6.11.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.
- package/dist/rules/index.d.ts +4 -0
- package/dist/rules/index.js +3 -1
- package/dist/rules/useCorrectEndpointNamingConvention/useCorrectEndpointNamingConvention.d.ts +9 -0
- package/dist/rules/useCorrectEndpointNamingConvention/useCorrectEndpointNamingConvention.js +211 -0
- package/dist/rules/validateNonPrimitiveNeedsTypeDecorator/validateNonPrimitiveNeedsDecorators.js +3 -2
- package/package.json +1 -1
package/dist/rules/index.d.ts
CHANGED
|
@@ -21,6 +21,10 @@ declare const allRules: {
|
|
|
21
21
|
"all-properties-are-whitelisted": import("@typescript-eslint/utils/ts-eslint").RuleModule<"missing-property-decorator", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
22
22
|
"api-methods-should-be-guarded": import("@typescript-eslint/utils/ts-eslint").RuleModule<"apiMethodsShouldBeGuarded", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
23
23
|
"sort-module-metadata-arrays": import("@typescript-eslint/utils/ts-eslint").RuleModule<"moduleMetadataArraysAreSorted", import("./sortModuleMetadataArrays/sortModuleMetadataArrays.js").RuleOptions, unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
24
|
+
"use-correct-endpoint-naming-convention": import("@typescript-eslint/utils/ts-eslint").RuleModule<"controllerPathShouldBePlural" | "controllerPathShouldBeKebabCase" | "routePathShouldBeKebabCase", [{
|
|
25
|
+
checkPluralization: boolean;
|
|
26
|
+
caseFormat: "kebab-case" | "snake_case" | "camelCase";
|
|
27
|
+
}], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
24
28
|
"use-injectable-provided-token": import("@typescript-eslint/utils/ts-eslint").RuleModule<"useInjectableProvidedToken", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
25
29
|
};
|
|
26
30
|
export default allRules;
|
package/dist/rules/index.js
CHANGED
|
@@ -15,6 +15,7 @@ import apiMethodsShouldBeGuarded from "./apiMethodsShouldBeGuarded/apiMethodsSho
|
|
|
15
15
|
import apiMethodsShouldSpecifyApiOperation from "./apiMethodsShouldSpecifyApiOperation/apiMethodsShouldSpecifyApiOperation.js";
|
|
16
16
|
import sortModuleMetadataArrays from "./sortModuleMetadataArrays/sortModuleMetadataArrays.js";
|
|
17
17
|
import noDuplicateDecorators from "./noDuplicateDecorators/noDuplicateDecorators.js";
|
|
18
|
+
import useCorrectEndpointNamingConvention from "./useCorrectEndpointNamingConvention/useCorrectEndpointNamingConvention.js";
|
|
18
19
|
import useInjectableProvidedToken from "./useInjectableProvidedToken/useInjectableProvidedToken.js";
|
|
19
20
|
const allRules = {
|
|
20
21
|
"all-properties-have-explicit-defined": allPropertiesHaveExplicitDefined,
|
|
@@ -34,7 +35,8 @@ const allRules = {
|
|
|
34
35
|
"all-properties-are-whitelisted": allPropertiesAreWhitelisted,
|
|
35
36
|
"api-methods-should-be-guarded": apiMethodsShouldBeGuarded,
|
|
36
37
|
"sort-module-metadata-arrays": sortModuleMetadataArrays,
|
|
38
|
+
"use-correct-endpoint-naming-convention": useCorrectEndpointNamingConvention,
|
|
37
39
|
"use-injectable-provided-token": useInjectableProvidedToken,
|
|
38
40
|
};
|
|
39
41
|
export default allRules;
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVsZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTywwQkFBMEIsTUFBTSw2REFBNkQsQ0FBQztBQUNyRyxPQUFPLDRDQUE0QyxNQUFNLDRFQUE0RSxDQUFDO0FBQ3RJLE9BQU8scUNBQXFDLE1BQU0sa0ZBQWtGLENBQUM7QUFDckksT0FBTyw2QkFBNkIsTUFBTSxrRUFBa0UsQ0FBQztBQUM3RyxPQUFPLGtDQUFrQyxNQUFNLDRFQUE0RSxDQUFDO0FBQzVILE9BQU8sNEJBQTRCLE1BQU0sZ0VBQWdFLENBQUM7QUFDMUcsT0FBTyx1Q0FBdUMsTUFBTSxzRkFBc0YsQ0FBQztBQUMzSSxPQUFPLGdDQUFnQyxNQUFNLDRFQUE0RSxDQUFDO0FBQzFILE9BQU8sdUNBQXVDLE1BQU0sOEVBQThFLENBQUM7QUFDbkksT0FBTyxtQ0FBbUMsTUFBTSxpRkFBaUYsQ0FBQztBQUNsSSxPQUFPLGtDQUFrQyxNQUFNLDRFQUE0RSxDQUFDO0FBQzVILE9BQU8sMkJBQTJCLE1BQU0sOERBQThELENBQUM7QUFDdkcsT0FBTyxnQ0FBZ0MsTUFBTSx3RUFBd0UsQ0FBQztBQUN0SCxPQUFPLHlCQUF5QixNQUFNLDBEQUEwRCxDQUFDO0FBQ2pHLE9BQU8sbUNBQW1DLE1BQU0sOEVBQThFLENBQUM7QUFDL0gsT0FBTyx3QkFBd0IsTUFBTSx3REFBd0QsQ0FBQztBQUM5RixPQUFPLHFCQUFxQixNQUFNLGtEQUFrRCxDQUFDO0FBQ3JGLE9BQU8sa0NBQWtDLE1BQU0sNEVBQTRFLENBQUM7QUFDNUgsT0FBTywwQkFBMEIsTUFBTSw0REFBNEQsQ0FBQztBQUVwRyxNQUFNLFFBQVEsR0FBRztJQUNiLHNDQUFzQyxFQUFFLGdDQUFnQztJQUN4RSwyQ0FBMkMsRUFDdkMscUNBQXFDO0lBQ3pDLCtCQUErQixFQUFFLDBCQUEwQjtJQUMzRCx5QkFBeUIsRUFBRSxxQkFBcUI7SUFDaEQsbURBQW1ELEVBQy9DLDRDQUE0QztJQUNoRCxvQ0FBb0MsRUFBRSw2QkFBNkI7SUFDbkUsd0NBQXdDLEVBQ3BDLGtDQUFrQztJQUN0Qyx5Q0FBeUMsRUFDckMsbUNBQW1DO0lBQ3ZDLGtDQUFrQyxFQUFFLDRCQUE0QjtJQUNoRSwrQ0FBK0MsRUFDM0MsdUNBQXVDO0lBQzNDLHNDQUFzQyxFQUFFLGdDQUFnQztJQUN4RSwwQ0FBMEMsRUFDdEMsdUNBQXVDO0lBQzNDLHVEQUF1RCxFQUNuRCxtQ0FBbUM7SUFDdkMsMENBQTBDLEVBQ3RDLGtDQUFrQztJQUN0QyxnQ0FBZ0MsRUFBRSwyQkFBMkI7SUFDN0QsK0JBQStCLEVBQUUseUJBQXlCO0lBQzFELDZCQUE2QixFQUFFLHdCQUF3QjtJQUN2RCx3Q0FBd0MsRUFDcEMsa0NBQWtDO0lBQ3RDLCtCQUErQixFQUFFLDBCQUEwQjtDQUM5RCxDQUFDO0FBRUYsZUFBZSxRQUFRLENBQUMifQ==
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
type RuleMessageIds = "controllerPathShouldBePlural" | "controllerPathShouldBeKebabCase" | "routePathShouldBeKebabCase";
|
|
2
|
+
type RuleOptions = [
|
|
3
|
+
{
|
|
4
|
+
checkPluralization: boolean;
|
|
5
|
+
caseFormat: "kebab-case" | "snake_case" | "camelCase";
|
|
6
|
+
}
|
|
7
|
+
];
|
|
8
|
+
declare const rule: import("@typescript-eslint/utils/ts-eslint").RuleModule<RuleMessageIds, RuleOptions, unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
9
|
+
export default rule;
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { TSESTree } from "@typescript-eslint/utils";
|
|
2
|
+
import { createRule } from "../../utils/createRule.js";
|
|
3
|
+
import { typedTokenHelpers } from "../../utils/typedTokenHelpers.js";
|
|
4
|
+
const nestRequestMethodDecoratorNames = [
|
|
5
|
+
"Get",
|
|
6
|
+
"Post",
|
|
7
|
+
"Put",
|
|
8
|
+
"Delete",
|
|
9
|
+
"Patch",
|
|
10
|
+
"Options",
|
|
11
|
+
"Head",
|
|
12
|
+
"All",
|
|
13
|
+
];
|
|
14
|
+
/**
|
|
15
|
+
* Checks if a path segment is in kebab-case format
|
|
16
|
+
*/
|
|
17
|
+
const isKebabCase = (segment) => {
|
|
18
|
+
return /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/.test(segment);
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Checks if a path segment is in snake_case format
|
|
22
|
+
*/
|
|
23
|
+
const isSnakeCase = (segment) => {
|
|
24
|
+
return /^[a-z][a-z0-9]*(_[a-z0-9]+)*$/.test(segment);
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Checks if a path segment is in camelCase format
|
|
28
|
+
*/
|
|
29
|
+
const isCamelCase = (segment) => {
|
|
30
|
+
return /^[a-z][a-zA-Z0-9]*$/.test(segment);
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Simple pluralization check - checks if word ends with 's'
|
|
34
|
+
* This is a basic implementation. For more complex pluralization,
|
|
35
|
+
* users can disable this check.
|
|
36
|
+
*/
|
|
37
|
+
const isPlural = (word) => {
|
|
38
|
+
// Basic check: ends with 's' and not just 's'
|
|
39
|
+
return word.length > 1 && word.endsWith("s");
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Extracts the path string from a decorator
|
|
43
|
+
*/
|
|
44
|
+
const getDecoratorPath = (decorator) => {
|
|
45
|
+
const decoratorArgument = decorator?.expression
|
|
46
|
+
?.arguments[0];
|
|
47
|
+
if (!decoratorArgument) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
// Skip template literals and identifiers (dynamic paths)
|
|
51
|
+
if (decoratorArgument.type === TSESTree.AST_NODE_TYPES.TemplateLiteral ||
|
|
52
|
+
decoratorArgument.type === TSESTree.AST_NODE_TYPES.Identifier) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
if (decoratorArgument.type === TSESTree.AST_NODE_TYPES.Literal) {
|
|
56
|
+
return decoratorArgument.value;
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Extracts path segments from a path, excluding route parameters
|
|
62
|
+
*/
|
|
63
|
+
const getPathSegments = (path) => {
|
|
64
|
+
return path
|
|
65
|
+
.split("/")
|
|
66
|
+
.filter((segment) => segment.length > 0)
|
|
67
|
+
.filter((segment) => !segment.startsWith(":"))
|
|
68
|
+
.filter((segment) => segment !== "*");
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Checks if a path matches the expected case format
|
|
72
|
+
*/
|
|
73
|
+
const matchesCaseFormat = (path, format) => {
|
|
74
|
+
const segments = getPathSegments(path);
|
|
75
|
+
if (segments.length === 0) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
for (const segment of segments) {
|
|
79
|
+
let isValid = false;
|
|
80
|
+
switch (format) {
|
|
81
|
+
case "kebab-case":
|
|
82
|
+
isValid = isKebabCase(segment);
|
|
83
|
+
break;
|
|
84
|
+
case "snake_case":
|
|
85
|
+
isValid = isSnakeCase(segment);
|
|
86
|
+
break;
|
|
87
|
+
case "camelCase":
|
|
88
|
+
isValid = isCamelCase(segment);
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
if (!isValid) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return true;
|
|
96
|
+
};
|
|
97
|
+
const defaultRuleOptions = [
|
|
98
|
+
{
|
|
99
|
+
checkPluralization: true,
|
|
100
|
+
caseFormat: "kebab-case",
|
|
101
|
+
},
|
|
102
|
+
];
|
|
103
|
+
const rule = createRule({
|
|
104
|
+
name: "use-correct-endpoint-naming-convention",
|
|
105
|
+
meta: {
|
|
106
|
+
docs: {
|
|
107
|
+
description: "Enforces REST API naming conventions for controller and route paths",
|
|
108
|
+
},
|
|
109
|
+
messages: {
|
|
110
|
+
controllerPathShouldBePlural: 'Controller path "{{path}}" should be plural (e.g., "{{path}}s"). You can disable this check by setting checkPluralization to false.',
|
|
111
|
+
controllerPathShouldBeKebabCase: 'Controller path "{{path}}" should be in {{format}} format.',
|
|
112
|
+
routePathShouldBeKebabCase: 'Route path "{{path}}" should be in {{format}} format.',
|
|
113
|
+
},
|
|
114
|
+
schema: [
|
|
115
|
+
{
|
|
116
|
+
type: "object",
|
|
117
|
+
additionalProperties: false,
|
|
118
|
+
properties: {
|
|
119
|
+
checkPluralization: {
|
|
120
|
+
description: "Check that controller paths use plural resource names",
|
|
121
|
+
type: "boolean",
|
|
122
|
+
},
|
|
123
|
+
caseFormat: {
|
|
124
|
+
description: "The case format to enforce for paths. Options: kebab-case, snake_case, camelCase",
|
|
125
|
+
type: "string",
|
|
126
|
+
enum: ["kebab-case", "snake_case", "camelCase"],
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
hasSuggestions: false,
|
|
132
|
+
type: "suggestion",
|
|
133
|
+
},
|
|
134
|
+
defaultOptions: defaultRuleOptions,
|
|
135
|
+
create(context) {
|
|
136
|
+
const options = context.options && context.options.length > 0
|
|
137
|
+
? context.options[0]
|
|
138
|
+
: defaultRuleOptions[0];
|
|
139
|
+
return {
|
|
140
|
+
ClassDeclaration(node) {
|
|
141
|
+
const hasControllerDecorator = typedTokenHelpers.nodeHasDecoratorsNamed(node, [
|
|
142
|
+
"Controller",
|
|
143
|
+
]);
|
|
144
|
+
if (!hasControllerDecorator) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const controllerDecorator = typedTokenHelpers.getDecoratorsNamed(node, ["Controller"]);
|
|
148
|
+
if (controllerDecorator.length === 0) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const path = getDecoratorPath(controllerDecorator[0]);
|
|
152
|
+
// Skip if no path, dynamic path, or empty string
|
|
153
|
+
if (path === null || path === undefined || path === "") {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const segments = getPathSegments(path);
|
|
157
|
+
// Check pluralization for the main resource (first segment)
|
|
158
|
+
if (options.checkPluralization && segments.length > 0) {
|
|
159
|
+
const mainResource = segments[0];
|
|
160
|
+
if (!isPlural(mainResource)) {
|
|
161
|
+
context.report({
|
|
162
|
+
node: controllerDecorator[0],
|
|
163
|
+
messageId: "controllerPathShouldBePlural",
|
|
164
|
+
data: {
|
|
165
|
+
path: mainResource,
|
|
166
|
+
},
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Check case format
|
|
171
|
+
if (!matchesCaseFormat(path, options.caseFormat)) {
|
|
172
|
+
context.report({
|
|
173
|
+
node: controllerDecorator[0],
|
|
174
|
+
messageId: "controllerPathShouldBeKebabCase",
|
|
175
|
+
data: {
|
|
176
|
+
path: path,
|
|
177
|
+
format: options.caseFormat,
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
MethodDefinition(node) {
|
|
183
|
+
const hasApiMethodDecorator = typedTokenHelpers.nodeHasDecoratorsNamed(node, nestRequestMethodDecoratorNames);
|
|
184
|
+
if (!hasApiMethodDecorator) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
const methodDecorators = typedTokenHelpers.getDecoratorsNamed(node, nestRequestMethodDecoratorNames);
|
|
188
|
+
for (const decorator of methodDecorators) {
|
|
189
|
+
const path = getDecoratorPath(decorator);
|
|
190
|
+
// Skip if no path, dynamic path, or empty string
|
|
191
|
+
if (path === null || path === undefined || path === "") {
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
// Check case format
|
|
195
|
+
if (!matchesCaseFormat(path, options.caseFormat)) {
|
|
196
|
+
context.report({
|
|
197
|
+
node: decorator,
|
|
198
|
+
messageId: "routePathShouldBeKebabCase",
|
|
199
|
+
data: {
|
|
200
|
+
path: path,
|
|
201
|
+
format: options.caseFormat,
|
|
202
|
+
},
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
},
|
|
209
|
+
});
|
|
210
|
+
export default rule;
|
|
211
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlQ29ycmVjdEVuZHBvaW50TmFtaW5nQ29udmVudGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydWxlcy91c2VDb3JyZWN0RW5kcG9pbnROYW1pbmdDb252ZW50aW9uL3VzZUNvcnJlY3RFbmRwb2ludE5hbWluZ0NvbnZlbnRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQWVuRSxNQUFNLCtCQUErQixHQUFHO0lBQ3BDLEtBQUs7SUFDTCxNQUFNO0lBQ04sS0FBSztJQUNMLFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULE1BQU07SUFDTixLQUFLO0NBQ1IsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxXQUFXLEdBQUcsQ0FBQyxPQUFlLEVBQVcsRUFBRTtJQUM3QyxPQUFPLCtCQUErQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN6RCxDQUFDLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sV0FBVyxHQUFHLENBQUMsT0FBZSxFQUFXLEVBQUU7SUFDN0MsT0FBTywrQkFBK0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekQsQ0FBQyxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLFdBQVcsR0FBRyxDQUFDLE9BQWUsRUFBVyxFQUFFO0lBQzdDLE9BQU8scUJBQXFCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQy9DLENBQUMsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLFFBQVEsR0FBRyxDQUFDLElBQVksRUFBVyxFQUFFO0lBQ3ZDLDhDQUE4QztJQUM5QyxPQUFPLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJ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
|
package/dist/rules/validateNonPrimitiveNeedsTypeDecorator/validateNonPrimitiveNeedsDecorators.js
CHANGED
|
@@ -160,7 +160,8 @@ const rule = createRule({
|
|
|
160
160
|
AST_NODE_TYPES.TSTypeReference &&
|
|
161
161
|
firstParam.typeName?.type ===
|
|
162
162
|
AST_NODE_TYPES.Identifier) {
|
|
163
|
-
typeIdentifier =
|
|
163
|
+
typeIdentifier =
|
|
164
|
+
firstParam.typeName.name;
|
|
164
165
|
}
|
|
165
166
|
}
|
|
166
167
|
}
|
|
@@ -203,4 +204,4 @@ const rule = createRule({
|
|
|
203
204
|
},
|
|
204
205
|
});
|
|
205
206
|
export default rule;
|
|
206
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
207
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGVOb25QcmltaXRpdmVOZWVkc0RlY29yYXRvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcnVsZXMvdmFsaWRhdGVOb25QcmltaXRpdmVOZWVkc1R5cGVEZWNvcmF0b3IvdmFsaWRhdGVOb25QcmltaXRpdmVOZWVkc0RlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxjQUFjLEVBQVksV0FBVyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDL0UsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBR25FLE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDO0lBQzNCLGNBQWMsQ0FBQyxlQUFlO0lBQzlCLGNBQWMsQ0FBQyxnQkFBZ0I7SUFDL0IsY0FBYyxDQUFDLGVBQWU7SUFDOUIsY0FBYyxDQUFDLGFBQWE7SUFDNUIsY0FBYyxDQUFDLGFBQWE7SUFDNUIsY0FBYyxDQUFDLGdCQUFnQjtJQUMvQixjQUFjLENBQUMsWUFBWTtJQUMzQixjQUFjLENBQUMsZUFBZTtJQUM5QixjQUFjLENBQUMsYUFBYSxFQUFFLHdDQUF3QztDQUN6RSxDQUFDLENBQUM7QUFPSCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsR0FBWSxFQUFFO0lBQ3ZDLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUVGLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FHckI7SUFDRSxJQUFJLEVBQUUsdURBQXVEO0lBQzdELElBQUksRUFBRTtRQUNGLElBQUksRUFBRTtZQUNGLFdBQVcsRUFDUCxnRkFBZ0Y7U0FDdkY7UUFDRCxRQUFRLEVBQUU7WUFDTix3QkFBd0IsRUFDcEIsd0VBQXdFO1lBQzVFLHNCQUFzQixFQUNsQiw4SkFBOEo7U0FDcks7UUFDRCxNQUFNLEVBQUU7WUFD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
|