@simplysm/sd-cli 7.0.54 → 7.0.62
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/SdCliBuildResultError.mjs +8 -0
- package/dist/builder/SdCliJsLibBuilder.mjs +2 -2
- package/dist/builder/SdCliServerBuilder.mjs +7 -4
- package/dist/builder/SdCliTsLibBuilder.mjs +25 -2
- package/dist/entry-points/SdCliIndexFileGenerator.mjs +4 -4
- package/dist/entry-points/SdCliLocalUpdate.mjs +2 -2
- package/dist/entry-points/SdCliWorkspace.mjs +7 -4
- package/dist/index.mjs +28 -0
- package/dist/ng-tools/NgModuleGenerator.mjs +278 -0
- package/dist/ng-tools/babel/SdCliBbFileMetadata.mjs +331 -0
- package/dist/ng-tools/babel/SdCliBbRootMetadata.mjs +171 -0
- package/dist/ng-tools/babel/SdCliBbUtil.mjs +14 -0
- package/dist/ng-tools/babel/TSdCliBbNgMetadata.mjs +169 -0
- package/dist/ng-tools/babel/TSdCliBbTypeMetadata.mjs +127 -0
- package/dist/ng-tools/commons.mjs +2 -0
- package/dist/ng-tools/typescript/SdCliTsFileMetadata.mjs +325 -0
- package/dist/ng-tools/typescript/SdCliTsRootMetadata.mjs +28 -0
- package/dist/utils/SdCliBuildResultUtil.mjs +3 -3
- package/dist/utils/SdCliNpmConfigUtil.mjs +3 -3
- package/lib/ts-node-esm-paths.mjs +2 -2
- package/package.json +11 -7
- package/src/SdCliBuildResultError.ts +9 -0
- package/src/builder/SdCliJsLibBuilder.ts +1 -1
- package/src/builder/SdCliServerBuilder.ts +6 -3
- package/src/builder/SdCliTsLibBuilder.ts +29 -1
- package/src/entry-points/SdCliIndexFileGenerator.ts +3 -3
- package/src/entry-points/SdCliLocalUpdate.ts +1 -1
- package/src/entry-points/SdCliWorkspace.ts +7 -4
- package/src/index.ts +27 -0
- package/src/ng-tools/NgModuleGenerator.ts +361 -0
- package/src/ng-tools/babel/SdCliBbFileMetadata.ts +372 -0
- package/src/ng-tools/babel/SdCliBbRootMetadata.ts +207 -0
- package/src/ng-tools/babel/SdCliBbUtil.ts +15 -0
- package/src/ng-tools/babel/TSdCliBbNgMetadata.ts +220 -0
- package/src/ng-tools/babel/TSdCliBbTypeMetadata.ts +177 -0
- package/src/ng-tools/commons.ts +3 -0
- package/src/ng-tools/typescript/SdCliTsFileMetadata.ts +384 -0
- package/src/ng-tools/typescript/SdCliTsRootMetadata.ts +32 -0
- package/src/utils/SdCliBuildResultUtil.ts +2 -2
- package/src/utils/SdCliNpmConfigUtil.ts +2 -2
- package/tsconfig-build.json +2 -1
- package/tsconfig.json +2 -1
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import { SdCliTsRootMetadata } from "./typescript/SdCliTsRootMetadata";
|
|
2
|
+
import { SdCliBbRootMetadata } from "./babel/SdCliBbRootMetadata";
|
|
3
|
+
import { SdCliBbClassMetadata, SdCliBbObjectMetadata } from "./babel/TSdCliBbTypeMetadata";
|
|
4
|
+
import { SdCliBbNgComponentMetadata, SdCliBbNgDirectiveMetadata, SdCliBbNgModuleMetadata, SdCliBbNgPipeMetadata } from "./babel/TSdCliBbNgMetadata";
|
|
5
|
+
import { NeverEntryError } from "@simplysm/sd-core-common";
|
|
6
|
+
import { SdCliTsNgInjectableMetadata } from "./typescript/SdCliTsFileMetadata";
|
|
7
|
+
import path from "path";
|
|
8
|
+
import { JSDOM } from "jsdom";
|
|
9
|
+
import { FsUtil, PathUtil } from "@simplysm/sd-core-node";
|
|
10
|
+
import os from "os";
|
|
11
|
+
// TODO: 에러 메시지 처리
|
|
12
|
+
export class NgModuleGenerator {
|
|
13
|
+
constructor(packagePath, _srcDirRelPaths) {
|
|
14
|
+
this._srcDirRelPaths = _srcDirRelPaths;
|
|
15
|
+
this._srcPath = path.resolve(process.cwd(), "packages", "sd-angular", "src");
|
|
16
|
+
this._modulesPath = path.resolve(process.cwd(), "packages", "sd-angular", "src", "_modules");
|
|
17
|
+
this._fileWriterCache = new Map();
|
|
18
|
+
this._bbMeta = new SdCliBbRootMetadata(packagePath);
|
|
19
|
+
this._tsMeta = new SdCliTsRootMetadata(packagePath);
|
|
20
|
+
}
|
|
21
|
+
async clearModulesAsync() {
|
|
22
|
+
await FsUtil.removeAsync(this._modulesPath);
|
|
23
|
+
}
|
|
24
|
+
removeCaches(changedFilePaths) {
|
|
25
|
+
this._bbMeta.removeCaches(changedFilePaths);
|
|
26
|
+
this._tsMeta.removeCaches(changedFilePaths);
|
|
27
|
+
for (const changedFilePath of changedFilePaths) {
|
|
28
|
+
this._fileWriterCache.delete(changedFilePath);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async runAsync() {
|
|
32
|
+
const bbNgModules = this._getBbNgModuleDefs();
|
|
33
|
+
const tsPreset = this._getTsGenNgModulePreset();
|
|
34
|
+
const genNgModules = this._getGenNgModuleDefs(bbNgModules, tsPreset.modules, tsPreset.sources);
|
|
35
|
+
await this._genFileAsync(genNgModules);
|
|
36
|
+
}
|
|
37
|
+
_getBbNgModuleDefs() {
|
|
38
|
+
const entryRecord = this._bbMeta.getEntryFileMetaRecord();
|
|
39
|
+
const result = [];
|
|
40
|
+
for (const moduleName of Object.keys(entryRecord)) {
|
|
41
|
+
const fileMeta = entryRecord[moduleName];
|
|
42
|
+
for (const exp of fileMeta.exports) {
|
|
43
|
+
const metaTmp = typeof exp.target !== "string" && "__TDeclRef__" in exp.target ? this._bbMeta.findMeta(exp.target) : exp.target;
|
|
44
|
+
const metas = metaTmp instanceof Array ? metaTmp : [metaTmp];
|
|
45
|
+
for (const meta of metas) {
|
|
46
|
+
if (meta instanceof SdCliBbClassMetadata) {
|
|
47
|
+
if (meta.ngDecl instanceof SdCliBbNgModuleMetadata) {
|
|
48
|
+
const ngDecl = meta.ngDecl;
|
|
49
|
+
const resultItem = {
|
|
50
|
+
moduleName,
|
|
51
|
+
name: exp.exportedName,
|
|
52
|
+
providers: [],
|
|
53
|
+
exports: [],
|
|
54
|
+
selectors: [],
|
|
55
|
+
pipeNames: []
|
|
56
|
+
};
|
|
57
|
+
for (const modProv of ngDecl.def.providers) {
|
|
58
|
+
if (modProv instanceof SdCliBbClassMetadata) {
|
|
59
|
+
const ref = this._bbMeta.findExportRef({
|
|
60
|
+
filePath: modProv.filePath,
|
|
61
|
+
name: modProv.name
|
|
62
|
+
});
|
|
63
|
+
if (ref) {
|
|
64
|
+
resultItem.providers.push(ref);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else if (modProv instanceof SdCliBbObjectMetadata) {
|
|
68
|
+
// 무시
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
throw new NeverEntryError();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
for (const modExp of ngDecl.def.exports) {
|
|
75
|
+
if (modExp instanceof SdCliBbClassMetadata) {
|
|
76
|
+
const ref = this._bbMeta.findExportRef({
|
|
77
|
+
filePath: modExp.filePath,
|
|
78
|
+
name: modExp.name
|
|
79
|
+
});
|
|
80
|
+
if (ref) {
|
|
81
|
+
resultItem.exports.push(ref);
|
|
82
|
+
}
|
|
83
|
+
if (modExp.ngDecl instanceof SdCliBbNgDirectiveMetadata) {
|
|
84
|
+
resultItem.selectors.push(modExp.ngDecl.selector);
|
|
85
|
+
}
|
|
86
|
+
else if (modExp.ngDecl instanceof SdCliBbNgComponentMetadata) {
|
|
87
|
+
resultItem.selectors.push(modExp.ngDecl.selector);
|
|
88
|
+
}
|
|
89
|
+
else if (modExp.ngDecl instanceof SdCliBbNgPipeMetadata) {
|
|
90
|
+
resultItem.pipeNames.push(modExp.ngDecl.pipeName);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else if (typeof modExp !== "string" && "__TDeclRef__" in modExp) {
|
|
94
|
+
const modExpMeta = this._bbMeta.findMeta(modExp);
|
|
95
|
+
if (modExpMeta instanceof Array) {
|
|
96
|
+
throw new NeverEntryError();
|
|
97
|
+
}
|
|
98
|
+
if (modExpMeta instanceof SdCliBbClassMetadata) {
|
|
99
|
+
const ref = this._bbMeta.findExportRef({
|
|
100
|
+
filePath: modExpMeta.filePath,
|
|
101
|
+
name: modExpMeta.name
|
|
102
|
+
});
|
|
103
|
+
if (ref) {
|
|
104
|
+
resultItem.exports.push(ref);
|
|
105
|
+
}
|
|
106
|
+
if (modExpMeta.ngDecl instanceof SdCliBbNgDirectiveMetadata) {
|
|
107
|
+
resultItem.selectors.push(modExpMeta.ngDecl.selector);
|
|
108
|
+
}
|
|
109
|
+
else if (modExpMeta.ngDecl instanceof SdCliBbNgComponentMetadata) {
|
|
110
|
+
resultItem.selectors.push(modExpMeta.ngDecl.selector);
|
|
111
|
+
}
|
|
112
|
+
else if (modExpMeta.ngDecl instanceof SdCliBbNgPipeMetadata) {
|
|
113
|
+
resultItem.pipeNames.push(modExpMeta.ngDecl.pipeName);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
throw new NeverEntryError();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
result.push(resultItem);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return result;
|
|
128
|
+
}
|
|
129
|
+
_getTsGenNgModulePreset() {
|
|
130
|
+
const fileMetas = this._tsMeta.getFileMetas();
|
|
131
|
+
const result = { modules: [], sources: [] };
|
|
132
|
+
for (const fileMeta of fileMetas) {
|
|
133
|
+
if (!this._srcDirRelPaths.some((item) => fileMeta.filePath.startsWith(path.resolve(this._srcPath, item)))) {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
for (const cls of fileMeta.directExportClasses) {
|
|
137
|
+
if (cls.target.ngDecl) {
|
|
138
|
+
if (cls.target.ngDecl instanceof SdCliTsNgInjectableMetadata) {
|
|
139
|
+
if (cls.target.ngDecl.providedIn === "root") {
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const moduleClassName = cls.exportedName + "Module";
|
|
144
|
+
const moduleFilePath = path.resolve(this._modulesPath, path.relative(this._srcPath, path.dirname(fileMeta.filePath)), moduleClassName);
|
|
145
|
+
result.sources.push({
|
|
146
|
+
filePath: fileMeta.filePath,
|
|
147
|
+
name: cls.exportedName,
|
|
148
|
+
module: {
|
|
149
|
+
filePath: moduleFilePath,
|
|
150
|
+
name: moduleClassName
|
|
151
|
+
},
|
|
152
|
+
imports: fileMeta.imports,
|
|
153
|
+
template: "template" in cls.target.ngDecl ? cls.target.ngDecl.template : undefined,
|
|
154
|
+
isProvider: cls.target.ngDecl instanceof SdCliTsNgInjectableMetadata
|
|
155
|
+
});
|
|
156
|
+
result.modules.push({
|
|
157
|
+
filePath: moduleFilePath,
|
|
158
|
+
name: moduleClassName,
|
|
159
|
+
source: {
|
|
160
|
+
filePath: fileMeta.filePath,
|
|
161
|
+
name: cls.exportedName
|
|
162
|
+
},
|
|
163
|
+
selector: "selector" in cls.target.ngDecl ? cls.target.ngDecl.selector : undefined,
|
|
164
|
+
pipeName: "pipeName" in cls.target.ngDecl ? cls.target.ngDecl.pipeName : undefined
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return result;
|
|
170
|
+
}
|
|
171
|
+
_getGenNgModuleDefs(bbModules, presetModules, presetSources) {
|
|
172
|
+
const result = [];
|
|
173
|
+
for (const el of presetSources) {
|
|
174
|
+
const imports = [];
|
|
175
|
+
for (const imp of el.imports) {
|
|
176
|
+
if ("moduleName" in imp) {
|
|
177
|
+
for (const mod of bbModules) {
|
|
178
|
+
if (mod.exports.some((item) => item.moduleName === imp.moduleName && item.name === imp.name)) {
|
|
179
|
+
imports.push({ moduleName: mod.moduleName, name: mod.name, __TDeclRef__: "__TDeclRef__" });
|
|
180
|
+
}
|
|
181
|
+
if (mod.providers.some((item) => item.moduleName === imp.moduleName && item.name === imp.name)) {
|
|
182
|
+
imports.push({ moduleName: mod.moduleName, name: mod.name, __TDeclRef__: "__TDeclRef__" });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
for (const mod of presetModules) {
|
|
188
|
+
if (mod.source && mod.source.filePath === imp.filePath && mod.source.name === imp.name) {
|
|
189
|
+
imports.push({ filePath: mod.filePath, name: mod.name, __TDeclRef__: "__TDeclRef__" });
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (el.template !== undefined) {
|
|
195
|
+
const templateDOM = new JSDOM(el.template);
|
|
196
|
+
for (const mod of bbModules) {
|
|
197
|
+
for (const selector of mod.selectors) {
|
|
198
|
+
if (templateDOM.window.document.querySelector([
|
|
199
|
+
selector,
|
|
200
|
+
selector.replace(/\[/g, "[\\[").replace(/]/g, "\\]]"),
|
|
201
|
+
selector.replace(/\[/g, "[\\(").replace(/]/g, "\\)]")
|
|
202
|
+
].join(", ")) != null) {
|
|
203
|
+
imports.push({ moduleName: mod.moduleName, name: mod.name, __TDeclRef__: "__TDeclRef__" });
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
for (const pipeName of mod.pipeNames) {
|
|
207
|
+
if (new RegExp("| *" + pipeName + "[^\\w]").test(el.template)) {
|
|
208
|
+
imports.push({ moduleName: mod.moduleName, name: mod.name, __TDeclRef__: "__TDeclRef__" });
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
for (const mod of presetModules) {
|
|
213
|
+
if (mod.selector !== undefined) {
|
|
214
|
+
if (templateDOM.window.document.querySelector([
|
|
215
|
+
mod.selector,
|
|
216
|
+
mod.selector.replace(/\[/g, "[\\[").replace(/]/g, "\\]]"),
|
|
217
|
+
mod.selector.replace(/\[/g, "[\\(").replace(/]/g, "\\)]")
|
|
218
|
+
].join(", ")) != null) {
|
|
219
|
+
imports.push({ filePath: mod.filePath, name: mod.name, __TDeclRef__: "__TDeclRef__" });
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (mod.pipeName !== undefined) {
|
|
223
|
+
if (new RegExp("| *" + mod.pipeName + "[^\\w]").test(el.template)) {
|
|
224
|
+
imports.push({ filePath: mod.filePath, name: mod.name, __TDeclRef__: "__TDeclRef__" });
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
result.push({
|
|
230
|
+
filePath: el.module.filePath,
|
|
231
|
+
name: el.module.name,
|
|
232
|
+
imports: imports.distinct(),
|
|
233
|
+
exports: el.isProvider ? [] : [{ filePath: el.filePath, name: el.name }],
|
|
234
|
+
providers: el.isProvider ? [{ filePath: el.filePath, name: el.name }] : []
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
return result;
|
|
238
|
+
}
|
|
239
|
+
async _genFileAsync(mods) {
|
|
240
|
+
for (const mod of mods) {
|
|
241
|
+
const importMap = [...mod.imports, ...mod.exports, ...mod.providers]
|
|
242
|
+
.map((item) => ({
|
|
243
|
+
moduleName: "moduleName" in item ? item.moduleName : this._getImportModuleName(mod.filePath, item.filePath),
|
|
244
|
+
name: item.name
|
|
245
|
+
}))
|
|
246
|
+
.groupBy((item) => item.moduleName)
|
|
247
|
+
.toMap((item) => item.key, (item) => item.values.map((v) => v.name));
|
|
248
|
+
importMap.getOrCreate("@angular/core", []).push("NgModule");
|
|
249
|
+
const importTexts = [];
|
|
250
|
+
for (const moduleName of Array.from(importMap.keys()).orderBy()) {
|
|
251
|
+
const targetNames = importMap.get(moduleName).distinct();
|
|
252
|
+
if (targetNames.length === 0)
|
|
253
|
+
continue;
|
|
254
|
+
importTexts.push(`import { ${targetNames.join(", ")} } from "${moduleName}";`);
|
|
255
|
+
}
|
|
256
|
+
const content = `
|
|
257
|
+
${importTexts.join(os.EOL)}
|
|
258
|
+
|
|
259
|
+
@NgModule({
|
|
260
|
+
imports: [${mod.imports.map((item) => item.name).orderBy().join(", ")}],
|
|
261
|
+
declarations: [${mod.exports.map((item) => item.name).distinct().orderBy().join(", ")}],
|
|
262
|
+
exports: [${mod.exports.map((item) => item.name).distinct().orderBy().join(", ")}],
|
|
263
|
+
providers: [${mod.providers.map((item) => item.name).distinct().orderBy().join(", ")}]
|
|
264
|
+
})
|
|
265
|
+
export class ${mod.name} {
|
|
266
|
+
}`.trim();
|
|
267
|
+
if (this._fileWriterCache.get(mod.filePath) !== content) {
|
|
268
|
+
await FsUtil.writeFileAsync(mod.filePath + ".ts", content);
|
|
269
|
+
this._fileWriterCache.set(mod.filePath, content);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
_getImportModuleName(mainFilePath, importFilePath) {
|
|
274
|
+
const filePath = PathUtil.posix(path.relative(path.dirname(mainFilePath), importFilePath).replace(/\.ts$/, ""));
|
|
275
|
+
return filePath.startsWith(".") ? filePath : "./" + filePath;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmdNb2R1bGVHZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmctdG9vbHMvTmdNb2R1bGVHZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0YsT0FBTyxFQUNMLDBCQUEwQixFQUMxQiwwQkFBMEIsRUFDMUIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUN0QixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRSxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM5QixPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUVwQixrQkFBa0I7QUFDbEIsTUFBTSxPQUFPLGlCQUFpQjtJQVM1QixZQUFtQixXQUFtQixFQUFtQixlQUF5QjtRQUF6QixvQkFBZSxHQUFmLGVBQWUsQ0FBVTtRQUxqRSxhQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4RSxpQkFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRXhGLHFCQUFnQixHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBRzVELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVNLEtBQUssQ0FBQyxpQkFBaUI7UUFDNUIsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRU0sWUFBWSxDQUFDLGdCQUEwQjtRQUM1QyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDNUMsS0FBSyxNQUFNLGVBQWUsSUFBSSxnQkFBZ0IsRUFBRTtZQUM5QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQy9DO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRO1FBQ25CLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzlDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBRWhELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0YsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzFELE1BQU0sTUFBTSxHQUFxQixFQUFFLENBQUM7UUFFcEMsS0FBSyxNQUFNLFVBQVUsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ2pELE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN6QyxLQUFLLE1BQU0sR0FBRyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7Z0JBQ2xDLE1BQU0sT0FBTyxHQUFHLE9BQU8sR0FBRyxDQUFDLE1BQU0sS0FBSyxRQUFRLElBQUksY0FBYyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztnQkFDaEksTUFBTSxLQUFLLEdBQUcsT0FBTyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM3RCxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtvQkFDeEIsSUFBSSxJQUFJLFlBQVksb0JBQW9CLEVBQUU7d0JBQ3hDLElBQUksSUFBSSxDQUFDLE1BQU0sWUFBWSx1QkFBdUIsRUFBRTs0QkFDbEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzs0QkFFM0IsTUFBTSxVQUFVLEdBQW1CO2dDQUNqQyxVQUFVO2dDQUNWLElBQUksRUFBRSxHQUFHLENBQUMsWUFBWTtnQ0FDdEIsU0FBUyxFQUFFLEVBQUU7Z0NBQ2IsT0FBTyxFQUFFLEVBQUU7Z0NBQ1gsU0FBUyxFQUFFLEVBQUU7Z0NBQ2IsU0FBUyxFQUFFLEVBQUU7NkJBQ2QsQ0FBQzs0QkFFRixLQUFLLE1BQU0sT0FBTyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFO2dDQUMxQyxJQUFJLE9BQU8sWUFBWSxvQkFBb0IsRUFBRTtvQ0FDM0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7d0NBQ3JDLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTt3Q0FDMUIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO3FDQUNuQixDQUFDLENBQUM7b0NBQ0gsSUFBSSxHQUFHLEVBQUU7d0NBQ1AsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7cUNBQ2hDO2lDQUNGO3FDQUNJLElBQUksT0FBTyxZQUFZLHFCQUFxQixFQUFFO29DQUNqRCxLQUFLO2lDQUNOO3FDQUNJO29DQUNILE1BQU0sSUFBSSxlQUFlLEVBQUUsQ0FBQztpQ0FDN0I7NkJBQ0Y7NEJBRUQsS0FBSyxNQUFNLE1BQU0sSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRTtnQ0FDdkMsSUFBSSxNQUFNLFlBQVksb0JBQW9CLEVBQUU7b0NBQzFDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO3dDQUNyQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7d0NBQ3pCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtxQ0FDbEIsQ0FBQyxDQUFDO29DQUNILElBQUksR0FBRyxFQUFFO3dDQUNQLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FDQUM5QjtvQ0FFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLFlBQVksMEJBQTBCLEVBQUU7d0NBQ3ZELFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7cUNBQ25EO3lDQUNJLElBQUksTUFBTSxDQUFDLE1BQU0sWUFBWSwwQkFBMEIsRUFBRTt3Q0FDNUQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztxQ0FDbkQ7eUNBQ0ksSUFBSSxNQUFNLENBQUMsTUFBTSxZQUFZLHFCQUFxQixFQUFFO3dDQUN2RCxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3FDQUNuRDtpQ0FDRjtxQ0FDSSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxjQUFjLElBQUksTUFBTSxFQUFFO29DQUMvRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQ0FDakQsSUFBSSxVQUFVLFlBQVksS0FBSyxFQUFFO3dDQUMvQixNQUFNLElBQUksZUFBZSxFQUFFLENBQUM7cUNBQzdCO29DQUVELElBQUksVUFBVSxZQUFZLG9CQUFvQixFQUFFO3dDQUM5QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQzs0Q0FDckMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFROzRDQUM3QixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7eUNBQ3RCLENBQUMsQ0FBQzt3Q0FDSCxJQUFJLEdBQUcsRUFBRTs0Q0FDUCxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzt5Q0FDOUI7d0NBRUQsSUFBSSxVQUFVLENBQUMsTUFBTSxZQUFZLDBCQUEwQixFQUFFOzRDQUMzRCxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3lDQUN2RDs2Q0FDSSxJQUFJLFVBQVUsQ0FBQyxNQUFNLFlBQVksMEJBQTBCLEVBQUU7NENBQ2hFLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7eUNBQ3ZEOzZDQUNJLElBQUksVUFBVSxDQUFDLE1BQU0sWUFBWSxxQkFBcUIsRUFBRTs0Q0FDM0QsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQzt5Q0FDdkQ7cUNBQ0Y7aUNBQ0Y7cUNBQ0k7b0NBQ0gsTUFBTSxJQUFJLGVBQWUsRUFBRSxDQUFDO2lDQUM3Qjs2QkFDRjs0QkFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3lCQUN6QjtxQkFDRjtpQkFDRjthQUNGO1NBQ0Y7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sdUJBQXVCO1FBQzdCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFOUMsTUFBTSxNQUFNLEdBQXlFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFFbEgsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUU7WUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN6RyxTQUFTO2FBQ1Y7WUFFRCxLQUFLLE1BQU0sR0FBRyxJQUFJLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtnQkFDOUMsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtvQkFDckIsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sWUFBWSwyQkFBMkIsRUFBRTt3QkFDNUQsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEtBQUssTUFBTSxFQUFFOzRCQUMzQyxTQUFTO3lCQUNWO3FCQUNGO29CQUVELE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDO29CQUNwRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7b0JBRXZJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO3dCQUNsQixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7d0JBQzNCLElBQUksRUFBRSxHQUFHLENBQUMsWUFBWTt3QkFDdEIsTUFBTSxFQUFFOzRCQUNOLFFBQVEsRUFBRSxjQUFjOzRCQUN4QixJQUFJLEVBQUUsZUFBZTt5QkFDdEI7d0JBQ0QsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPO3dCQUN6QixRQUFRLEVBQUUsVUFBVSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVM7d0JBQ2xGLFVBQVUsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sWUFBWSwyQkFBMkI7cUJBQ3JFLENBQUMsQ0FBQztvQkFFSCxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQzt3QkFDbEIsUUFBUSxFQUFFLGNBQWM7d0JBQ3hCLElBQUksRUFBRSxlQUFlO3dCQUNyQixNQUFNLEVBQUU7NEJBQ04sUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFROzRCQUMzQixJQUFJLEVBQUUsR0FBRyxDQUFDLFlBQVk7eUJBQ3ZCO3dCQUNELFFBQVEsRUFBRSxVQUFVLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUzt3QkFDbEYsUUFBUSxFQUFFLFVBQVUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTO3FCQUNuRixDQUFDLENBQUM7aUJBQ0o7YUFDRjtTQUNGO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLG1CQUFtQixDQUFDLFNBQTJCLEVBQUUsYUFBcUMsRUFBRSxhQUFxQztRQUNuSSxNQUFNLE1BQU0sR0FBd0IsRUFBRSxDQUFDO1FBRXZDLEtBQUssTUFBTSxFQUFFLElBQUksYUFBYSxFQUFFO1lBQzlCLE1BQU0sT0FBTyxHQUFvQixFQUFFLENBQUM7WUFDcEMsS0FBSyxNQUFNLEdBQUcsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFO2dCQUM1QixJQUFJLFlBQVksSUFBSSxHQUFHLEVBQUU7b0JBQ3ZCLEtBQUssTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFO3dCQUMzQixJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLEdBQUcsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7NEJBQzVGLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQzt5QkFDNUY7d0JBQ0QsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsS0FBSyxHQUFHLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFOzRCQUM5RixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7eUJBQzVGO3FCQUNGO2lCQUNGO3FCQUNJO29CQUNILEtBQUssTUFBTSxHQUFHLElBQUksYUFBYSxFQUFFO3dCQUMvQixJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssR0FBRyxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxFQUFFOzRCQUN0RixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7eUJBQ3hGO3FCQUNGO2lCQUNGO2FBQ0Y7WUFFRCxJQUFJLEVBQUUsQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO2dCQUM3QixNQUFNLFdBQVcsR0FBRyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBRTNDLEtBQUssTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFO29CQUMzQixLQUFLLE1BQU0sUUFBUSxJQUFJLEdBQUcsQ0FBQyxTQUFTLEVBQUU7d0JBQ3BDLElBQ0UsV0FBVyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDOzRCQUN4QyxRQUFROzRCQUNSLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDOzRCQUNyRCxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQzt5QkFDdEQsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQ3JCOzRCQUNBLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQzt5QkFDNUY7cUJBQ0Y7b0JBRUQsS0FBSyxNQUFNLFFBQVEsSUFBSSxHQUFHLENBQUMsU0FBUyxFQUFFO3dCQUNwQyxJQUFJLElBQUksTUFBTSxDQUFDLEtBQUssR0FBRyxRQUFRLEdBQUcsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRTs0QkFDN0QsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO3lCQUM1RjtxQkFDRjtpQkFDRjtnQkFFRCxLQUFLLE1BQU0sR0FBRyxJQUFJLGFBQWEsRUFBRTtvQkFDL0IsSUFBSSxHQUFHLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTt3QkFDOUIsSUFDRSxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7NEJBQ3hDLEdBQUcsQ0FBQyxRQUFROzRCQUNaLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQzs0QkFDekQsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO3lCQUMxRCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksRUFDckI7NEJBQ0EsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO3lCQUN4RjtxQkFDRjtvQkFFRCxJQUFJLEdBQUcsQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO3dCQUM5QixJQUFJLElBQUksTUFBTSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUU7NEJBQ2pFLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQzt5QkFDeEY7cUJBQ0Y7aUJBQ0Y7YUFDRjtZQUVELE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ1YsUUFBUSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUTtnQkFDNUIsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSTtnQkFDcEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUU7Z0JBQzNCLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN4RSxTQUFTLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTthQUMzRSxDQUFDLENBQUM7U0FDSjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQXlCO1FBQ25ELEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ3RCLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUM7aUJBQ2pFLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDZCxVQUFVLEVBQUUsWUFBWSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDM0csSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2FBQ2hCLENBQUMsQ0FBQztpQkFDRixPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7aUJBQ2xDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLFNBQVMsQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUU1RCxNQUFNLFdBQVcsR0FBYSxFQUFFLENBQUM7WUFDakMsS0FBSyxNQUFNLFVBQVUsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUMvRCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUMxRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQztvQkFBRSxTQUFTO2dCQUN2QyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxVQUFVLElBQUksQ0FBQyxDQUFDO2FBQ2hGO1lBRUQsTUFBTSxPQUFPLEdBQUc7RUFDcEIsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDOzs7Y0FHWixHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7bUJBQ3BELEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztjQUN6RSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ2xFLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzs7ZUFFdkUsR0FBRyxDQUFDLElBQUk7RUFDckIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVKLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssT0FBTyxFQUFFO2dCQUN2RCxNQUFNLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQzthQUNsRDtTQUNGO0lBQ0gsQ0FBQztJQUVPLG9CQUFvQixDQUFDLFlBQW9CLEVBQUUsY0FBc0I7UUFDdkUsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hILE9BQU8sUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO0lBQy9ELENBQUM7Q0FDRiJ9
|