eslint-plugin-css-modules
Version:
Checks that you are using the existent css/scss/less classes, no more no less
149 lines (143 loc) • 23.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getStyleImportNodeData = exports.getStyleClasses = exports.getPropertyName = exports.getFilePath = exports.getExportPropsMap = exports.getClassesMap = exports.getAST = exports.fileExists = void 0;
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
var _fp = _interopRequireDefault(require("lodash/fp"));
var _lodash = _interopRequireDefault(require("lodash"));
var _gonzalesPe = _interopRequireDefault(require("gonzales-pe"));
var _traversalUtils = require("./traversalUtils");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
var styleExtensionRegex = /\.(s?css|less)$/;
function dashesCamelCase(str) {
return str.replace(/-+(\w)/g, function (match, firstLetter) {
return firstLetter.toUpperCase();
});
}
var getFilePath = exports.getFilePath = function getFilePath(context, styleFilePath) {
var settings = context.settings['css-modules'];
var dirName = _path["default"].dirname(context.getFilename());
var basePath = settings && settings.basePath ? settings.basePath : '';
return styleFilePath.startsWith('.') ? _path["default"].resolve(dirName, styleFilePath) : _path["default"].resolve(basePath, styleFilePath);
};
var getPropertyName = exports.getPropertyName = function getPropertyName(node) {
var propertyName = node.computed
/*
square braces eg s['header']
we won't use node.property.name because it is for cases like
s[abc] where abc is a variable
*/ ? node.property.value
/* dot notation, eg s.header */ : node.property.name;
/*
skip property names starting with _
eg. special functions provided
by css modules like _getCss()
Tried to just skip function calls, but the parser
thinks of normal property access like s._getCss and
function calls like s._getCss() as same.
*/
if (!propertyName || _lodash["default"].startsWith(propertyName, '_')) {
return null;
}
return propertyName;
};
var getClassesMap = exports.getClassesMap = function getClassesMap(classes, camelCase) {
var classesMap = {};
// Unroll the loop because of performance!
// Remember that this function will run on every lint (e.g.: on file save)
switch (camelCase) {
case true:
_lodash["default"].forIn(classes, function (value, className) {
classesMap[className] = className;
classesMap[_lodash["default"].camelCase(className)] = className;
});
break;
case 'dashes':
_lodash["default"].forIn(classes, function (value, className) {
classesMap[className] = className;
classesMap[dashesCamelCase(className)] = className;
});
break;
case 'only':
_lodash["default"].forIn(classes, function (value, className) {
classesMap[_lodash["default"].camelCase(className)] = className;
});
break;
case 'dashes-only':
_lodash["default"].forIn(classes, function (value, className) {
classesMap[dashesCamelCase(className)] = className;
});
break;
default:
_lodash["default"].forIn(classes, function (value, className) {
classesMap[className] = className;
});
}
return classesMap;
};
var getStyleImportNodeData = exports.getStyleImportNodeData = function getStyleImportNodeData(node) {
// path from which it was imported
var styleFilePath = _fp["default"].get('source.value')(node);
if (styleFilePath && styleExtensionRegex.test(styleFilePath)) {
var importNode = _fp["default"].compose(_fp["default"].find({
type: 'ImportDefaultSpecifier'
}), _fp["default"].get('specifiers'))(node);
// the default imported name
var importName = _fp["default"].get('local.name')(importNode);
if (importName) {
// it had a default import
return {
importName: importName,
styleFilePath: styleFilePath,
importNode: importNode
};
}
}
};
var fileExists = exports.fileExists = function fileExists(filePath) {
try {
// check if file exists
_fs["default"].statSync(filePath);
return true;
} catch (e) {
return false;
}
};
/**
* @returns AST of the parsed file or null if parse failed
*/
var getAST = exports.getAST = function getAST(filePath) {
var fileContent = _fs["default"].readFileSync(filePath);
var syntax = _path["default"].extname(filePath).slice(1); // remove leading .
try {
return _gonzalesPe["default"].parse(fileContent.toString(), {
syntax: syntax
});
} catch (e) {
return null;
}
};
var getStyleClasses = exports.getStyleClasses = function getStyleClasses(ast) {
/*
mutates ast by removing :global scopes
*/
(0, _traversalUtils.eliminateGlobals)(ast);
var classesMap = (0, _traversalUtils.getRegularClassesMap)(ast);
var composedClassesMap = (0, _traversalUtils.getComposesClassesMap)(ast);
var extendClassesMap = (0, _traversalUtils.getExtendClassesMap)(ast);
var parentSelectorClassesMap = (0, _traversalUtils.getParentSelectorClassesMap)(ast);
return _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, classesMap), composedClassesMap), extendClassesMap), parentSelectorClassesMap);
};
var getExportPropsMap = exports.getExportPropsMap = function getExportPropsMap(ast) {
var exportPropsMap = (0, _traversalUtils.getICSSExportPropsMap)(ast);
return _objectSpread({}, exportPropsMap);
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZnMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9wYXRoIiwiX2ZwIiwiX2xvZGFzaCIsIl9nb256YWxlc1BlIiwiX3RyYXZlcnNhbFV0aWxzIiwib2JqIiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJvIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJjb25zdHJ1Y3RvciIsInByb3RvdHlwZSIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImtleSIsInZhbHVlIiwiX3RvUHJvcGVydHlLZXkiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImFyZyIsIl90b1ByaW1pdGl2ZSIsIlN0cmluZyIsImlucHV0IiwiaGludCIsInByaW0iLCJ0b1ByaW1pdGl2ZSIsInVuZGVmaW5lZCIsInJlcyIsImNhbGwiLCJUeXBlRXJyb3IiLCJOdW1iZXIiLCJzdHlsZUV4dGVuc2lvblJlZ2V4IiwiZGFzaGVzQ2FtZWxDYXNlIiwic3RyIiwicmVwbGFjZSIsIm1hdGNoIiwiZmlyc3RMZXR0ZXIiLCJ0b1VwcGVyQ2FzZSIsImdldEZpbGVQYXRoIiwiZXhwb3J0cyIsImNvbnRleHQiLCJzdHlsZUZpbGVQYXRoIiwic2V0dGluZ3MiLCJkaXJOYW1lIiwicGF0aCIsImRpcm5hbWUiLCJnZXRGaWxlbmFtZSIsImJhc2VQYXRoIiwic3RhcnRzV2l0aCIsInJlc29sdmUiLCJnZXRQcm9wZXJ0eU5hbWUiLCJub2RlIiwicHJvcGVydHlOYW1lIiwiY29tcHV0ZWQiLCJwcm9wZXJ0eSIsIm5hbWUiLCJfIiwiZ2V0Q2xhc3Nlc01hcCIsImNsYXNzZXMiLCJjYW1lbENhc2UiLCJjbGFzc2VzTWFwIiwiZm9ySW4iLCJjbGFzc05hbWUiLCJnZXRTdHlsZUltcG9ydE5vZGVEYXRhIiwiZnAiLCJnZXQiLCJ0ZXN0IiwiaW1wb3J0Tm9kZSIsImNvbXBvc2UiLCJmaW5kIiwidHlwZSIsImltcG9ydE5hbWUiLCJmaWxlRXhpc3RzIiwiZmlsZVBhdGgiLCJmcyIsInN0YXRTeW5jIiwiZ2V0QVNUIiwiZmlsZUNvbnRlbnQiLCJyZWFkRmlsZVN5bmMiLCJzeW50YXgiLCJleHRuYW1lIiwic2xpY2UiLCJnb256YWxlcyIsInBhcnNlIiwidG9TdHJpbmciLCJnZXRTdHlsZUNsYXNzZXMiLCJhc3QiLCJlbGltaW5hdGVHbG9iYWxzIiwiZ2V0UmVndWxhckNsYXNzZXNNYXAiLCJjb21wb3NlZENsYXNzZXNNYXAiLCJnZXRDb21wb3Nlc0NsYXNzZXNNYXAiLCJleHRlbmRDbGFzc2VzTWFwIiwiZ2V0RXh0ZW5kQ2xhc3Nlc01hcCIsInBhcmVudFNlbGVjdG9yQ2xhc3Nlc01hcCIsImdldFBhcmVudFNlbGVjdG9yQ2xhc3Nlc01hcCIsImdldEV4cG9ydFByb3BzTWFwIiwiZXhwb3J0UHJvcHNNYXAiLCJnZXRJQ1NTRXhwb3J0UHJvcHNNYXAiXSwic291cmNlcyI6WyIuLi8uLi9saWIvY29yZS9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAZmxvd1xuXG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnAgZnJvbSAnbG9kYXNoL2ZwJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgZ29uemFsZXMgZnJvbSAnZ29uemFsZXMtcGUnO1xuXG5pbXBvcnQgdHlwZSB7IEpzTm9kZSwgZ0FTVE5vZGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7XG4gIGdldFJlZ3VsYXJDbGFzc2VzTWFwLFxuICBnZXRDb21wb3Nlc0NsYXNzZXNNYXAsXG4gIGdldEV4dGVuZENsYXNzZXNNYXAsXG4gIGdldFBhcmVudFNlbGVjdG9yQ2xhc3Nlc01hcCxcbiAgZ2V0SUNTU0V4cG9ydFByb3BzTWFwLFxuICBlbGltaW5hdGVHbG9iYWxzLFxufSBmcm9tICcuL3RyYXZlcnNhbFV0aWxzJztcblxuY29uc3Qgc3R5bGVFeHRlbnNpb25SZWdleCA9IC9cXC4ocz9jc3N8bGVzcykkLztcblxuZnVuY3Rpb24gZGFzaGVzQ2FtZWxDYXNlIChzdHI6IHN0cmluZykge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoLy0rKFxcdykvZywgZnVuY3Rpb24gKG1hdGNoLCBmaXJzdExldHRlcikge1xuICAgIHJldHVybiBmaXJzdExldHRlci50b1VwcGVyQ2FzZSgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEZpbGVQYXRoID0gKGNvbnRleHQsIHN0eWxlRmlsZVBhdGgpID0+IHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBjb250ZXh0LnNldHRpbmdzWydjc3MtbW9kdWxlcyddO1xuXG4gIGNvbnN0IGRpck5hbWUgPSBwYXRoLmRpcm5hbWUoY29udGV4dC5nZXRGaWxlbmFtZSgpKTtcbiAgY29uc3QgYmFzZVBhdGggPSAoc2V0dGluZ3MgJiYgc2V0dGluZ3MuYmFzZVBhdGgpID8gc2V0dGluZ3MuYmFzZVBhdGggOiAnJztcblxuICByZXR1cm4gc3R5bGVGaWxlUGF0aC5zdGFydHNXaXRoKCcuJylcbiAgICA/IHBhdGgucmVzb2x2ZShkaXJOYW1lLCBzdHlsZUZpbGVQYXRoKVxuICAgIDogcGF0aC5yZXNvbHZlKGJhc2VQYXRoLCBzdHlsZUZpbGVQYXRoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQcm9wZXJ0eU5hbWUgPSAobm9kZTogSnNOb2RlKTogP3N0cmluZyA9PiB7XG4gIGNvbnN0IHByb3BlcnR5TmFtZSA9IG5vZGUuY29tcHV0ZWRcbiAgICAvKlxuICAgICAgIHNxdWFyZSBicmFjZXMgZWcgc1snaGVhZGVyJ11cbiAgICAgICB3ZSB3b24ndCB1c2Ugbm9kZS5wcm9wZXJ0eS5uYW1lIGJlY2F1c2UgaXQgaXMgZm9yIGNhc2VzIGxpa2VcbiAgICAgICBzW2FiY10gd2hlcmUgYWJjIGlzIGEgdmFyaWFibGVcbiAgICAgKi9cbiAgICA/IG5vZGUucHJvcGVydHkudmFsdWVcbiAgICAvKiBkb3Qgbm90YXRpb24sIGVnIHMuaGVhZGVyICovXG4gICAgOiBub2RlLnByb3BlcnR5Lm5hbWU7XG5cbiAgLypcbiAgICAgc2tpcCBwcm9wZXJ0eSBuYW1lcyBzdGFydGluZyB3aXRoIF9cbiAgICAgZWcuIHNwZWNpYWwgZnVuY3Rpb25zIHByb3ZpZGVkXG4gICAgIGJ5IGNzcyBtb2R1bGVzIGxpa2UgX2dldENzcygpXG5cbiAgICAgVHJpZWQgdG8ganVzdCBza2lwIGZ1bmN0aW9uIGNhbGxzLCBidXQgdGhlIHBhcnNlclxuICAgICB0aGlua3Mgb2Ygbm9ybWFsIHByb3BlcnR5IGFjY2VzcyBsaWtlIHMuX2dldENzcyBhbmRcbiAgICAgZnVuY3Rpb24gY2FsbHMgbGlrZSBzLl9nZXRDc3MoKSBhcyBzYW1lLlxuICAgKi9cbiAgaWYgKCFwcm9wZXJ0eU5hbWUgfHwgXy5zdGFydHNXaXRoKHByb3BlcnR5TmFtZSwgJ18nKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHByb3BlcnR5TmFtZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDbGFzc2VzTWFwID0gKGNsYXNzZXM6IE9iamVjdCwgY2FtZWxDYXNlOiBzdHJpbmd8Ym9vbGVhbik6IE9iamVjdCA9PiB7XG4gIGNvbnN0IGNsYXNzZXNNYXAgPSB7fTtcblxuICAvLyBVbnJvbGwgdGhlIGxvb3AgYmVjYXVzZSBvZiBwZXJmb3JtYW5jZSFcbiAgLy8gUmVtZW1iZXIgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgcnVuIG9uIGV2ZXJ5IGxpbnQgKGUuZy46IG9uIGZpbGUgc2F2ZSlcbiAgc3dpdGNoIChjYW1lbENhc2UpIHtcbiAgICBjYXNlIHRydWU6XG4gICAgICBfLmZvckluKGNsYXNzZXMsICh2YWx1ZSwgY2xhc3NOYW1lKSA9PiB7XG4gICAgICAgIGNsYXNzZXNNYXBbY2xhc3NOYW1lXSA9IGNsYXNzTmFtZTtcbiAgICAgICAgY2xhc3Nlc01hcFtfLmNhbWVsQ2FzZShjbGFzc05hbWUpXSA9IGNsYXNzTmFtZTtcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZGFzaGVzJzpcbiAgICAgIF8uZm9ySW4oY2xhc3NlcywgKHZhbHVlLCBjbGFzc05hbWUpID0+IHtcbiAgICAgICAgY2xhc3Nlc01hcFtjbGFzc05hbWVdID0gY2xhc3NOYW1lO1xuICAgICAgICBjbGFzc2VzTWFwW2Rhc2hlc0NhbWVsQ2FzZShjbGFzc05hbWUpXSA9IGNsYXNzTmFtZTtcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnb25seSc6XG4gICAgICBfLmZvckluKGNsYXNzZXMsICh2YWx1ZSwgY2xhc3NOYW1lKSA9PiB7XG4gICAgICAgIGNsYXNzZXNNYXBbXy5jYW1lbENhc2UoY2xhc3NOYW1lKV0gPSBjbGFzc05hbWU7XG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Rhc2hlcy1vbmx5JzpcbiAgICAgIF8uZm9ySW4oY2xhc3NlcywgKHZhbHVlLCBjbGFzc05hbWUpID0+IHtcbiAgICAgICAgY2xhc3Nlc01hcFtkYXNoZXNDYW1lbENhc2UoY2xhc3NOYW1lKV0gPSBjbGFzc05hbWU7XG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBfLmZvckluKGNsYXNzZXMsICh2YWx1ZSwgY2xhc3NOYW1lKSA9PiB7XG4gICAgICAgIGNsYXNzZXNNYXBbY2xhc3NOYW1lXSA9IGNsYXNzTmFtZTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGNsYXNzZXNNYXA7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U3R5bGVJbXBvcnROb2RlRGF0YSA9IChub2RlOiBKc05vZGUpOiA/T2JqZWN0ID0+IHtcbiAgLy8gcGF0aCBmcm9tIHdoaWNoIGl0IHdhcyBpbXBvcnRlZFxuICBjb25zdCBzdHlsZUZpbGVQYXRoID0gZnAuZ2V0KCdzb3VyY2UudmFsdWUnKShub2RlKTtcblxuICBpZiAoc3R5bGVGaWxlUGF0aCAmJiBzdHlsZUV4dGVuc2lvblJlZ2V4LnRlc3Qoc3R5bGVGaWxlUGF0aCkpIHtcbiAgICBjb25zdCBpbXBvcnROb2RlID0gZnAuY29tcG9zZShcbiAgICAgIGZwLmZpbmQoeyB0eXBlOiAnSW1wb3J0RGVmYXVsdFNwZWNpZmllcicgfSksXG4gICAgICBmcC5nZXQoJ3NwZWNpZmllcnMnKSxcbiAgICApKG5vZGUpO1xuXG4gICAgLy8gdGhlIGRlZmF1bHQgaW1wb3J0ZWQgbmFtZVxuICAgIGNvbnN0IGltcG9ydE5hbWUgPSBmcC5nZXQoJ2xvY2FsLm5hbWUnKShpbXBvcnROb2RlKTtcblxuICAgIGlmIChpbXBvcnROYW1lKSB7IC8vIGl0IGhhZCBhIGRlZmF1bHQgaW1wb3J0XG4gICAgICByZXR1cm4geyBpbXBvcnROYW1lLCBzdHlsZUZpbGVQYXRoLCBpbXBvcnROb2RlIH07XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZmlsZUV4aXN0cyA9IChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIHRyeSB7XG4gICAgLy8gY2hlY2sgaWYgZmlsZSBleGlzdHNcbiAgICBmcy5zdGF0U3luYyhmaWxlUGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbi8qKlxuICogQHJldHVybnMgQVNUIG9mIHRoZSBwYXJzZWQgZmlsZSBvciBudWxsIGlmIHBhcnNlIGZhaWxlZFxuICovXG5leHBvcnQgY29uc3QgZ2V0QVNUID0gKGZpbGVQYXRoOiBzdHJpbmcpOiBnQVNUTm9kZSB8IG51bGwgPT4ge1xuICBjb25zdCBmaWxlQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCk7XG5cbiAgY29uc3Qgc3ludGF4ID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS5zbGljZSgxKTsgLy8gcmVtb3ZlIGxlYWRpbmcgLlxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGdvbnphbGVzLnBhcnNlKGZpbGVDb250ZW50LnRvU3RyaW5nKCksIHsgc3ludGF4IH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTdHlsZUNsYXNzZXMgPSAoYXN0OiBnQVNUTm9kZSk6ID9PYmplY3QgPT4ge1xuICAvKlxuICAgICBtdXRhdGVzIGFzdCBieSByZW1vdmluZyA6Z2xvYmFsIHNjb3Blc1xuICAgKi9cbiAgZWxpbWluYXRlR2xvYmFscyhhc3QpO1xuXG4gIGNvbnN0IGNsYXNzZXNNYXAgPSBnZXRSZWd1bGFyQ2xhc3Nlc01hcChhc3QpO1xuICBjb25zdCBjb21wb3NlZENsYXNzZXNNYXAgPSBnZXRDb21wb3Nlc0NsYXNzZXNNYXAoYXN0KTtcbiAgY29uc3QgZXh0ZW5kQ2xhc3Nlc01hcCA9IGdldEV4dGVuZENsYXNzZXNNYXAoYXN0KTtcbiAgY29uc3QgcGFyZW50U2VsZWN0b3JDbGFzc2VzTWFwID0gZ2V0UGFyZW50U2VsZWN0b3JDbGFzc2VzTWFwKGFzdCk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5jbGFzc2VzTWFwLFxuICAgIC4uLmNvbXBvc2VkQ2xhc3Nlc01hcCxcbiAgICAuLi5leHRlbmRDbGFzc2VzTWFwLFxuICAgIC4uLnBhcmVudFNlbGVjdG9yQ2xhc3Nlc01hcFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEV4cG9ydFByb3BzTWFwID0gKGFzdDogZ0FTVE5vZGUpOiA/T2JqZWN0ID0+IHtcbiAgY29uc3QgZXhwb3J0UHJvcHNNYXAgPSBnZXRJQ1NTRXhwb3J0UHJvcHNNYXAoYXN0KTtcbiAgcmV0dXJuIHtcbiAgICAuLi5leHBvcnRQcm9wc01hcFxuICB9O1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsSUFBQUEsR0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFB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