UNPKG

jgb-cli

Version:

```shell npm i -g jgb-cli #全局安装 ```

475 lines 35.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var Debug = require("debug"); var fs = require("fs"); var lib_1 = require("jgb-shared/lib"); var awaitEventEmitter_1 = require("jgb-shared/lib/awaitEventEmitter"); var Logger_1 = require("jgb-shared/lib/Logger"); var index_1 = require("jgb-shared/lib/utils/index"); var WorkerFarm_1 = require("jgb-shared/lib/workerfarm/WorkerFarm"); var Path = require("path"); var util_1 = require("util"); var Compiler_1 = require("./Compiler"); var FSCache_1 = require("./FSCache"); var PromiseQueue_1 = require("./utils/PromiseQueue"); var Watcher_1 = require("./Watcher"); var debug = Debug('core'); var Core = /** @class */ (function (_super) { tslib_1.__extends(Core, _super); function Core(options) { var _this = _super.call(this) || this; _this.currentDir = process.cwd(); _this.loadedAssets = new Map(); _this.watchedAssets = new Map(); _this.hooks = options.hooks || []; _this.options = _this.normalizeOptions(options); if (options.rootDir) { _this.currentDir = options.rootDir; } _this.entryFiles = _this.normalizeEntryFiles(); _this.resolver = new lib_1.Resolver(_this.options); _this.compiler = new Compiler_1.default(_this.options); _this.buildQueue = new PromiseQueue_1.default(_this.processAsset.bind(_this)); if (_this.options.cache) { _this.cache = new FSCache_1.default(_this.options); } return _this; } Core.prototype.normalizeEntryFiles = function () { var _this = this; return [] .concat(this.options.entryFiles || []) .filter(Boolean) .map(function (f) { return Path.resolve(_this.options.sourceDir, f); }); }; Core.prototype.normalizeOptions = function (options) { var rootDir = Path.resolve(options.rootDir || this.currentDir); return { plugins: options.plugins, presets: options.presets, watch: !!options.watch, rootDir: rootDir, useLocalWorker: !!options.useLocalWorker, outDir: Path.resolve(options.outDir || 'dist'), npmDir: Path.resolve(options.npmDir || 'node_modules'), entryFiles: [].concat(options.entryFiles), cache: !!options.cache, sourceDir: Path.resolve(options.sourceDir || 'src'), alias: aliasResolve(options, rootDir), minify: !!options.minify, source: options.source || 'wx', target: options.target || 'wx', lib: options.lib }; }; Core.prototype.initHook = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { var allHooks; var _this = this; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: if (!this.hooks || this.hooks.length === 0) { return [2 /*return*/]; } allHooks = this.hooks.map(function (fn) { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, fn(this)]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }); return [4 /*yield*/, Promise.all(allHooks)]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; Core.prototype.init = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.compiler.init(this.resolver)]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; Core.prototype.start = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { var e_1, _a, startTime, _b, _c, entry, asset, e_1_1, endTime; return tslib_1.__generator(this, function (_d) { switch (_d.label) { case 0: startTime = new Date(); if (this.farm) { return [2 /*return*/]; } return [4 /*yield*/, this.initHook()]; case 1: _d.sent(); return [4 /*yield*/, this.emit('before-init')]; case 2: _d.sent(); return [4 /*yield*/, this.init()]; case 3: _d.sent(); return [4 /*yield*/, this.emit('before-compiler')]; case 4: _d.sent(); // another channce to modify entryFiles this.entryFiles = this.normalizeEntryFiles(); if (this.options.watch) { this.watcher = new Watcher_1.default(); this.watcher.on('change', this.onChange.bind(this)); } this.farm = WorkerFarm_1.default.getShared(this.options, { workerPath: require.resolve('./worker'), core: this }); _d.label = 5; case 5: _d.trys.push([5, 10, 11, 12]); _b = tslib_1.__values(new Set(this.entryFiles)), _c = _b.next(); _d.label = 6; case 6: if (!!_c.done) return [3 /*break*/, 9]; entry = _c.value; return [4 /*yield*/, this.resolveAsset(entry)]; case 7: asset = _d.sent(); this.buildQueue.add(asset); _d.label = 8; case 8: _c = _b.next(); return [3 /*break*/, 6]; case 9: return [3 /*break*/, 12]; case 10: e_1_1 = _d.sent(); e_1 = { error: e_1_1 }; return [3 /*break*/, 12]; case 11: try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } return [7 /*endfinally*/]; case 12: return [4 /*yield*/, this.buildQueue.run()]; case 13: _d.sent(); endTime = new Date(); Logger_1.logger.info("\u7F16\u8BD1\u8017\u65F6:" + (endTime.getTime() - startTime.getTime()) + "ms"); return [4 /*yield*/, this.emit('end-build')]; case 14: _d.sent(); this.farm.stopPref(); if (!!this.options.watch) return [3 /*break*/, 16]; return [4 /*yield*/, this.stop()]; case 15: _d.sent(); _d.label = 16; case 16: return [2 /*return*/]; } }); }); }; Core.prototype.processAsset = function (asset, isRebuild) { if (isRebuild === void 0) { isRebuild = false; } return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: if (isRebuild) { asset.invalidate(); if (this.cache) { this.cache.invalidate(asset.name); } } return [4 /*yield*/, this.loadAsset(asset)]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; Core.prototype.getAsset = function (name, parent) { return tslib_1.__awaiter(this, void 0, void 0, function () { var asset; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.resolveAsset(name, parent)]; case 1: asset = _a.sent(); this.buildQueue.add(asset); return [4 /*yield*/, this.buildQueue.run()]; case 2: _a.sent(); return [2 /*return*/, asset]; } }); }); }; Core.prototype.resolveAsset = function (name, parent) { return tslib_1.__awaiter(this, void 0, void 0, function () { var path; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.resolver.resolve(name, parent)]; case 1: path = (_a.sent()).path; return [2 /*return*/, this.getLoadedAsset(path)]; } }); }); }; Core.prototype.loadAsset = function (asset) { return tslib_1.__awaiter(this, void 0, void 0, function () { var processed, _a, cacheMiss, dependencies, assetDeps; var _this = this; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: if (asset.processed) { return [2 /*return*/]; } // logger.info(asset.name); asset.processed = true; asset.startTime = Date.now(); _a = this.cache; if (!_a) return [3 /*break*/, 2]; return [4 /*yield*/, this.cache.read(asset.name)]; case 1: _a = (_b.sent()); _b.label = 2; case 2: processed = _a; cacheMiss = false; if (!(!processed || asset.shouldInvalidate(processed.cacheData))) return [3 /*break*/, 4]; return [4 /*yield*/, this.farm.run(asset.name, asset.distPath)]; case 3: processed = _b.sent(); cacheMiss = true; _b.label = 4; case 4: asset.endTime = Date.now(); debug(asset.name + " processd time: " + (asset.endTime - asset.startTime) + "ms"); asset.id = processed.id; // asset.generated = processed.generated; asset.hash = processed.hash; dependencies = processed.dependencies; return [4 /*yield*/, Promise.all(dependencies.map(function (dep) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var assetDep; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: // from cache dep if (Array.isArray(dep) && dep.length > 1) { dep = dep[1]; } // This dependency is already included in the parent's generated output, // so no need to load it. We map the name back to the parent asset so // that changing it triggers a recompile of the parent. if (dep.includedInParent) { this.watch(dep.name, asset); return [2 /*return*/]; } dep.parent = asset.name; return [4 /*yield*/, this.resolveDep(asset, dep)]; case 1: assetDep = _a.sent(); if (!assetDep) return [3 /*break*/, 3]; if (dep.distPath) { assetDep.distPath = dep.distPath; } return [4 /*yield*/, this.loadAsset(assetDep)]; case 2: _a.sent(); dep.asset = assetDep; dep.resolved = assetDep.name; return [3 /*break*/, 4]; case 3: Logger_1.logger.warning("can not resolveDep: " + dep.name); _a.label = 4; case 4: return [2 /*return*/, assetDep]; } }); }); }))]; case 5: assetDeps = _b.sent(); if (!(this.cache && cacheMiss)) return [3 /*break*/, 7]; return [4 /*yield*/, this.cache.write(asset.name, processed)]; case 6: _b.sent(); _b.label = 7; case 7: return [2 /*return*/]; } }); }); }; Core.prototype.resolveDep = function (asset, dep, install) { if (install === void 0) { install = true; } return tslib_1.__awaiter(this, void 0, void 0, function () { var err_1; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); if (Array.isArray(dep) && dep.length === 2) { dep = dep[1]; } if (dep.resolved) { return [2 /*return*/, this.getLoadedAsset(dep.resolved)]; } return [4 /*yield*/, this.resolveAsset(dep.name, asset.name)]; case 1: return [2 /*return*/, _a.sent()]; case 2: err_1 = _a.sent(); // If the dep is optional, return before we throw if (dep.optional) { return [2 /*return*/]; } throw err_1; case 3: return [2 /*return*/]; } }); }); }; Core.prototype.getLoadedAsset = function (path) { if (this.loadedAssets.has(path)) { return this.loadedAssets.get(path); } var asset = this.compiler.getAsset(path); if (this.loadedAssets.has(asset.name)) { return this.loadedAssets.get(asset.name); } this.loadedAssets.set(path, asset); this.loadedAssets.set(asset.name, asset); this.watch(path, asset); return asset; }; Core.prototype.watch = function (path, asset) { return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: if (!this.watcher) { return [2 /*return*/]; } return [4 /*yield*/, util_1.promisify(fs.realpath)(path)]; case 1: path = _a.sent(); if (!this.watchedAssets.has(path)) { this.watcher.watch(path); this.watchedAssets.set(path, new Set()); } this.watchedAssets.get(path).add(asset); return [2 /*return*/]; } }); }); }; Core.prototype.stop = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: if (this.watcher) { this.watcher.stop(); } if (!this.farm) return [3 /*break*/, 2]; return [4 /*yield*/, this.farm.end()]; case 1: _a.sent(); _a.label = 2; case 2: return [2 /*return*/]; } }); }); }; Core.prototype.unwatch = function (path, asset) { return tslib_1.__awaiter(this, void 0, void 0, function () { var watched; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, util_1.promisify(fs.realpath)(path)]; case 1: path = _a.sent(); if (!this.watchedAssets.has(path)) { return [2 /*return*/]; } watched = this.watchedAssets.get(path); watched.delete(asset); if (watched.size === 0) { this.watchedAssets.delete(path); this.watcher.unwatch(path); } return [2 /*return*/]; } }); }); }; Core.prototype.onChange = function (path) { return tslib_1.__awaiter(this, void 0, void 0, function () { var e_2, _a, assets, assets_1, assets_1_1, asset; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: assets = this.watchedAssets.get(path); if (!assets) { return [2 /*return*/]; } try { // Add the asset to the rebuild queue, and reset the timeout. for (assets_1 = tslib_1.__values(assets), assets_1_1 = assets_1.next(); !assets_1_1.done; assets_1_1 = assets_1.next()) { asset = assets_1_1.value; this.buildQueue.add(asset, true); } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (assets_1_1 && !assets_1_1.done && (_a = assets_1.return)) _a.call(assets_1); } finally { if (e_2) throw e_2.error; } } return [4 /*yield*/, this.buildQueue.run()]; case 1: _b.sent(); return [2 /*return*/]; } }); }); }; return Core; }(awaitEventEmitter_1.default)); exports.default = Core; function aliasResolve(options, root) { var alias = options.alias || {}; var newAlias = {}; /** * 先排序 字符长度由长到短排序 (优先匹配) * 再补充 resolve(aliasValue) */ Object.keys(alias) .sort(function (a1, a2) { return a2.length - a1.length; }) .forEach(function (key) { var aliasValue = index_1.normalizeAlias(alias[key]); var aliasPath = aliasValue.path; if (!Path.isAbsolute(aliasPath)) { if (aliasPath.startsWith('.')) { aliasValue.path = index_1.pathToUnixType(Path.resolve(root, aliasPath)); } else { aliasValue.path = index_1.pathToUnixType(Path.resolve(root, 'node_modules', aliasPath)); } } newAlias[key] = aliasValue; }); return newAlias; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUErQjtBQUMvQix1QkFBeUI7QUFDekIsc0NBQStEO0FBQy9ELHNFQUFpRTtBQUNqRSxnREFBZ0U7QUFDaEUsb0RBQTRFO0FBQzVFLG1FQUE4RDtBQUM5RCwyQkFBNkI7QUFDN0IsNkJBQWlDO0FBQ2pDLHVDQUFrQztBQUNsQyxxQ0FBZ0M7QUFDaEMscURBQWdEO0FBQ2hELHFDQUFnQztBQUVoQyxJQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7QUFFNUI7SUFBa0MsZ0NBQWlCO0lBZWpELGNBQVksT0FBcUI7UUFBakMsWUFDRSxpQkFBTyxTQWdCUjtRQS9CTyxnQkFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMzQixrQkFBWSxHQUFHLElBQUksR0FBRyxFQUFpQixDQUFDO1FBUWhELG1CQUFhLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQU94QixLQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ2pDLEtBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTlDLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUNuQixLQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7U0FDbkM7UUFFRCxLQUFJLENBQUMsVUFBVSxHQUFHLEtBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzdDLEtBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxjQUFRLENBQUMsS0FBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNDLEtBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxrQkFBUSxDQUFDLEtBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQyxLQUFJLENBQUMsVUFBVSxHQUFHLElBQUksc0JBQVksQ0FBQyxLQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFJLENBQUMsQ0FBQyxDQUFDO1FBRWpFLElBQUksS0FBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7WUFDdEIsS0FBSSxDQUFDLEtBQUssR0FBRyxJQUFJLGlCQUFPLENBQUMsS0FBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3hDOztJQUNILENBQUM7SUFFRCxrQ0FBbUIsR0FBbkI7UUFBQSxpQkFLQztRQUpDLE9BQU8sRUFBRTthQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7YUFDckMsTUFBTSxDQUFDLE9BQU8sQ0FBQzthQUNmLEdBQUcsQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQXZDLENBQXVDLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsK0JBQWdCLEdBQWhCLFVBQWlCLE9BQXFCO1FBQ3BDLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakUsT0FBTztZQUNMLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN4QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87WUFDeEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSztZQUN0QixPQUFPLFNBQUE7WUFDUCxjQUFjLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjO1lBQ3hDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDO1lBQzlDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksY0FBYyxDQUFDO1lBQ3RELFVBQVUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDekMsS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSztZQUN0QixTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQztZQUNuRCxLQUFLLEVBQUUsWUFBWSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUM7WUFDckMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTTtZQUN4QixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJO1lBQzlCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxJQUFJLElBQUk7WUFDOUIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1NBQ2pCLENBQUM7SUFDSixDQUFDO0lBRUssdUJBQVEsR0FBZDs7Ozs7Ozt3QkFDRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7NEJBQzFDLHNCQUFPO3lCQUNSO3dCQUVLLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFNLEVBQUU7O3dDQUFJLHFCQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBQTt3Q0FBZCxzQkFBQSxTQUFjLEVBQUE7O2lDQUFBLENBQUMsQ0FBQzt3QkFFNUQscUJBQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBQTs7d0JBQTNCLFNBQTJCLENBQUM7Ozs7O0tBQzdCO0lBRUssbUJBQUksR0FBVjs7Ozs0QkFDRSxxQkFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUE7O3dCQUF2QyxTQUF1QyxDQUFDOzs7OztLQUN6QztJQUVLLG9CQUFLLEdBQVg7Ozs7Ozt3QkFDUSxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQzt3QkFFN0IsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFOzRCQUNiLHNCQUFPO3lCQUNSO3dCQUVELHFCQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBQTs7d0JBQXJCLFNBQXFCLENBQUM7d0JBRXRCLHFCQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUE7O3dCQUE5QixTQUE4QixDQUFDO3dCQUUvQixxQkFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUE7O3dCQUFqQixTQUFpQixDQUFDO3dCQUVsQixxQkFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUE7O3dCQUFsQyxTQUFrQyxDQUFDO3dCQUVuQyx1Q0FBdUM7d0JBQ3ZDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7d0JBRTdDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7NEJBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxpQkFBTyxFQUFFLENBQUM7NEJBRTdCLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO3lCQUNyRDt3QkFFRCxJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7NEJBQzdDLFVBQVUsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQzs0QkFDdkMsSUFBSSxFQUFFLElBQUk7eUJBQ1gsQ0FBQyxDQUFDOzs7O3dCQUVpQixLQUFBLGlCQUFBLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTs7Ozt3QkFBakMsS0FBSzt3QkFDQSxxQkFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFBOzt3QkFBdEMsS0FBSyxHQUFHLFNBQThCO3dCQUU1QyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs2QkFHN0IscUJBQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBQTs7d0JBQTNCLFNBQTJCLENBQUM7d0JBRXRCLE9BQU8sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO3dCQUUzQixlQUFNLENBQUMsSUFBSSxDQUFDLCtCQUFRLE9BQU8sQ0FBQyxPQUFPLEVBQUUsR0FBRyxTQUFTLENBQUMsT0FBTyxFQUFFLFFBQUksQ0FBQyxDQUFDO3dCQUVqRSxxQkFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFBOzt3QkFBNUIsU0FBNEIsQ0FBQzt3QkFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzs2QkFFakIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBbkIseUJBQW1CO3dCQUNyQixxQkFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUE7O3dCQUFqQixTQUFpQixDQUFDOzs7Ozs7S0FFckI7SUFFSywyQkFBWSxHQUFsQixVQUFtQixLQUFZLEVBQUUsU0FBaUI7UUFBakIsMEJBQUEsRUFBQSxpQkFBaUI7Ozs7O3dCQUNoRCxJQUFJLFNBQVMsRUFBRTs0QkFDYixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7NEJBQ25CLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQ0FDZCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7NkJBQ25DO3lCQUNGO3dCQUVELHFCQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUE7O3dCQUEzQixTQUEyQixDQUFDOzs7OztLQUM3QjtJQUVLLHVCQUFRLEdBQWQsVUFBZSxJQUFZLEVBQUUsTUFBYzs7Ozs7NEJBQzNCLHFCQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFBOzt3QkFBN0MsS0FBSyxHQUFHLFNBQXFDO3dCQUNuRCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDM0IscUJBQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBQTs7d0JBQTNCLFNBQTJCLENBQUM7d0JBQzVCLHNCQUFPLEtBQUssRUFBQzs7OztLQUNkO0lBRUssMkJBQVksR0FBbEIsVUFBbUIsSUFBWSxFQUFFLE1BQWU7Ozs7OzRCQUM3QixxQkFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUE7O3dCQUFsRCxJQUFJLEdBQUssQ0FBQSxTQUF5QyxDQUFBLEtBQTlDO3dCQUVaLHNCQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUM7Ozs7S0FDbEM7SUFFSyx3QkFBUyxHQUFmLFVBQWdCLEtBQVk7Ozs7Ozs7d0JBQzFCLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRTs0QkFDbkIsc0JBQU87eUJBQ1I7d0JBRUQsMkJBQTJCO3dCQUUzQixLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQzt3QkFFdkIsS0FBSyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBRzNCLEtBQUEsSUFBSSxDQUFDLEtBQUssQ0FBQTtpQ0FBVix3QkFBVTt3QkFBSyxxQkFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUE7O3dCQUFsQyxLQUFBLENBQUMsU0FBaUMsQ0FBQyxDQUFBOzs7d0JBRC9DLFNBQVMsS0FDc0M7d0JBQy9DLFNBQVMsR0FBRyxLQUFLLENBQUM7NkJBRWxCLENBQUEsQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQSxFQUF6RCx3QkFBeUQ7d0JBQy9DLHFCQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFBOzt3QkFBM0QsU0FBUyxHQUFHLFNBQStDLENBQUM7d0JBQzVELFNBQVMsR0FBRyxJQUFJLENBQUM7Ozt3QkFHbkIsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBRTNCLEtBQUssQ0FBSSxLQUFLLENBQUMsSUFBSSx5QkFBbUIsS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsU0FBUyxRQUFJLENBQUMsQ0FBQzt3QkFFM0UsS0FBSyxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDO3dCQUN4Qix5Q0FBeUM7d0JBQ3pDLEtBQUssQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQzt3QkFFdEIsWUFBWSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUM7d0JBRTFCLHFCQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2pDLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBTSxHQUFHOzs7Ozs0Q0FDeEIsaUJBQWlCOzRDQUNqQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0RBQ3hDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7NkNBQ2Q7NENBQ0Qsd0VBQXdFOzRDQUN4RSxxRUFBcUU7NENBQ3JFLHVEQUF1RDs0Q0FDdkQsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLEVBQUU7Z0RBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztnREFDNUIsc0JBQU87NkNBQ1I7NENBRUQsR0FBRyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDOzRDQUNQLHFCQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFBOzs0Q0FBNUMsUUFBUSxHQUFHLFNBQWlDO2lEQUM5QyxRQUFRLEVBQVIsd0JBQVE7NENBQ1YsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFO2dEQUNoQixRQUFRLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7NkNBQ2xDOzRDQUVELHFCQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUE7OzRDQUE5QixTQUE4QixDQUFDOzRDQUUvQixHQUFHLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQzs0Q0FDckIsR0FBRyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDOzs7NENBRTdCLGVBQU0sQ0FBQyxPQUFPLENBQUMseUJBQXVCLEdBQUcsQ0FBQyxJQUFNLENBQUMsQ0FBQzs7Z0RBR3BELHNCQUFPLFFBQVEsRUFBQzs7O2lDQUNqQixDQUFDLENBQ0gsRUFBQTs7d0JBL0JLLFNBQVMsR0FBRyxTQStCakI7NkJBRUcsQ0FBQSxJQUFJLENBQUMsS0FBSyxJQUFJLFNBQVMsQ0FBQSxFQUF2Qix3QkFBdUI7d0JBQ3pCLHFCQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUE7O3dCQUE3QyxTQUE2QyxDQUFDOzs7Ozs7S0FFakQ7SUFFSyx5QkFBVSxHQUFoQixVQUFpQixLQUFZLEVBQUUsR0FBUSxFQUFFLE9BQWM7UUFBZCx3QkFBQSxFQUFBLGNBQWM7Ozs7Ozs7d0JBRW5ELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTs0QkFDMUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDZDt3QkFFRCxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUU7NEJBQ2hCLHNCQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFDO3lCQUMxQzt3QkFFTSxxQkFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFBOzRCQUFwRCxzQkFBTyxTQUE2QyxFQUFDOzs7d0JBRXJELGlEQUFpRDt3QkFDakQsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFOzRCQUNoQixzQkFBTzt5QkFDUjt3QkFFRCxNQUFNLEtBQUcsQ0FBQzs7Ozs7S0FFYjtJQUVELDZCQUFjLEdBQWQsVUFBZSxJQUFZO1FBQ3pCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDL0IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwQztRQUVELElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3JDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzFDO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFekMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUssb0JBQUssR0FBWCxVQUFZLElBQVksRUFBRSxLQUFZOzs7Ozt3QkFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7NEJBQ2pCLHNCQUFPO3lCQUNSO3dCQUVNLHFCQUFNLGdCQUFTLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFBOzt3QkFBekMsSUFBSSxHQUFHLFNBQWtDLENBQUM7d0JBRTFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTs0QkFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7eUJBQ3pDO3dCQUNELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7S0FDekM7SUFFSyxtQkFBSSxHQUFWOzs7Ozt3QkFDRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7NEJBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7eUJBQ3JCOzZCQUVHLElBQUksQ0FBQyxJQUFJLEVBQVQsd0JBQVM7d0JBQ1gscUJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBQTs7d0JBQXJCLFNBQXFCLENBQUM7Ozs7OztLQUV6QjtJQUVLLHNCQUFPLEdBQWIsVUFBYyxJQUFZLEVBQUUsS0FBWTs7Ozs7NEJBQy9CLHFCQUFNLGdCQUFTLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFBOzt3QkFBekMsSUFBSSxHQUFHLFNBQWtDLENBQUM7d0JBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTs0QkFDakMsc0JBQU87eUJBQ1I7d0JBRUssT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUM3QyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUV0QixJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFOzRCQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBQzVCOzs7OztLQUNGO0lBRUssdUJBQVEsR0FBZCxVQUFlLElBQVk7Ozs7Ozt3QkFDbkIsTUFBTSxHQUFZLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNyRCxJQUFJLENBQUMsTUFBTSxFQUFFOzRCQUNYLHNCQUFPO3lCQUNSOzs0QkFFRCw2REFBNkQ7NEJBQzdELEtBQW9CLFdBQUEsaUJBQUEsTUFBTSxDQUFBLGdGQUFFO2dDQUFqQixLQUFLO2dDQUNkLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQzs2QkFDbEM7Ozs7Ozs7Ozt3QkFFRCxxQkFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFBOzt3QkFBM0IsU0FBMkIsQ0FBQzs7Ozs7S0FDN0I7SUFDSCxXQUFDO0FBQUQsQ0FBQyxBQW5URCxDQUFrQywyQkFBaUIsR0FtVGxEOztBQUVELFNBQVMsWUFBWSxDQUFDLE9BQXFCLEVBQUUsSUFBWTtJQUN2RCxJQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUNsQyxJQUFNLFFBQVEsR0FBMkIsRUFBRSxDQUFDO0lBQzVDOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1NBQ2YsSUFBSSxDQUFDLFVBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSyxPQUFBLEVBQUUsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBckIsQ0FBcUIsQ0FBQztTQUN2QyxPQUFPLENBQUMsVUFBQSxHQUFHO1FBQ1YsSUFBTSxVQUFVLEdBQUcsc0JBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5QyxJQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQy9CLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDN0IsVUFBVSxDQUFDLElBQUksR0FBRyxzQkFBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7YUFDakU7aUJBQU07Z0JBQ0wsVUFBVSxDQUFDLElBQUksR0FBRyxzQkFBYyxDQUM5QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsU0FBUyxDQUFDLENBQzlDLENBQUM7YUFDSDtTQUNGO1FBRUQsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQztJQUM3QixDQUFDLENBQUMsQ0FBQztJQUNMLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMifQ==