presetter 3.1.0 → 3.3.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/README.md +7 -7
- package/lib/content.d.ts +1 -1
- package/lib/content.js +58 -129
- package/lib/directive.js +67 -196
- package/lib/error.js +12 -36
- package/lib/executable/entry.js +55 -73
- package/lib/executable/error.js +24 -55
- package/lib/executable/index.js +5 -23
- package/lib/index.js +20 -69
- package/lib/io.d.ts +1 -1
- package/lib/io.js +88 -170
- package/lib/package.js +58 -149
- package/lib/preset.js +160 -294
- package/lib/run.js +59 -127
- package/lib/scripts.js +52 -128
- package/lib/template.js +70 -139
- package/lib/types.d.ts +1 -0
- package/lib/types.js +2 -1
- package/package.json +9 -1
- package/lib/content.js.map +0 -1
- package/lib/directive.js.map +0 -1
- package/lib/error.js.map +0 -1
- package/lib/executable/entry.js.map +0 -1
- package/lib/executable/error.js.map +0 -1
- package/lib/executable/index.js.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/io.js.map +0 -1
- package/lib/package.js.map +0 -1
- package/lib/preset.js.map +0 -1
- package/lib/run.js.map +0 -1
- package/lib/scripts.js.map +0 -1
- package/lib/template.js.map +0 -1
- package/lib/types.js.map +0 -1
package/lib/preset.js
CHANGED
@@ -1,325 +1,191 @@
|
|
1
1
|
"use strict";
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
+
}) : function(o, v) {
|
16
|
+
o["default"] = v;
|
5
17
|
});
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
exports
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
var _writePkg = _interopRequireDefault(require("write-pkg"));
|
31
|
-
|
32
|
-
var _content = require("./content");
|
33
|
-
|
34
|
-
var _io = require("./io");
|
35
|
-
|
36
|
-
var _package = require("./package");
|
37
|
-
|
38
|
-
var _template = require("./template");
|
39
|
-
|
40
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
41
|
-
|
42
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
43
|
-
|
44
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
45
|
-
|
46
|
-
/** presetter configuration filename */
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
19
|
+
if (mod && mod.__esModule) return mod;
|
20
|
+
var result = {};
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
22
|
+
__setModuleDefault(result, mod);
|
23
|
+
return result;
|
24
|
+
};
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
27
|
+
};
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
29
|
+
exports.getDestinationMap = exports.getContext = exports.unsetPreset = exports.bootstrapContent = exports.bootstrapPreset = exports.setupPreset = exports.getScripts = exports.getPresetAssets = exports.assertPresetterRC = exports.updatePresetterRC = exports.getPresetterRC = void 0;
|
30
|
+
const console_1 = require("console");
|
31
|
+
const fs_extra_1 = require("fs-extra");
|
32
|
+
const lodash_1 = require("lodash");
|
33
|
+
const path_1 = require("path");
|
34
|
+
const read_pkg_1 = __importDefault(require("read-pkg"));
|
35
|
+
const resolve_pkg_1 = __importDefault(require("resolve-pkg"));
|
36
|
+
const write_pkg_1 = __importDefault(require("write-pkg"));
|
37
|
+
const content_1 = require("./content");
|
38
|
+
const io_1 = require("./io");
|
39
|
+
const package_1 = require("./package");
|
40
|
+
const template_1 = require("./template");
|
47
41
|
const PRESETTERRC = '.presetterrc';
|
48
42
|
const JSON_INDENT = 2;
|
49
|
-
/**
|
50
|
-
* get the .presetterrc configuration file content
|
51
|
-
* @param root the base directory in which the configuration file should be located
|
52
|
-
* @returns content of the configuration file
|
53
|
-
*/
|
54
|
-
|
55
43
|
async function getPresetterRC(root) {
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
return custom;
|
44
|
+
const potentialConfigFiles = ['', '.json'].map((ext) => (0, path_1.resolve)(root, `${PRESETTERRC}${ext}`));
|
45
|
+
for (const path of potentialConfigFiles) {
|
46
|
+
if (await (0, fs_extra_1.pathExists)(path)) {
|
47
|
+
const custom = await (0, io_1.loadFile)(path, 'json');
|
48
|
+
assertPresetterRC(custom);
|
49
|
+
return custom;
|
50
|
+
}
|
64
51
|
}
|
65
|
-
|
66
|
-
|
67
|
-
throw new Error('Missing preset defined in .presetterrc');
|
52
|
+
throw new Error('Missing preset defined in .presetterrc');
|
68
53
|
}
|
69
|
-
|
70
|
-
* update .presetterrc configuration file content
|
71
|
-
* @param root the base directory in which the configuration file should be located
|
72
|
-
* @param config content to be merged with the existing configuration file
|
73
|
-
*/
|
74
|
-
|
75
|
-
|
54
|
+
exports.getPresetterRC = getPresetterRC;
|
76
55
|
async function updatePresetterRC(root, config) {
|
77
|
-
|
78
|
-
|
79
|
-
spaces: JSON_INDENT
|
80
|
-
});
|
56
|
+
const existingPresetterRC = await getPresetterRC(root).catch(() => ({}));
|
57
|
+
await (0, fs_extra_1.writeJSON)((0, path_1.resolve)(root, `${PRESETTERRC}.json`), (0, template_1.merge)(existingPresetterRC, config), { spaces: JSON_INDENT });
|
81
58
|
}
|
82
|
-
|
83
|
-
* check that the configuration is valid
|
84
|
-
* @param value content from a configuration file
|
85
|
-
*/
|
86
|
-
|
87
|
-
|
59
|
+
exports.updatePresetterRC = updatePresetterRC;
|
88
60
|
function assertPresetterRC(value) {
|
89
|
-
|
90
|
-
|
91
|
-
|
61
|
+
if (!(0, template_1.isJSON)(value) ||
|
62
|
+
(typeof value['preset'] !== 'string' && !Array.isArray(value['preset']))) {
|
63
|
+
throw new Error(`invalid presetter configuration file`);
|
64
|
+
}
|
92
65
|
}
|
93
|
-
|
94
|
-
* get the preset package name from package.json
|
95
|
-
* @param context context about the target project and any customisation in .presetterrc
|
96
|
-
* @returns name of the preset package
|
97
|
-
*/
|
98
|
-
|
99
|
-
|
66
|
+
exports.assertPresetterRC = assertPresetterRC;
|
100
67
|
async function getPresetAssets(context) {
|
101
|
-
|
102
|
-
|
103
|
-
preset
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
} = await Promise.resolve(`${module}`).then(s => _interopRequireWildcard(require(s)));
|
119
|
-
const asset = await presetPresetAsset(context); // add extended assets first
|
120
|
-
|
121
|
-
const extensions = (_asset$extends$map = (_asset$extends = asset.extends) === null || _asset$extends === void 0 ? void 0 : _asset$extends.map(async extension => getPresetAssets({ ...context,
|
122
|
-
custom: { ...context.custom,
|
123
|
-
preset: extension
|
68
|
+
var _a, _b;
|
69
|
+
const { preset } = context.custom;
|
70
|
+
const presets = Array.isArray(preset) ? preset : [preset];
|
71
|
+
const assets = [];
|
72
|
+
for (const preset of presets) {
|
73
|
+
try {
|
74
|
+
const module = (0, resolve_pkg_1.default)(preset, {
|
75
|
+
cwd: context.target.root,
|
76
|
+
});
|
77
|
+
const { default: presetPresetAsset } = (await Promise.resolve().then(() => __importStar(require(module))));
|
78
|
+
const asset = await presetPresetAsset(context);
|
79
|
+
const extensions = (_b = (_a = asset.extends) === null || _a === void 0 ? void 0 : _a.map(async (extension) => getPresetAssets(Object.assign(Object.assign({}, context), { custom: Object.assign(Object.assign({}, context.custom), { preset: extension }) })))) !== null && _b !== void 0 ? _b : [];
|
80
|
+
assets.push(...(await Promise.all(extensions)).flat());
|
81
|
+
assets.push(asset);
|
82
|
+
}
|
83
|
+
catch (_c) {
|
84
|
+
throw new Error(`cannot resolve preset ${preset}`);
|
124
85
|
}
|
125
|
-
}))) !== null && _asset$extends$map !== void 0 ? _asset$extends$map : [];
|
126
|
-
assets.push(...(await Promise.all(extensions)).flat()); // then asset from this preset so that this preset can override the extended ones
|
127
|
-
|
128
|
-
assets.push(asset);
|
129
|
-
} catch {
|
130
|
-
throw new Error(`cannot resolve preset ${preset}`);
|
131
86
|
}
|
132
|
-
|
133
|
-
|
134
|
-
return assets;
|
87
|
+
return assets;
|
135
88
|
}
|
136
|
-
|
137
|
-
* merge all scripts templates
|
138
|
-
* @param context context about the target project and any customisation in .presetterrc
|
139
|
-
* @returns scripts template
|
140
|
-
*/
|
141
|
-
|
142
|
-
|
89
|
+
exports.getPresetAssets = getPresetAssets;
|
143
90
|
async function getScripts(context) {
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
const scriptsWithCustomConfig = (0, _template.merge)(scriptsFromPreset, custom.scripts); // replace the template variables
|
157
|
-
|
158
|
-
return (0, _template.template)(scriptsWithCustomConfig, variable);
|
91
|
+
const { custom } = context;
|
92
|
+
const assets = await getPresetAssets(context);
|
93
|
+
const variable = (0, content_1.getVariable)(assets, context);
|
94
|
+
const scripts = await Promise.all([
|
95
|
+
...assets.map(({ scripts }) => scripts),
|
96
|
+
...assets.map(({ supplementaryScripts }) => supplementaryScripts),
|
97
|
+
]
|
98
|
+
.filter((path) => typeof path === 'string')
|
99
|
+
.map(async (path) => (await (0, io_1.loadFile)(path, 'yaml'))));
|
100
|
+
const scriptsFromPreset = scripts.reduce((merged, scripts) => (0, template_1.merge)(merged, scripts), {});
|
101
|
+
const scriptsWithCustomConfig = (0, template_1.merge)(scriptsFromPreset, custom.scripts);
|
102
|
+
return (0, template_1.template)(scriptsWithCustomConfig, variable);
|
159
103
|
}
|
160
|
-
|
161
|
-
* adopt a preset to the project
|
162
|
-
* @param uris list of name or git url of the preset
|
163
|
-
*/
|
164
|
-
|
165
|
-
|
104
|
+
exports.getScripts = getScripts;
|
166
105
|
async function setupPreset(...uris) {
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
const newPackages = getNewPackages({ ...packageBefore
|
189
|
-
}, { ...packageAfter
|
190
|
-
});
|
191
|
-
const preset = newPackages.filter(name => name !== 'presetter');
|
192
|
-
(0, _console.info)('Updating .presetterrc.json & package.json'); // update .presetterrc.json
|
193
|
-
|
194
|
-
await updatePresetterRC(root, {
|
195
|
-
preset
|
196
|
-
}); // bootstrap configuration files with the new .presetterrc.json
|
197
|
-
|
198
|
-
const context = await getContext();
|
199
|
-
await bootstrapContent(context); // insert post install script if not preset
|
200
|
-
|
201
|
-
await (0, _writePkg.default)(root, (0, _lodash.defaultsDeep)(context.target.package, {
|
202
|
-
scripts: {
|
203
|
-
prepare: 'presetter bootstrap'
|
204
|
-
}
|
205
|
-
}));
|
206
|
-
(0, _console.info)('Done. Enjoy coding!');
|
106
|
+
const { path } = await (0, package_1.getPackage)();
|
107
|
+
const root = (0, path_1.dirname)(path);
|
108
|
+
const packageBefore = (await (0, read_pkg_1.default)({ cwd: root })).devDependencies;
|
109
|
+
(0, console_1.info)(`Installing ${uris.join(' ')}... it may take a few moment...`);
|
110
|
+
await (0, package_1.reifyDependencies)({
|
111
|
+
root,
|
112
|
+
add: ['presetter', ...uris],
|
113
|
+
saveAs: 'dev',
|
114
|
+
lockFile: true,
|
115
|
+
});
|
116
|
+
const packageAfter = (await (0, read_pkg_1.default)({ cwd: root })).devDependencies;
|
117
|
+
const newPackages = getNewPackages(Object.assign({}, packageBefore), Object.assign({}, packageAfter));
|
118
|
+
const preset = newPackages.filter((name) => name !== 'presetter');
|
119
|
+
(0, console_1.info)('Updating .presetterrc.json & package.json');
|
120
|
+
await updatePresetterRC(root, { preset });
|
121
|
+
const context = await getContext();
|
122
|
+
await bootstrapContent(context);
|
123
|
+
await (0, write_pkg_1.default)(root, (0, lodash_1.defaultsDeep)(context.target.package, {
|
124
|
+
scripts: { prepare: 'presetter bootstrap' },
|
125
|
+
}));
|
126
|
+
(0, console_1.info)('Done. Enjoy coding!');
|
207
127
|
}
|
208
|
-
|
209
|
-
* bootstrap the preset to the current project root
|
210
|
-
* @param options options on how to bootstrap the preset
|
211
|
-
* @param options.force do all steps despite potential step saving
|
212
|
-
*/
|
213
|
-
|
214
|
-
|
128
|
+
exports.setupPreset = setupPreset;
|
215
129
|
async function bootstrapPreset(options) {
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
if (force || !(0, _package.arePeerPackagesAutoInstalled)()) {
|
223
|
-
await (0, _package.reifyDependencies)({
|
224
|
-
root: context.target.root
|
225
|
-
});
|
226
|
-
} // generate configurations
|
227
|
-
|
228
|
-
|
229
|
-
await bootstrapContent(context);
|
130
|
+
const { force = false } = Object.assign({}, options);
|
131
|
+
const context = await getContext();
|
132
|
+
if (force || !(0, package_1.arePeerPackagesAutoInstalled)()) {
|
133
|
+
await (0, package_1.reifyDependencies)({ root: context.target.root });
|
134
|
+
}
|
135
|
+
await bootstrapContent(context);
|
230
136
|
}
|
231
|
-
|
232
|
-
* generate files from templates and link them to the target project root
|
233
|
-
* @param context context about the target project and any customisation in .presetterrc
|
234
|
-
*/
|
235
|
-
|
236
|
-
|
137
|
+
exports.bootstrapPreset = bootstrapPreset;
|
237
138
|
async function bootstrapContent(context) {
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
139
|
+
var _a;
|
140
|
+
const assets = await getPresetAssets(context);
|
141
|
+
const content = await (0, content_1.generateContent)(assets, context);
|
142
|
+
const resolvedContext = await (0, content_1.resolveContext)(assets, context);
|
143
|
+
const userIgnores = (_a = context.custom.ignores) !== null && _a !== void 0 ? _a : [];
|
144
|
+
const presetIgnores = (await Promise.all(assets.map(({ supplementaryIgnores }) => supplementaryIgnores instanceof Function
|
145
|
+
? supplementaryIgnores(resolvedContext)
|
146
|
+
: supplementaryIgnores)))
|
147
|
+
.filter((rules) => !!rules)
|
148
|
+
.flat();
|
149
|
+
const filteredContent = (0, template_1.filter)(content, ...presetIgnores, ...userIgnores);
|
150
|
+
const destinationMap = await getDestinationMap(filteredContent, resolvedContext);
|
151
|
+
await (0, io_1.writeFiles)(context.target.root, filteredContent, destinationMap);
|
152
|
+
await (0, io_1.linkFiles)(context.target.root, destinationMap);
|
251
153
|
}
|
252
|
-
|
253
|
-
* uninstall the preset from the current project root
|
254
|
-
*/
|
255
|
-
|
256
|
-
|
154
|
+
exports.bootstrapContent = bootstrapContent;
|
257
155
|
async function unsetPreset() {
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
156
|
+
const context = await getContext();
|
157
|
+
const assets = await getPresetAssets(context);
|
158
|
+
const content = await (0, content_1.generateContent)(assets, context);
|
159
|
+
const resolvedContext = await (0, content_1.resolveContext)(assets, context);
|
160
|
+
const configurationLink = await getDestinationMap(content, resolvedContext);
|
161
|
+
await (0, io_1.unlinkFiles)(context.target.root, configurationLink);
|
264
162
|
}
|
265
|
-
|
266
|
-
* get context about the target project and any customisation in .presetterrc
|
267
|
-
* @returns context about the target project and any customisation in .presetterrc
|
268
|
-
*/
|
269
|
-
|
270
|
-
|
163
|
+
exports.unsetPreset = unsetPreset;
|
271
164
|
async function getContext() {
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
package: json
|
281
|
-
};
|
282
|
-
const custom = await getPresetterRC(root);
|
283
|
-
return {
|
284
|
-
target,
|
285
|
-
custom
|
286
|
-
};
|
165
|
+
const { json, path } = await (0, package_1.getPackage)();
|
166
|
+
const root = (0, path_1.dirname)(path);
|
167
|
+
const target = { name: json.name, root, package: json };
|
168
|
+
const custom = await getPresetterRC(root);
|
169
|
+
return {
|
170
|
+
target,
|
171
|
+
custom,
|
172
|
+
};
|
287
173
|
}
|
288
|
-
|
289
|
-
* compute the output paths of all configuration files to be generated
|
290
|
-
* @param template resolved template map
|
291
|
-
* @param context resolved context about the target project and customisation
|
292
|
-
* @returns mapping of configuration symlinks to its real path
|
293
|
-
*/
|
294
|
-
|
295
|
-
|
174
|
+
exports.getContext = getContext;
|
296
175
|
async function getDestinationMap(template, context) {
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
cwd: root
|
308
|
-
});
|
309
|
-
const outDir = (0, _path.resolve)(presetterDir, 'generated', context.target.name);
|
310
|
-
const relativePaths = [...Object.keys(template)];
|
311
|
-
return Object.fromEntries([...relativePaths.map(relativePath => [relativePath, (0, _path.resolve)( // output on the project root if it's specified as not a symlink
|
312
|
-
noSymlinks.includes(relativePath) ? context.target.root : outDir, relativePath)])]);
|
176
|
+
const { custom: { noSymlinks }, target: { root }, } = context;
|
177
|
+
const presetterDir = (0, resolve_pkg_1.default)('presetter', { cwd: root });
|
178
|
+
const outDir = (0, path_1.resolve)(presetterDir, 'generated', context.target.name);
|
179
|
+
const relativePaths = [...Object.keys(template)];
|
180
|
+
return Object.fromEntries([
|
181
|
+
...relativePaths.map((relativePath) => [
|
182
|
+
relativePath,
|
183
|
+
(0, path_1.resolve)(noSymlinks.includes(relativePath) ? context.target.root : outDir, relativePath),
|
184
|
+
]),
|
185
|
+
]);
|
313
186
|
}
|
314
|
-
|
315
|
-
* get a list of new packages installed by comparing the before and after state of devDependencies in package.json
|
316
|
-
* @param before before state of devDependencies in package.json
|
317
|
-
* @param after after state of devDependencies in package.json
|
318
|
-
* @returns list of new package names
|
319
|
-
*/
|
320
|
-
|
321
|
-
|
187
|
+
exports.getDestinationMap = getDestinationMap;
|
322
188
|
function getNewPackages(before, after) {
|
323
|
-
|
189
|
+
return Object.keys(after).filter((name) => !before[name]);
|
324
190
|
}
|
325
|
-
//# sourceMappingURL=
|
191
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlc2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc291cmNlL3ByZXNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWVBLHFDQUErQjtBQUMvQix1Q0FBaUQ7QUFDakQsbUNBQXNDO0FBQ3RDLCtCQUF3QztBQUN4Qyx3REFBbUM7QUFDbkMsOERBQXlDO0FBQ3pDLDBEQUFxQztBQUVyQyx1Q0FBeUU7QUFDekUsNkJBQW9FO0FBQ3BFLHVDQUltQjtBQUNuQix5Q0FBNkQ7QUFhN0QsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDO0FBRW5DLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQztBQU9mLEtBQUssVUFBVSxjQUFjLENBQUMsSUFBWTtJQUMvQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQ3JELElBQUEsY0FBTyxFQUFDLElBQUksRUFBRSxHQUFHLFdBQVcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUN0QyxDQUFDO0lBRUYsS0FBSyxNQUFNLElBQUksSUFBSSxvQkFBb0IsRUFBRTtRQUN2QyxJQUFJLE1BQU0sSUFBQSxxQkFBVSxFQUFDLElBQUksQ0FBQyxFQUFFO1lBRTFCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSxhQUFRLEVBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzVDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTFCLE9BQU8sTUFBTSxDQUFDO1NBQ2Y7S0FDRjtJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztBQUM1RCxDQUFDO0FBaEJELHdDQWdCQztBQU9NLEtBQUssVUFBVSxpQkFBaUIsQ0FDckMsSUFBWSxFQUNaLE1BQXVCO0lBRXZCLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUV6RSxNQUFNLElBQUEsb0JBQVMsRUFDYixJQUFBLGNBQU8sRUFBQyxJQUFJLEVBQUUsR0FBRyxXQUFXLE9BQU8sQ0FBQyxFQUNwQyxJQUFBLGdCQUFLLEVBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLEVBQ2xDLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUN4QixDQUFDO0FBQ0osQ0FBQztBQVhELDhDQVdDO0FBTUQsU0FBZ0IsaUJBQWlCLENBQy9CLEtBQWM7SUFFZCxJQUNFLENBQUMsSUFBQSxpQkFBTSxFQUFDLEtBQUssQ0FBQztRQUNkLENBQUMsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUN4RTtRQUNBLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztLQUN6RDtBQUNILENBQUM7QUFURCw4Q0FTQztBQU9NLEtBQUssVUFBVSxlQUFlLENBQ25DLE9BQXNCOztJQUd0QixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUVsQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFMUQsTUFBTSxNQUFNLEdBQWtCLEVBQUUsQ0FBQztJQUVqQyxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtRQUM1QixJQUFJO1lBRUYsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBYyxFQUFDLE1BQU0sRUFBRTtnQkFDcEMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSTthQUN6QixDQUFDLENBQUM7WUFFSCxNQUFNLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyx3REFBYSxNQUFPLEdBQUMsQ0FFNUQsQ0FBQztZQUVGLE1BQU0sS0FBSyxHQUFHLE1BQU0saUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFHL0MsTUFBTSxVQUFVLEdBQ2QsTUFBQSxNQUFBLEtBQUssQ0FBQyxPQUFPLDBDQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FDckMsZUFBZSxpQ0FDVixPQUFPLEtBQ1YsTUFBTSxrQ0FBTyxPQUFPLENBQUMsTUFBTSxLQUFFLE1BQU0sRUFBRSxTQUFTLE9BQzlDLENBQ0gsbUNBQUksRUFBRSxDQUFDO1lBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUd2RCxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3BCO1FBQUMsV0FBTTtZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDcEQ7S0FDRjtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUF6Q0QsMENBeUNDO0FBT00sS0FBSyxVQUFVLFVBQVUsQ0FDOUIsT0FBc0I7SUFFdEIsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUczQixNQUFNLE1BQU0sR0FBRyxNQUFNLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUc5QyxNQUFNLFFBQVEsR0FBRyxJQUFBLHFCQUFXLEVBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRzlDLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDL0I7UUFDRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUM7UUFDdkMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxFQUFFLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztLQUNsRTtTQUNFLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBa0IsRUFBRSxDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQztTQUMxRCxHQUFHLENBQ0YsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQ2IsQ0FBQyxNQUFNLElBQUEsYUFBUSxFQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBMkIsQ0FDM0QsQ0FDSixDQUFDO0lBR0YsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUN0QyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUEsZ0JBQUssRUFBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQzNDLEVBQUUsQ0FDSCxDQUFDO0lBR0YsTUFBTSx1QkFBdUIsR0FBRyxJQUFBLGdCQUFLLEVBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBR3pFLE9BQU8sSUFBQSxtQkFBUSxFQUFDLHVCQUF1QixFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3JELENBQUM7QUFuQ0QsZ0NBbUNDO0FBTU0sS0FBSyxVQUFVLFdBQVcsQ0FBQyxHQUFHLElBQWM7SUFHakQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sSUFBQSxvQkFBVSxHQUFFLENBQUM7SUFDcEMsTUFBTSxJQUFJLEdBQUcsSUFBQSxjQUFPLEVBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsTUFBTSxhQUFhLEdBQUcsQ0FBQyxNQUFNLElBQUEsa0JBQVcsRUFBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDO0lBR3pFLElBQUEsY0FBSSxFQUFDLGNBQWMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUNwRSxNQUFNLElBQUEsMkJBQWlCLEVBQUM7UUFDdEIsSUFBSTtRQUNKLEdBQUcsRUFBRSxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQztRQUMzQixNQUFNLEVBQUUsS0FBSztRQUNiLFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQyxDQUFDO0lBR0gsTUFBTSxZQUFZLEdBQUcsQ0FBQyxNQUFNLElBQUEsa0JBQVcsRUFBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDO0lBQ3hFLE1BQU0sV0FBVyxHQUFHLGNBQWMsbUJBQU0sYUFBYSxxQkFBUyxZQUFZLEVBQUcsQ0FBQztJQUM5RSxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLENBQUM7SUFFbEUsSUFBQSxjQUFJLEVBQUMsMkNBQTJDLENBQUMsQ0FBQztJQUVsRCxNQUFNLGlCQUFpQixDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFHMUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxVQUFVLEVBQUUsQ0FBQztJQUNuQyxNQUFNLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBR2hDLE1BQU0sSUFBQSxtQkFBWSxFQUNoQixJQUFJLEVBQ0osSUFBQSxxQkFBWSxFQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQ25DLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRTtLQUM1QyxDQUF5QyxDQUMzQyxDQUFDO0lBRUYsSUFBQSxjQUFJLEVBQUMscUJBQXFCLENBQUMsQ0FBQztBQUM5QixDQUFDO0FBdENELGtDQXNDQztBQU9NLEtBQUssVUFBVSxlQUFlLENBQUMsT0FFckM7SUFDQyxNQUFNLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBRSxxQkFBUSxPQUFPLENBQUUsQ0FBQztJQUV6QyxNQUFNLE9BQU8sR0FBRyxNQUFNLFVBQVUsRUFBRSxDQUFDO0lBR25DLElBQUksS0FBSyxJQUFJLENBQUMsSUFBQSxzQ0FBNEIsR0FBRSxFQUFFO1FBQzVDLE1BQU0sSUFBQSwyQkFBaUIsRUFBQyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7S0FDeEQ7SUFHRCxNQUFNLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFkRCwwQ0FjQztBQU1NLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxPQUFzQjs7SUFDM0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFBLHlCQUFlLEVBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBQSx3QkFBYyxFQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU5RCxNQUFNLFdBQVcsR0FBRyxNQUFBLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxtQ0FBSSxFQUFFLENBQUM7SUFDakQsTUFBTSxhQUFhLEdBQUcsQ0FDcEIsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLG9CQUFvQixFQUFFLEVBQUUsRUFBRSxDQUN0QyxvQkFBb0IsWUFBWSxRQUFRO1FBQ3RDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUM7UUFDdkMsQ0FBQyxDQUFDLG9CQUFvQixDQUN6QixDQUNGLENBQ0Y7U0FDRSxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQXlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ2pELElBQUksRUFBRSxDQUFDO0lBRVYsTUFBTSxlQUFlLEdBQUcsSUFBQSxpQkFBTSxFQUFDLE9BQU8sRUFBRSxHQUFHLGFBQWEsRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUFDO0lBRTFFLE1BQU0sY0FBYyxHQUFHLE1BQU0saUJBQWlCLENBQzVDLGVBQWUsRUFDZixlQUFlLENBQ2hCLENBQUM7SUFFRixNQUFNLElBQUEsZUFBVSxFQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUN2RSxNQUFNLElBQUEsY0FBUyxFQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQ3ZELENBQUM7QUEzQkQsNENBMkJDO0FBS00sS0FBSyxVQUFVLFdBQVc7SUFDL0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxVQUFVLEVBQUUsQ0FBQztJQUNuQyxNQUFNLE1BQU0sR0FBRyxNQUFNLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QyxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUEseUJBQWUsRUFBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdkQsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFBLHdCQUFjLEVBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFFNUUsTUFBTSxJQUFBLGdCQUFXLEVBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztBQUM1RCxDQUFDO0FBUkQsa0NBUUM7QUFNTSxLQUFLLFVBQVUsVUFBVTtJQUM5QixNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sSUFBQSxvQkFBVSxHQUFFLENBQUM7SUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBQSxjQUFPLEVBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsTUFBTSxNQUFNLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3hELE1BQU0sTUFBTSxHQUFHLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRTFDLE9BQU87UUFDTCxNQUFNO1FBQ04sTUFBTTtLQUNQLENBQUM7QUFDSixDQUFDO0FBVkQsZ0NBVUM7QUFRTSxLQUFLLFVBQVUsaUJBQWlCLENBQ3JDLFFBQWtDLEVBQ2xDLE9BQTRDO0lBRTVDLE1BQU0sRUFDSixNQUFNLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFDdEIsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQ2pCLEdBQUcsT0FBTyxDQUFDO0lBRVosTUFBTSxZQUFZLEdBQUcsSUFBQSxxQkFBYyxFQUFDLFdBQVcsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sTUFBTSxHQUFHLElBQUEsY0FBTyxFQUFDLFlBQWEsRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUV4RSxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBRWpELE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUN4QixHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQW9CLEVBQUUsQ0FBQztZQUN2RCxZQUFZO1lBQ1osSUFBQSxjQUFPLEVBRUwsVUFBVSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFDaEUsWUFBWSxDQUNiO1NBQ0YsQ0FBQztLQUNILENBQUMsQ0FBQztBQUNMLENBQUM7QUF4QkQsOENBd0JDO0FBUUQsU0FBUyxjQUFjLENBQ3JCLE1BQThCLEVBQzlCLEtBQTZCO0lBRTdCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQWtCLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzVFLENBQUMifQ==
|