babel-plugin-debug-macros
Version:
Debug macros and feature flag stripping
196 lines • 21.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
class Builder {
constructor(t, util, options) {
this.t = t;
this.module = options.module;
this.global = options.global;
this.assertPredicateIndex = options.assertPredicateIndex;
this.isDebug = options.isDebug;
this.util = util;
}
/**
* Expands:
*
* assert($PREDICATE, $MESSAGE)
*
* into
*
* ($DEBUG && console.assert($PREDICATE, $MESSAGE));
*
* or
*
* ($DEBUG && assert($PREDICATE, $MESSAGE));
*
* or
*
* ($DEBUG && $GLOBAL_NS.assert($PREDICATE, $MESSAGE));
*/
assert(path) {
let predicate;
const index = this.assertPredicateIndex;
if (index !== undefined) {
predicate = (expression, args) => {
return args[index];
};
}
this._createMacroExpression(path, {
predicate,
});
}
/**
* Expands:
*
* warn($MESSAGE)
*
* into
*
* ($DEBUG && console.warn($MESSAGE));
*
* or
*
* ($DEBUG && warn($MESSAGE));
*
* or
*
* ($DEBUG && $GLOBAL_NS.warn($MESSAGE));
*/
warn(path) {
this._createMacroExpression(path);
}
/**
* Expands:
*
* log($MESSAGE)
*
* into
*
* ($DEBUG && console.log($MESSAGE));
*
* or
*
* ($DEBUG && log($MESSAGE));
*
* or
*
* ($DEBUG && $GLOBAL_NS.log($MESSAGE));
*/
log(path) {
this._createMacroExpression(path);
}
_createMacroExpression(path, options = {}) {
let t = this.t;
let expression = path.node.expression;
let callee = expression.callee;
let args = expression.arguments;
if (options.validate) {
options.validate(expression, args);
}
let callExpression;
if (this.module) {
callExpression = expression;
}
else if (this.global) {
callExpression = this._createGlobalExternalHelper(callee, args, this.global);
}
else if (options.buildConsoleAPI) {
callExpression = options.buildConsoleAPI(expression, args);
}
else {
callExpression = this._createConsoleAPI(options.consoleAPI || callee, args);
}
let prefixedIdentifiers = [];
if (options.predicate) {
let predicate = options.predicate(expression, args) || t.identifier('false');
if (!this.t.isExpression(predicate)) {
throw new Error(`bug: this doesn't support ${predicate.type}`);
}
let negatedPredicate = t.unaryExpression('!', t.parenthesizedExpression(predicate));
prefixedIdentifiers.push(negatedPredicate);
}
// Expand the macro!
let replacementPath = this._buildLogicalExpressions(prefixedIdentifiers, callExpression, this._debugExpression(path));
path.replaceWith(replacementPath);
path.scope.crawl();
}
/**
* Expands:
*
* deprecate($MESSAGE, $PREDICATE)
*
* or
*
* deprecate($MESSAGE, $PREDICATE, {
* $ID,
* $URL,
* $UNIL
* });
*
* into
*
* ($DEBUG && $PREDICATE && console.warn($MESSAGE));
*
* or
*
* ($DEBUG && $PREDICATE && deprecate($MESSAGE, $PREDICATE, { $ID, $URL, $UNTIL }));
*
* or
*
* ($DEBUG && $PREDICATE && $GLOBAL_NS.deprecate($MESSAGE, $PREDICATE, { $ID, $URL, $UNTIL }));
*/
deprecate(path) {
this._createMacroExpression(path, {
predicate: (expression, args) => args[1],
buildConsoleAPI: (expression, args) => {
let message = args[0];
return this._createConsoleAPI(this.t.identifier('warn'), [message]);
},
validate: (expression, args) => {
let meta = args[2];
if (meta &&
this.t.isObjectExpression(meta) &&
meta.properties &&
!meta.properties.some((prop) => this.t.isObjectProperty(prop) &&
((this.t.isIdentifier(prop.key) && prop.key.name === 'id') ||
(this.t.isStringLiteral(prop.key) && prop.key.value === 'id')))) {
throw new ReferenceError(`deprecate's meta information requires an "id" field.`);
}
},
});
}
_debugExpression(target) {
if (typeof this.isDebug === 'boolean') {
return this.t.booleanLiteral(this.isDebug);
}
else {
return this.t.callExpression(this.util.import(target, '@embroider/macros', 'isDevelopingApp'), []);
}
}
_createGlobalExternalHelper(identifier, args, ns) {
let t = this.t;
return t.callExpression(t.memberExpression(t.identifier(ns), identifier), args);
}
_createConsoleAPI(identifier, args) {
let t = this.t;
return t.callExpression(t.memberExpression(t.identifier('console'), identifier), args);
}
_buildLogicalExpressions(identifiers, callExpression, debugIdentifier) {
let t = this.t;
identifiers.unshift(debugIdentifier);
identifiers.push(callExpression);
let logicalExpressions;
for (let i = 0; i < identifiers.length; i++) {
let left = identifiers[i];
let right = identifiers[i + 1];
if (!logicalExpressions) {
logicalExpressions = t.logicalExpression('&&', left, right);
}
else if (right) {
logicalExpressions = t.logicalExpression('&&', logicalExpressions, right);
}
}
return t.parenthesizedExpression(logicalExpressions);
}
}
exports.default = Builder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBeUJBLE1BQXFCLE9BQU87SUFPMUIsWUFDVyxDQUFxQixFQUM5QixJQUFnQixFQUNoQixPQUFnQjtRQUZQLE1BQUMsR0FBRCxDQUFDLENBQW9CO1FBSTlCLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDN0IsSUFBSSxDQUFDLG9CQUFvQixHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQztRQUN6RCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDL0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0gsTUFBTSxDQUFDLElBQXVCO1FBQzVCLElBQUksU0FBMkMsQ0FBQztRQUNoRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDeEMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsU0FBUyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxFQUFFO2dCQUMvQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQixDQUFDLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRTtZQUNoQyxTQUFTO1NBQ1YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0gsSUFBSSxDQUFDLElBQXVCO1FBQzFCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7T0FnQkc7SUFDSCxH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a0IsRUFBRSxDQUFDO2dCQUN4QixrQkFBa0IsR0FBRyxDQUFDLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM5RCxDQUFDO2lCQUFNLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ2pCLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDNUUsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxrQkFBbUIsQ0FBQyxDQUFDO0lBQ3hELENBQUM7Q0FDRjtBQXpPRCwwQkF5T0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSAqIGFzIEJhYmVsIGZyb20gJ0BiYWJlbC9jb3JlJztcbmltcG9ydCB0eXBlIHsgTm9kZVBhdGgsIHR5cGVzIGFzIHQgfSBmcm9tICdAYmFiZWwvY29yZSc7XG5pbXBvcnQgeyBDYWxsSWRlbnRpZmllckV4cHJlc3Npb24sIENhbGxTdGF0ZW1lbnRQYXRoIH0gZnJvbSAnLi9iYWJlbC10eXBlLWhlbHBlcnMnO1xuaW1wb3J0IHsgSW1wb3J0VXRpbCB9IGZyb20gJ2JhYmVsLWltcG9ydC11dGlsJztcblxuZXhwb3J0IGludGVyZmFjZSBPcHRpb25zIHtcbiAgbW9kdWxlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBnbG9iYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgYXNzZXJ0UHJlZGljYXRlSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgaXNEZWJ1ZzogYm9vbGVhbiB8IFwiQGVtYnJvaWRlci9tYWNyb3NcIjtcbn1cblxuaW50ZXJmYWNlIE1hY3JvRXhwcmVzc2lvbk9wdHMge1xuICB2YWxpZGF0ZT86IChleHByZXNzaW9uOiBDYWxsSWRlbnRpZmllckV4cHJlc3Npb24sIGFyZ3M6IHQuQ2FsbEV4cHJlc3Npb25bJ2FyZ3VtZW50cyddKSA9PiB2b2lkO1xuICBidWlsZENvbnNvbGVBUEk/OiAoXG4gICAgZXhwcmVzc2lvbjogQ2FsbElkZW50aWZpZXJFeHByZXNzaW9uLFxuICAgIGFyZ3M6IHQuQ2FsbEV4cHJlc3Npb25bJ2FyZ3VtZW50cyddXG4gICkgPT4gdC5DYWxsRXhwcmVzc2lvbjtcbiAgY29uc29sZUFQST86IHQuSWRlbnRpZmllcjtcbiAgcHJlZGljYXRlPzogKFxuICAgIGV4cHJlc3Npb246IENhbGxJZGVudGlmaWVyRXhwcmVzc2lvbixcbiAgICBhcmdzOiB0LkNhbGxFeHByZXNzaW9uWydhcmd1bWVudHMnXVxuICApID0+IHQuQ2FsbEV4cHJlc3Npb25bJ2FyZ3VtZW50cyddW251bWJlcl0gfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJ1aWxkZXIge1xuICBwcml2YXRlIG1vZHVsZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBnbG9iYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBhc3NlcnRQcmVkaWNhdGVJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGlzRGVidWc6IGJvb2xlYW4gfCAnQGVtYnJvaWRlci9tYWNyb3MnO1xuICBwcml2YXRlIHV0aWw6IEltcG9ydFV0aWw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgdDogdHlwZW9mIEJhYmVsLnR5cGVzLFxuICAgIHV0aWw6IEltcG9ydFV0aWwsXG4gICAgb3B0aW9uczogT3B0aW9uc1xuICApIHtcbiAgICB0aGlzLm1vZHVsZSA9IG9wdGlvbnMubW9kdWxlO1xuICAgIHRoaXMuZ2xvYmFsID0gb3B0aW9ucy5nbG9iYWw7XG4gICAgdGhpcy5hc3NlcnRQcmVkaWNhdGVJbmRleCA9IG9wdGlvbnMuYXNzZXJ0UHJlZGljYXRlSW5kZXg7XG4gICAgdGhpcy5pc0RlYnVnID0gb3B0aW9ucy5pc0RlYnVnO1xuICAgIHRoaXMudXRpbCA9IHV0aWw7XG4gIH1cblxuICAvKipcbiAgICogRXhwYW5kczpcbiAgICpcbiAgICogYXNzZXJ0KCRQUkVESUNBVEUsICRNRVNTQUdFKVxuICAgKlxuICAgKiBpbnRvXG4gICAqXG4gICAqICgkREVCVUcgJiYgY29uc29sZS5hc3NlcnQoJFBSRURJQ0FURSwgJE1FU1NBR0UpKTtcbiAgICpcbiAgICogb3JcbiAgICpcbiAgICogKCRERUJVRyAmJiBhc3NlcnQoJFBSRURJQ0FURSwgJE1FU1NBR0UpKTtcbiAgICpcbiAgICogb3JcbiAgICpcbiAgICogKCRERUJVRyAmJiAkR0xPQkFMX05TLmFzc2VydCgkUFJFRElDQVRFLCAkTUVTU0FHRSkpO1xuICAgKi9cbiAgYXNzZXJ0KHBhdGg6IENhbGxTdGF0ZW1lbnRQYXRoKSB7XG4gICAgbGV0IHByZWRpY2F0ZTogTWFjcm9FeHByZXNzaW9uT3B0c1sncHJlZGljYXRlJ107XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmFzc2VydFByZWRpY2F0ZUluZGV4O1xuICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcmVkaWNhdGUgPSAoZXhwcmVzc2lvbiwgYXJncykgPT4ge1xuICAgICAgICByZXR1cm4gYXJnc1tpbmRleF07XG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuX2NyZWF0ZU1hY3JvRXhwcmVzc2lvbihwYXRoLCB7XG4gICAgICBwcmVkaWNhdGUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXhwYW5kczpcbiAgICpcbiAgICogd2FybigkTUVTU0FHRSlcbiAgICpcbiAgICogaW50b1xuICAgKlxuICAgKiAoJERFQlVHICYmIGNvbnNvbGUud2FybigkTUVTU0FHRSkpO1xuICAgKlxuICAgKiBvclxuICAgKlxuICAgKiAoJERFQlVHICYmIHdhcm4oJE1FU1NBR0UpKTtcbiAgICpcbiAgICogb3JcbiAgICpcbiAgICogKCRERUJVRyAmJiAkR0xPQkFMX05TLndhcm4oJE1FU1NBR0UpKTtcbiAgICovXG4gIHdhcm4ocGF0aDogQ2FsbFN0YXRlbWVudFBhdGgpIHtcbiAgICB0aGlzLl9jcmVhdGVNYWNyb0V4cHJlc3Npb24ocGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogRXhwYW5kczpcbiAgICpcbiAgICogbG9nKCRNRVNTQUdFKVxuICAgKlxuICAgKiBpbnRvXG4gICAqXG4gICAqICgkREVCVUcgJiYgY29uc29sZS5sb2coJE1FU1NBR0UpKTtcbiAgICpcbiAgICogb3JcbiAgICpcbiAgICogKCRERUJVRyAmJiBsb2coJE1FU1NBR0UpKTtcbiAgICpcbiAgICogb3JcbiAgICpcbiAgICogKCRERUJVRyAmJiAkR0xPQkFMX05TLmxvZygkTUVTU0FHRSkpO1xuICAgKi9cbiAgbG9nKHBhdGg6IENhbGxTdGF0ZW1lbnRQYXRoKSB7XG4gICAgdGhpcy5fY3JlYXRlTWFjcm9FeHByZXNzaW9uKHBhdGgpO1xuICB9XG5cbiAgX2NyZWF0ZU1hY3JvRXhwcmVzc2lvbihwYXRoOiBDYWxsU3RhdGVtZW50UGF0aCwgb3B0aW9uczogTWFjcm9FeHByZXNzaW9uT3B0cyA9IHt9KSB7XG4gICAgbGV0IHQgPSB0aGlzLnQ7XG4gICAgbGV0IGV4cHJlc3Npb24gPSBwYXRoLm5vZGUuZXhwcmVzc2lvbjtcbiAgICBsZXQgY2FsbGVlID0gZXhwcmVzc2lvbi5jYWxsZWU7XG4gICAgbGV0IGFyZ3MgPSBleHByZXNzaW9uLmFyZ3VtZW50cztcblxuICAgIGlmIChvcHRpb25zLnZhbGlkYXRlKSB7XG4gICAgICBvcHRpb25zLnZhbGlkYXRlKGV4cHJlc3Npb24sIGFyZ3MpO1xuICAgIH1cblxuICAgIGxldCBjYWxsRXhwcmVzc2lvbjtcbiAgICBpZiAodGhpcy5tb2R1bGUpIHtcbiAgICAgIGNhbGxFeHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ2xvYmFsKSB7XG4gICAgICBjYWxsRXhwcmVzc2lvbiA9IHRoaXMuX2NyZWF0ZUdsb2JhbEV4dGVybmFsSGVscGVyKGNhbGxlZSwgYXJncywgdGhpcy5nbG9iYWwpO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5idWlsZENvbnNvbGVBUEkpIHtcbiAgICAgIGNhbGxFeHByZXNzaW9uID0gb3B0aW9ucy5idWlsZENvbnNvbGVBUEkoZXhwcmVzc2lvbiwgYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxFeHByZXNzaW9uID0gdGhpcy5fY3JlYXRlQ29uc29sZUFQSShvcHRpb25zLmNvbnNvbGVBUEkgfHwgY2FsbGVlLCBhcmdzKTtcbiAgICB9XG5cbiAgICBsZXQgcHJlZml4ZWRJZGVudGlmaWVyczogdC5FeHByZXNzaW9uW10gPSBbXTtcblxuICAgIGlmIChvcHRpb25zLnByZWRpY2F0ZSkge1xuICAgICAgbGV0IHByZWRpY2F0ZSA9IG9wdGlvbnMucHJlZGljYXRlKGV4cHJlc3Npb24sIGFyZ3MpIHx8IHQuaWRlbnRpZmllcignZmFsc2UnKTtcbiAgICAgIGlmICghdGhpcy50LmlzRXhwcmVzc2lvbihwcmVkaWNhdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgYnVnOiB0aGlzIGRvZXNuJ3Qgc3VwcG9ydCAke3ByZWRpY2F0ZS50eXBlfWApO1xuICAgICAgfVxuICAgICAgbGV0IG5lZ2F0ZWRQcmVkaWNhdGUgPSB0LnVuYXJ5RXhwcmVzc2lvbignIScsIHQucGFyZW50aGVzaXplZEV4cHJlc3Npb24ocHJlZGljYXRlKSk7XG4gICAgICBwcmVmaXhlZElkZW50aWZpZXJzLnB1c2gobmVnYXRlZFByZWRpY2F0ZSk7XG4gICAgfVxuXG4gICAgLy8gRXhwYW5kIHRoZSBtYWNybyFcbiAgICBsZXQgcmVwbGFjZW1lbnRQYXRoID0gdGhpcy5fYnVpbGRMb2dpY2FsRXhwcmVzc2lvbnMocHJlZml4ZWRJZGVudGlmaWVycywgY2FsbEV4cHJlc3Npb24sIHRoaXMuX2RlYnVnRXhwcmVzc2lvbihwYXRoKSk7XG4gICAgcGF0aC5yZXBsYWNlV2l0aChyZXBsYWNlbWVudFBhdGgpO1xuICAgIHBhdGguc2NvcGUuY3Jhd2woKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmRzOlxuICAgKlxuICAgKiBkZXByZWNhdGUoJE1FU1NBR0UsICRQUkVESUNBVEUpXG4gICAqXG4gICAqIG9yXG4gICAqXG4gICAqIGRlcHJlY2F0ZSgkTUVTU0FHRSwgJFBSRURJQ0FURSwge1xuICAgKiAgJElELFxuICAgKiAgJFVSTCxcbiAgICogICRVTklMXG4gICAqIH0pO1xuICAgKlxuICAgKiBpbnRvXG4gICAqXG4gICAqICgkREVCVUcgJiYgJFBSRURJQ0FURSAmJiBjb25zb2xlLndhcm4oJE1FU1NBR0UpKTtcbiAgICpcbiAgICogb3JcbiAgICpcbiAgICogKCRERUJVRyAmJiAkUFJFRElDQVRFICYmIGRlcHJlY2F0ZSgkTUVTU0FHRSwgJFBSRURJQ0FURSwgeyAkSUQsICRVUkwsICRVTlRJTCB9KSk7XG4gICAqXG4gICAqIG9yXG4gICAqXG4gICAqICgkREVCVUcgJiYgJFBSRURJQ0FURSAmJiAkR0xPQkFMX05TLmRlcHJlY2F0ZSgkTUVTU0FHRSwgJFBSRURJQ0FURSwgeyAkSUQsICRVUkwsICRVTlRJTCB9KSk7XG4gICAqL1xuICBkZXByZWNhdGUocGF0aDogQ2FsbFN0YXRlbWVudFBhdGgpIHtcbiAgICB0aGlzLl9jcmVhdGVNYWNyb0V4cHJlc3Npb24ocGF0aCwge1xuICAgICAgcHJlZGljYXRlOiAoZXhwcmVzc2lvbiwgYXJncykgPT4gYXJnc1sxXSxcblxuICAgICAgYnVpbGRDb25zb2xlQVBJOiAoZXhwcmVzc2lvbiwgYXJncykgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IGFyZ3NbMF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUNvbnNvbGVBUEkodGhpcy50LmlkZW50aWZpZXIoJ3dhcm4nKSwgW21lc3NhZ2VdKTtcbiAgICAgIH0sXG5cbiAgICAgIHZhbGlkYXRlOiAoZXhwcmVzc2lvbiwgYXJncykgPT4ge1xuICAgICAgICBsZXQgbWV0YSA9IGFyZ3NbMl07XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1ldGEgJiZcbiAgICAgICAgICB0aGlzLnQuaXNPYmplY3RFeHByZXNzaW9uKG1ldGEpICYmXG4gICAgICAgICAgbWV0YS5wcm9wZXJ0aWVzICYmXG4gICAgICAgICAgIW1ldGEucHJvcGVydGllcy5zb21lKFxuICAgICAgICAgICAgKHByb3ApID0+XG4gICAgICAgICAgICAgIHRoaXMudC5pc09iamVjdFByb3BlcnR5KHByb3ApICYmXG4gICAgICAgICAgICAgICgodGhpcy50LmlzSWRlbnRpZmllcihwcm9wLmtleSkgJiYgcHJvcC5rZXkubmFtZSA9PT0gJ2lkJykgfHxcbiAgICAgICAgICAgICAgICAodGhpcy50LmlzU3RyaW5nTGl0ZXJhbChwcm9wLmtleSkgJiYgcHJvcC5rZXkudmFsdWUgPT09ICdpZCcpKVxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKGBkZXByZWNhdGUncyBtZXRhIGluZm9ybWF0aW9uIHJlcXVpcmVzIGFuIFwiaWRcIiBmaWVsZC5gKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIF9kZWJ1Z0V4cHJlc3Npb24odGFyZ2V0OiBOb2RlUGF0aCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5pc0RlYnVnID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiB0aGlzLnQuYm9vbGVhbkxpdGVyYWwodGhpcy5pc0RlYnVnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudC5jYWxsRXhwcmVzc2lvbihcbiAgICAgICAgdGhpcy51dGlsLmltcG9ydCh0YXJnZXQsICdAZW1icm9pZGVyL21hY3JvcycsICdpc0RldmVsb3BpbmdBcHAnKSxcbiAgICAgICAgW11cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgX2NyZWF0ZUdsb2JhbEV4dGVybmFsSGVscGVyKFxuICAgIGlkZW50aWZpZXI6IHQuSWRlbnRpZmllcixcbiAgICBhcmdzOiB0LkNhbGxFeHByZXNzaW9uWydhcmd1bWVudHMnXSxcbiAgICBuczogc3RyaW5nXG4gICkge1xuICAgIGxldCB0ID0gdGhpcy50O1xuICAgIHJldHVybiB0LmNhbGxFeHByZXNzaW9uKHQubWVtYmVyRXhwcmVzc2lvbih0LmlkZW50aWZpZXIobnMpLCBpZGVudGlmaWVyKSwgYXJncyk7XG4gIH1cblxuICBfY3JlYXRlQ29uc29sZUFQSShpZGVudGlmaWVyOiB0LklkZW50aWZpZXIsIGFyZ3M6IHQuQ2FsbEV4cHJlc3Npb25bJ2FyZ3VtZW50cyddKSB7XG4gICAgbGV0IHQgPSB0aGlzLnQ7XG4gICAgcmV0dXJuIHQuY2FsbEV4cHJlc3Npb24odC5tZW1iZXJFeHByZXNzaW9uKHQuaWRlbnRpZmllcignY29uc29sZScpLCBpZGVudGlmaWVyKSwgYXJncyk7XG4gIH1cblxuICBfYnVpbGRMb2dpY2FsRXhwcmVzc2lvbnMoXG4gICAgaWRlbnRpZmllcnM6IHQuRXhwcmVzc2lvbltdLFxuICAgIGNhbGxFeHByZXNzaW9uOiB0LkV4cHJlc3Npb24sXG4gICAgZGVidWdJZGVudGlmaWVyOiB0LkV4cHJlc3Npb25cbiAgKTogdC5FeHByZXNzaW9uIHtcbiAgICBsZXQgdCA9IHRoaXMudDtcblxuICAgIGlkZW50aWZpZXJzLnVuc2hpZnQoZGVidWdJZGVudGlmaWVyKTtcbiAgICBpZGVudGlmaWVycy5wdXNoKGNhbGxFeHByZXNzaW9uKTtcbiAgICBsZXQgbG9naWNhbEV4cHJlc3Npb25zO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGxlZnQgPSBpZGVudGlmaWVyc1tpXTtcbiAgICAgIGxldCByaWdodCA9IGlkZW50aWZpZXJzW2kgKyAxXTtcbiAgICAgIGlmICghbG9naWNhbEV4cHJlc3Npb25zKSB7XG4gICAgICAgIGxvZ2ljYWxFeHByZXNzaW9ucyA9IHQubG9naWNhbEV4cHJlc3Npb24oJyYmJywgbGVmdCwgcmlnaHQpO1xuICAgICAgfSBlbHNlIGlmIChyaWdodCkge1xuICAgICAgICBsb2dpY2FsRXhwcmVzc2lvbnMgPSB0LmxvZ2ljYWxFeHByZXNzaW9uKCcmJicsIGxvZ2ljYWxFeHByZXNzaW9ucywgcmlnaHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0LnBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKGxvZ2ljYWxFeHByZXNzaW9ucyEpO1xuICB9XG59XG4iXX0=