@meteor-community/meteor-desktop
Version:
Build a Meteor's desktop client with hot code push.
200 lines (195 loc) • 26.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = _exports;
var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime"));
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
var _shelljs = _interopRequireDefault(require("shelljs"));
var _env = _interopRequireDefault(require("./env"));
var _electron = _interopRequireDefault(require("./electron"));
var _log = _interopRequireDefault(require("./log"));
var _desktop = _interopRequireDefault(require("./desktop"));
var _electronApp = _interopRequireDefault(require("./electronApp"));
var _meteorApp = _interopRequireDefault(require("./meteorApp"));
var _electronBuilder = _interopRequireDefault(require("./electronBuilder"));
var _packager = _interopRequireDefault(require("./packager"));
var _utils = _interopRequireDefault(require("./utils"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
// eslint-disable-next-line no-unused-vars
_shelljs.default.config.fatal = true;
/**
* Main entity.
* @class
* @property {Env} env
* @property {Electron} electron
* @property {InstallerBuilder} installerBuilder
* @property {ElectronApp} electronApp
* @property {Desktop} desktop
* @property {MeteorApp} meteorApp
*/
class MeteorDesktop {
/**
* @param {string} input - Meteor app dir
* @param {string} output - output dir for bundle/package/installer
* @param {Object} options - options from cli.js
* @param {Object} dependencies - dependencies object
* @constructor
*/
constructor(input, output, options, dependencies) {
const Log = dependencies.log;
this.log = new Log('index');
this.version = this.getVersion();
this.log.info('initializing');
this.env = new _env.default(input, output, options);
this.electron = new _electron.default(this);
this.electronBuilder = new _electronBuilder.default(this);
this.electronApp = new _electronApp.default(this);
this.desktop = new _desktop.default(this);
this.meteorApp = new _meteorApp.default(this);
this.utils = _utils.default;
}
/**
* Tries to read the version from our own package.json.
*
* @returns {string}
*/
getVersion() {
if (this.version) {
return this.version;
}
let version = null;
try {
({
version
} = JSON.parse(_fs.default.readFileSync(_path.default.join(__dirname, '..', 'package.json'), 'UTF-8')));
} catch (e) {
this.log.error(`error while trying to read ${_path.default.join(__dirname, 'package.json')}`, e);
process.exit(1);
}
return version;
}
/**
* Tries to read the version from our own package.json.
*
* @returns {string}
*/
getElectronVersion() {
let version = null;
try {
const {
dependencies = {},
devDependencies = {}
} = JSON.parse(_fs.default.readFileSync(_path.default.join(this.env.paths.meteorApp.root, 'package.json'), 'UTF-8'));
if (!('electron' in dependencies) && !('electron' in devDependencies)) {
this.log.error('electron not found in meteor project dependencies');
process.exit(1);
}
version = dependencies.electron || devDependencies.electron;
if (this.electronApp.depsManager.checks.version.regex.test(version)) {
({
version
} = JSON.parse(_fs.default.readFileSync(_path.default.join(this.env.paths.meteorApp.root, 'node_modules', 'electron', 'package.json'), 'UTF-8')));
}
} catch (e) {
this.log.error(`error while trying to read ${_path.default.join(this.env.paths.meteorApp.root, 'package.json')}`, e);
process.exit(1);
}
return version;
}
async init() {
this.desktop.scaffold();
this.meteorApp.updateGitIgnore();
await this.electronApp.init();
}
async buildInstaller(throwError = false) {
this.env.options.installerBuild = true;
await this.electronApp.build();
try {
await this.electronBuilder.build();
} catch (e) {
this.log.error('error occurred while building installer', e);
if (throwError) {
throw new Error(e);
}
}
}
async run() {
await this.electronApp.build(true);
}
async build() {
await this.electronApp.build();
}
justRun() {
this.electron.run();
}
async runPackager() {
this.packager = new _packager.default(this);
await this.packager.init();
await this.electronApp.build();
this.packager.packageApp().catch(e => {
this.log.error(`while trying to build a package an error occurred: ${e}`);
});
}
async getDependency(name, version, declarationCheck = true) {
if (declarationCheck) {
try {
const {
dependencies = {},
devDependencies = {}
} = JSON.parse(_fs.default.readFileSync(_path.default.join(this.env.paths.meteorApp.root, 'package.json'), 'UTF-8'));
if (!(name in dependencies) && !(name in devDependencies)) {
await this.meteorApp.runNpm(['i', '-D', '-E', '--only=dev', `${name}@${version}`], 'inherit');
}
} catch (e) {
this.log.error(`could no read ${_path.default.join(this.env.paths.meteorApp.root, 'package.json')}`, e);
process.exit(1);
}
}
const dependencyPath = _path.default.join(this.env.paths.meteorApp.root, 'node_modules', name);
let dependency = null;
try {
dependency = require(dependencyPath);
} catch (e) {
if (declarationCheck) {
this.log.warn(`could not find ${name}, installing the default version for you: ${name}@${version}`);
try {
await this.meteorApp.runNpm(['i', '-D', '-E', '--only=dev', `${name}@${version}`], 'inherit');
} catch (err) {
this.log.error(err);
process.exit(1);
}
} else {
this.log.warn(`could not find ${name}, exiting`);
process.exit(1);
}
} finally {
if (!dependency) {
dependency = require(dependencyPath);
}
}
const dependencyVersion = require(_path.default.join(dependencyPath, 'package.json')).version;
if (dependencyVersion !== version) {
if (dependencyVersion.split('.')[0] !== version.split('.')[0]) {
this.log.warn(`you are using a ${name}@${dependencyVersion} while the recommended version is ` + `${version}, the compatibility version is different, use at your own risk, be sure to report ` + 'that when submitting issues');
} else {
this.log.warn(`you are using a ${name}@${dependencyVersion} while the recommended version is ` + `${version}, be sure to report that when submitting issues`);
}
}
return {
dependency,
path: dependencyPath
};
}
}
function _exports(input, output, options, {
log = _log.default
} = {
log: _log.default
}) {
return new MeteorDesktop(input, output, options, {
log
});
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcnVudGltZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2ZzIiwiX3BhdGgiLCJfc2hlbGxqcyIsIl9lbnYiLCJfZWxlY3Ryb24iLCJfbG9nIiwiX2Rlc2t0b3AiLCJfZWxlY3Ryb25BcHAiLCJfbWV0ZW9yQXBwIiwiX2VsZWN0cm9uQnVpbGRlciIsIl9wYWNrYWdlciIsIl91dGlscyIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsInNoZWxsIiwiY29uZmlnIiwiZmF0YWwiLCJNZXRlb3JEZXNrdG9wIiwiY29uc3RydWN0b3IiLCJpbnB1dCIsIm91dHB1dCIsIm9wdGlvbnMiLCJkZXBlbmRlbmNpZXMiLCJMb2ciLCJsb2ciLCJ2ZXJzaW9uIiwiZ2V0VmVyc2lvbiIsImluZm8iLCJlbnYiLCJFbnYiLCJlbGVjdHJvbiIsIkVsZWN0cm9uIiwiZWxlY3Ryb25CdWlsZGVyIiwiRWxlY3Ryb25CdWlsZGVyIiwiZWxlY3Ryb25BcHAiLCJFbGVjdHJvbkFwcCIsImRlc2t0b3AiLCJEZXNrdG9wIiwibWV0ZW9yQXBwIiwiTWV0ZW9yQXBwIiwidXRpbHMiLCJKU09OIiwicGFyc2UiLCJmcyIsInJlYWRGaWxlU3luYyIsInBhdGgiLCJqb2luIiwiX19kaXJuYW1lIiwiZXJyb3IiLCJwcm9jZXNzIiwiZXhpdCIsImdldEVsZWN0cm9uVmVyc2lvbiIsImRldkRlcGVuZGVuY2llcyIsInBhdGhzIiwicm9vdCIsImRlcHNNYW5hZ2VyIiwiY2hlY2tzIiwicmVnZXgiLCJ0ZXN0IiwiaW5pdCIsInNjYWZmb2xkIiwidXBkYXRlR2l0SWdub3JlIiwiYnVpbGRJbnN0YWxsZXIiLCJ0aHJvd0Vycm9yIiwiaW5zdGFsbGVyQnVpbGQiLCJidWlsZCIsIkVycm9yIiwicnVuIiwianVzdFJ1biIsInJ1blBhY2thZ2VyIiwicGFja2FnZXIiLCJQYWNrYWdlciIsInBhY2thZ2VBcHAiLCJjYXRjaCIsImdldERlcGVuZGVuY3kiLCJuYW1lIiwiZGVjbGFyYXRpb25DaGVjayIsInJ1bk5wbSIsImRlcGVuZGVuY3lQYXRoIiwiZGVwZW5kZW5jeSIsIndhcm4iLCJlcnIiLCJkZXBlbmRlbmN5VmVyc2lvbiIsInNwbGl0IiwiZXhwb3J0cyIsIkxvZ2dlciJdLCJzb3VyY2VzIjpbIi4uL2xpYi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmltcG9ydCByZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSAncmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBzaGVsbCBmcm9tICdzaGVsbGpzJztcbmltcG9ydCBFbnYgZnJvbSAnLi9lbnYnO1xuaW1wb3J0IEVsZWN0cm9uIGZyb20gJy4vZWxlY3Ryb24nO1xuaW1wb3J0IExvZ2dlciBmcm9tICcuL2xvZyc7XG5pbXBvcnQgRGVza3RvcCBmcm9tICcuL2Rlc2t0b3AnO1xuaW1wb3J0IEVsZWN0cm9uQXBwIGZyb20gJy4vZWxlY3Ryb25BcHAnO1xuaW1wb3J0IE1ldGVvckFwcCBmcm9tICcuL21ldGVvckFwcCc7XG5pbXBvcnQgRWxlY3Ryb25CdWlsZGVyIGZyb20gJy4vZWxlY3Ryb25CdWlsZGVyJztcbmltcG9ydCBQYWNrYWdlciBmcm9tICcuL3BhY2thZ2VyJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuc2hlbGwuY29uZmlnLmZhdGFsID0gdHJ1ZTtcblxuLyoqXG4gKiBNYWluIGVudGl0eS5cbiAqIEBjbGFzc1xuICogQHByb3BlcnR5IHtFbnZ9IGVudlxuICogQHByb3BlcnR5IHtFbGVjdHJvbn0gZWxlY3Ryb25cbiAqIEBwcm9wZXJ0eSB7SW5zdGFsbGVyQnVpbGRlcn0gaW5zdGFsbGVyQnVpbGRlclxuICogQHByb3BlcnR5IHtFbGVjdHJvbkFwcH0gZWxlY3Ryb25BcHBcbiAqIEBwcm9wZXJ0eSB7RGVza3RvcH0gZGVza3RvcFxuICogQHByb3BlcnR5IHtNZXRlb3JBcHB9IG1ldGVvckFwcFxuICovXG5jbGFzcyBNZXRlb3JEZXNrdG9wIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgICAgICAgIC0gTWV0ZW9yIGFwcCBkaXJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3V0cHV0ICAgICAgIC0gb3V0cHV0IGRpciBmb3IgYnVuZGxlL3BhY2thZ2UvaW5zdGFsbGVyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgICAgICAtIG9wdGlvbnMgZnJvbSBjbGkuanNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGVwZW5kZW5jaWVzIC0gZGVwZW5kZW5jaWVzIG9iamVjdFxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGlucHV0LCBvdXRwdXQsIG9wdGlvbnMsIGRlcGVuZGVuY2llcykge1xuICAgICAgICBjb25zdCBMb2cgPSBkZXBlbmRlbmNpZXMubG9nO1xuICAgICAgICB0aGlzLmxvZyA9IG5ldyBMb2coJ2luZGV4Jyk7XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IHRoaXMuZ2V0VmVyc2lvbigpO1xuXG4gICAgICAgIHRoaXMubG9nLmluZm8oJ2luaXRpYWxpemluZycpO1xuXG4gICAgICAgIHRoaXMuZW52ID0gbmV3IEVudihpbnB1dCwgb3V0cHV0LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lbGVjdHJvbiA9IG5ldyBFbGVjdHJvbih0aGlzKTtcbiAgICAgICAgdGhpcy5lbGVjdHJvbkJ1aWxkZXIgPSBuZXcgRWxlY3Ryb25CdWlsZGVyKHRoaXMpO1xuICAgICAgICB0aGlzLmVsZWN0cm9uQXBwID0gbmV3IEVsZWN0cm9uQXBwKHRoaXMpO1xuICAgICAgICB0aGlzLmRlc2t0b3AgPSBuZXcgRGVza3RvcCh0aGlzKTtcbiAgICAgICAgdGhpcy5tZXRlb3JBcHAgPSBuZXcgTWV0ZW9yQXBwKHRoaXMpO1xuICAgICAgICB0aGlzLnV0aWxzID0gdXRpbHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZXMgdG8gcmVhZCB0aGUgdmVyc2lvbiBmcm9tIG91ciBvd24gcGFja2FnZS5qc29uLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRWZXJzaW9uKCkge1xuICAgICAgICBpZiAodGhpcy52ZXJzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHZlcnNpb24gPSBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgKHsgdmVyc2lvbiB9ID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJ3BhY2thZ2UuanNvbicpLCAnVVRGLTgnKVxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGBlcnJvciB3aGlsZSB0cnlpbmcgdG8gcmVhZCAke3BhdGguam9pbihfX2Rpcm5hbWUsICdwYWNrYWdlLmpzb24nKX1gLCBlKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2ZXJzaW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWVzIHRvIHJlYWQgdGhlIHZlcnNpb24gZnJvbSBvdXIgb3duIHBhY2thZ2UuanNvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0RWxlY3Ryb25WZXJzaW9uKCkge1xuICAgICAgICBsZXQgdmVyc2lvbiA9IG51bGw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IGRlcGVuZGVuY2llcyA9IHt9LCBkZXZEZXBlbmRlbmNpZXMgPSB7fSB9ID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMuZW52LnBhdGhzLm1ldGVvckFwcC5yb290LCAncGFja2FnZS5qc29uJyksICdVVEYtOCcpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCEoJ2VsZWN0cm9uJyBpbiBkZXBlbmRlbmNpZXMpICYmICEoJ2VsZWN0cm9uJyBpbiBkZXZEZXBlbmRlbmNpZXMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2VsZWN0cm9uIG5vdCBmb3VuZCBpbiBtZXRlb3IgcHJvamVjdCBkZXBlbmRlbmNpZXMnKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2ZXJzaW9uID0gZGVwZW5kZW5jaWVzLmVsZWN0cm9uIHx8IGRldkRlcGVuZGVuY2llcy5lbGVjdHJvbjtcbiAgICAgICAgICAgIGlmICh0aGlzLmVsZWN0cm9uQXBwLmRlcHNNYW5hZ2VyLmNoZWNrcy52ZXJzaW9uLnJlZ2V4LnRlc3QodmVyc2lvbikpIHtcbiAgICAgICAgICAgICAgICAoeyB2ZXJzaW9uIH0gPSBKU09OLnBhcnNlKFxuICAgICAgICAgICAgICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMuZW52LnBhdGhzLm1ldGVvckFwcC5yb290LCAnbm9kZV9tb2R1bGVzJywgJ2VsZWN0cm9uJywgJ3BhY2thZ2UuanNvbicpLCAnVVRGLTgnKVxuICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIHJlYWQgJHtwYXRoLmpvaW4odGhpcy5lbnYucGF0aHMubWV0ZW9yQXBwLnJvb3QsICdwYWNrYWdlLmpzb24nKX1gLCBlKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmVyc2lvbjtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0KCkge1xuICAgICAgICB0aGlzLmRlc2t0b3Auc2NhZmZvbGQoKTtcbiAgICAgICAgdGhpcy5tZXRlb3JBcHAudXBkYXRlR2l0SWdub3JlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZWxlY3Ryb25BcHAuaW5pdCgpO1xuICAgIH1cblxuICAgIGFzeW5jIGJ1aWxkSW5zdGFsbGVyKHRocm93RXJyb3IgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLmVudi5vcHRpb25zLmluc3RhbGxlckJ1aWxkID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5lbGVjdHJvbkFwcC5idWlsZCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbGVjdHJvbkJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ2Vycm9yIG9jY3VycmVkIHdoaWxlIGJ1aWxkaW5nIGluc3RhbGxlcicsIGUpO1xuICAgICAgICAgICAgaWYgKHRocm93RXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBydW4oKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZWxlY3Ryb25BcHAuYnVpbGQodHJ1ZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgYnVpbGQoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZWxlY3Ryb25BcHAuYnVpbGQoKTtcbiAgICB9XG5cbiAgICBqdXN0UnVuKCkge1xuICAgICAgICB0aGlzLmVsZWN0cm9uLnJ1bigpO1xuICAgIH1cblxuICAgIGFzeW5jIHJ1blBhY2thZ2VyKCkge1xuICAgICAgICB0aGlzLnBhY2thZ2VyID0gbmV3IFBhY2thZ2VyKHRoaXMpO1xuICAgICAgICBhd2FpdCB0aGlzLnBhY2thZ2VyLmluaXQoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5lbGVjdHJvbkFwcC5idWlsZCgpO1xuXG4gICAgICAgIHRoaXMucGFja2FnZXIucGFja2FnZUFwcCgpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgd2hpbGUgdHJ5aW5nIHRvIGJ1aWxkIGEgcGFja2FnZSBhbiBlcnJvciBvY2N1cnJlZDogJHtlfWApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXREZXBlbmRlbmN5KG5hbWUsIHZlcnNpb24sIGRlY2xhcmF0aW9uQ2hlY2sgPSB0cnVlKSB7XG4gICAgICAgIGlmIChkZWNsYXJhdGlvbkNoZWNrKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGVwZW5kZW5jaWVzID0ge30sIGRldkRlcGVuZGVuY2llcyA9IHt9IH0gPSBKU09OLnBhcnNlKFxuICAgICAgICAgICAgICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMuZW52LnBhdGhzLm1ldGVvckFwcC5yb290LCAncGFja2FnZS5qc29uJyksICdVVEYtOCcpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoIShuYW1lIGluIGRlcGVuZGVuY2llcykgJiYgIShuYW1lIGluIGRldkRlcGVuZGVuY2llcykpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5tZXRlb3JBcHAucnVuTnBtKFsnaScsICctRCcsICctRScsICctLW9ubHk9ZGV2JywgYCR7bmFtZX1AJHt2ZXJzaW9ufWBdLCAnaW5oZXJpdCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgY291bGQgbm8gcmVhZCAke3BhdGguam9pbih0aGlzLmVudi5wYXRocy5tZXRlb3JBcHAucm9vdCwgJ3BhY2thZ2UuanNvbicpfWAsIGUpO1xuICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlcGVuZGVuY3lQYXRoID0gcGF0aC5qb2luKHRoaXMuZW52LnBhdGhzLm1ldGVvckFwcC5yb290LCAnbm9kZV9tb2R1bGVzJywgbmFtZSk7XG4gICAgICAgIGxldCBkZXBlbmRlbmN5ID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlcGVuZGVuY3kgPSByZXF1aXJlKGRlcGVuZGVuY3lQYXRoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uQ2hlY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy53YXJuKGBjb3VsZCBub3QgZmluZCAke25hbWV9LCBpbnN0YWxsaW5nIHRoZSBkZWZhdWx0IHZlcnNpb24gZm9yIHlvdTogJHtuYW1lfUAke3ZlcnNpb259YCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5tZXRlb3JBcHAucnVuTnBtKFsnaScsICctRCcsICctRScsICctLW9ubHk9ZGV2JywgYCR7bmFtZX1AJHt2ZXJzaW9ufWBdLCAnaW5oZXJpdCcpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy53YXJuKGBjb3VsZCBub3QgZmluZCAke25hbWV9LCBleGl0aW5nYCk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKCFkZXBlbmRlbmN5KSB7XG4gICAgICAgICAgICAgICAgZGVwZW5kZW5jeSA9IHJlcXVpcmUoZGVwZW5kZW5jeVBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlcGVuZGVuY3lWZXJzaW9uID0gcmVxdWlyZShwYXRoLmpvaW4oZGVwZW5kZW5jeVBhdGgsICdwYWNrYWdlLmpzb24nKSkudmVyc2lvbjtcblxuICAgICAgICBpZiAoZGVwZW5kZW5jeVZlcnNpb24gIT09IHZlcnNpb24pIHtcbiAgICAgICAgICAgIGlmIChkZXBlbmRlbmN5VmVyc2lvbi5zcGxpdCgnLicpWzBdICE9PSB2ZXJzaW9uLnNwbGl0KCcuJylbMF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy53YXJuKGB5b3UgYXJlIHVzaW5nIGEgJHtuYW1lfUAke2RlcGVuZGVuY3lWZXJzaW9ufSB3aGlsZSB0aGUgcmVjb21tZW5kZWQgdmVyc2lvbiBpcyBgICtcbiAgICAgICAgICAgICAgICAgICAgYCR7dmVyc2lvbn0sIHRoZSBjb21wYXRpYmlsaXR5IHZlcnNpb24gaXMgZGlmZmVyZW50LCB1c2UgYXQgeW91ciBvd24gcmlzaywgYmUgc3VyZSB0byByZXBvcnQgYCArXG4gICAgICAgICAgICAgICAgICAgICd0aGF0IHdoZW4gc3VibWl0dGluZyBpc3N1ZXMnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cud2FybihgeW91IGFyZSB1c2luZyBhICR7bmFtZX1AJHtkZXBlbmRlbmN5VmVyc2lvbn0gd2hpbGUgdGhlIHJlY29tbWVuZGVkIHZlcnNpb24gaXMgYCArXG4gICAgICAgICAgICAgICAgICAgIGAke3ZlcnNpb259LCBiZSBzdXJlIHRvIHJlcG9ydCB0aGF0IHdoZW4gc3VibWl0dGluZyBpc3N1ZXNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkZXBlbmRlbmN5LCBwYXRoOiBkZXBlbmRlbmN5UGF0aCB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXhwb3J0cyhpbnB1dCwgb3V0cHV0LCBvcHRpb25zLCB7IGxvZyA9IExvZ2dlciB9ID0geyBsb2c6IExvZ2dlciB9KSB7XG4gICAgcmV0dXJuIG5ldyBNZXRlb3JEZXNrdG9wKGlucHV0LCBvdXRwdXQsIG9wdGlvbnMsIHsgbG9nIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxJQUFBQSxRQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxHQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxLQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxRQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxJQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSyxTQUFBLEdBQUFOLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTSxJQUFBLEdBQUFQLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTyxRQUFBLEdBQUFSLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBUSxZQUFBLEdBQUFULHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBUyxVQUFBLEdBQUFWLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBVSxnQkFBQSxHQUFBWCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVcsU0FBQSxHQUFBWixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVksTUFBQSxHQUFBYixzQkFBQSxDQUFBQyxPQUFBO0FBQTRCLFNBQUFELHVCQUFBYyxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBYjVCOztBQWVBRyxnQkFBSyxDQUFDQyxNQUFNLENBQUNDLEtBQUssR0FBRyxJQUFJOztBQUV6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU1DLGFBQWEsQ0FBQztFQUNoQjtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJQyxXQUFXQSxDQUFDQyxLQUFL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