bpm-engine
Version:
Business Process Management Engine for JavaScript
253 lines (198 loc) • 22.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _assign = require('babel-runtime/core-js/object/assign');
var _assign2 = _interopRequireDefault(_assign);
var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
var _bpmnModdle = require('bpmn-moddle');
var _bpmnModdle2 = _interopRequireDefault(_bpmnModdle);
var _debug = require('./debug');
var _debug2 = _interopRequireDefault(_debug);
var _getFlowObjectType = require('./getFlowObjectType');
var _getFlowObjectType2 = _interopRequireDefault(_getFlowObjectType);
var _Elements = require('./Elements');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const log = (0, _debug2.default)('engine');
const moddle = new _bpmnModdle2.default();
const setParticipants = (flowElements, id, name) => {
flowElements.forEach(flowElement => {
flowElement.participant = {
id,
name
};
if (flowElement.flowElements) {
setParticipants(flowElement.flowElements, id, name);
}
});
};
const setLanes = (flowElements, lane) => {
flowElements.forEach(flowElement => {
if (!flowElement.lanes) {
flowElement.lanes = [{ id: lane.id, name: lane.name }];
} else {
flowElement.lanes.push({ id: lane.id, name: lane.name });
}
if (flowElement.flowElements) {
setLanes(flowElement.flowElements, lane);
}
});
};
const getNexts = flowObject =>
// eslint-disable-next-line
flowObject.next ? [flowObject.next] : flowObject.definition.outgoing ? flowObject.definition.outgoing : [flowObject.definition.targetRef];
const parseParticipantsAndLanes = rootElements => {
// set participant for all flowElements
rootElements.forEach(el => {
if (el.$type === 'bpmn:Collaboration') {
el.get('participants').forEach(({ id, name, processRef }) => {
setParticipants(processRef.flowElements, id, name);
});
}
});
// set lanes for all flowElements
rootElements.forEach(el => {
if (el.$type === 'bpmn:Process') {
el.get('laneSets').forEach(laneSet => {
if (laneSet.lanes) {
laneSet.lanes.forEach(lane => {
setLanes(lane.flowNodeRef, lane);
if (lane.childLaneSet) {
lane.childLaneSet.lanes.forEach(childLane => {
setLanes(childLane.flowNodeRef, childLane);
});
}
});
}
});
}
});
};
class TokenInstance {
constructor({
processId,
tokenId,
payload,
workflowDefinition,
status,
currentActivity,
isSubProcess,
parent,
engine
}) {
var _this = this;
this.initialize = () => new _promise2.default((resolve, reject) => {
moddle.fromXML(this.workflowDefinition, 'bpmn:Definitions', (err, definitions) => {
if (err) {
return reject(err);
}
const rootElements = definitions.get('rootElements');
const rootElement = rootElements.find(rootEl => rootEl.$type === 'bpmn:Process' && rootEl.flowElements.find(flowEl => flowEl.$type === 'bpmn:StartEvent'));
this.flowObjects = rootElement.get('flowElements');
parseParticipantsAndLanes(rootElements);
log('flowObjects parsed');
return resolve();
});
});
this.execute = (0, _asyncToGenerator3.default)(function* () {
if (_this.next) {
_this.lastActivity = _this.next.id;
}
if (!_this.status) {
_this.next = _this.flowObjects.find(function (el) {
return el.$type === 'bpmn:StartEvent';
});
} else if (_this.nexts) {
if (_this.nexts.length === 1) {
var _nexts = (0, _slicedToArray3.default)(_this.nexts, 1);
_this.next = _nexts[0];
} else {
log('TODO');
return _promise2.default.resolve();
}
}
if (!_this.next) {
throw new Error('No next flowObject');
}
const flowObject = _this.createFlowObject(_this.next);
// if thhe current flow object is not a sequenceflow
// - make it ready
// - make it active
if (flowObject.constructor.name !== 'SequenceFlow') {
// if we execute a paused token
// make it move
if (_this.status === 'paused') {
_this.status = 'running';
} else {
// call the makeReady of the current flowObject
yield flowObject.makeReady();
// if the token is still moving (makeReady did not make it pause)
// then call the makeActive of the current flowObject
if (_this.status === 'running') {
yield flowObject.makeActive();
}
}
// if we are in a moving token
// - complete the activity
if (_this.status === 'running') {
yield flowObject.makeComplete();
}
}
// if the token is still moving
// continue execution (automation KEY-concept)
if (_this.status === 'running') {
_this.nexts = getNexts(flowObject);
return _this.execute();
}
return _promise2.default.resolve();
});
this.persistUpdate = () => this.engine.persist.tokenInstance.update({ tokenId: this.tokenId }, { $set: this.toJSON() });
this.persistCreate = () => this.engine.persist.tokenInstance.create(this.toJSON());
this.workflowDefinition = workflowDefinition;
this.engine = engine;
(0, _assign2.default)(this, {
tokenId,
processId,
payload,
parent,
isSubProcess,
currentActivity,
status
});
}
toJSON() {
const result = {};
result.currentActivity = this.next && this.next.id;
result.processId = this.processId;
result.tokenId = this.tokenId;
result.payload = this.payload;
result.parent = this.parent;
result.isSubProcess = this.isSubProcess;
result.status = this.status;
return result;
}
createFlowObject(definition) {
const FlowObjectType = (0, _getFlowObjectType2.default)(definition);
const scopedPlugins = this.engine.plugins;
const plugins = (0, _assign2.default)({}, scopedPlugins.element);
if (FlowObjectType === _Elements.UserTask) {
(0, _assign2.default)(plugins, scopedPlugins.userTask);
}
if (FlowObjectType === _Elements.ServiceTask) {
(0, _assign2.default)(plugins, scopedPlugins.serviceTask);
}
const flowObject = new FlowObjectType({
definition,
plugins,
tokenInstance: this
});
return flowObject;
}
}
exports.default = TokenInstance;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvVG9rZW5JbnN0YW5jZS5qcyJdLCJuYW1lcyI6WyJsb2ciLCJtb2RkbGUiLCJCUE1OTW9kZGxlIiwic2V0UGFydGljaXBhbnRzIiwiZmxvd0VsZW1lbnRzIiwiaWQiLCJuYW1lIiwiZm9yRWFjaCIsImZsb3dFbGVtZW50IiwicGFydGljaXBhbnQiLCJzZXRMYW5lcyIsImxhbmUiLCJsYW5lcyIsInB1c2giLCJnZXROZXh0cyIsImZsb3dPYmplY3QiLCJuZXh0IiwiZGVmaW5pdGlvbiIsIm91dGdvaW5nIiwidGFyZ2V0UmVmIiwicGFyc2VQYXJ0aWNpcGFudHNBbmRMYW5lcyIsInJvb3RFbGVtZW50cyIsImVsIiwiJHR5cGUiLCJnZXQiLCJwcm9jZXNzUmVmIiwibGFuZVNldCIsImZsb3dOb2RlUmVmIiwiY2hpbGRMYW5lU2V0IiwiY2hpbGRMYW5lIiwiVG9rZW5JbnN0YW5jZSIsImNvbnN0cnVjdG9yIiwicHJvY2Vzc0lkIiwidG9rZW5JZCIsInBheWxvYWQiLCJ3b3JrZmxvd0RlZmluaXRpb24iLCJzdGF0dXMiLCJjdXJyZW50QWN0aXZpdHkiLCJpc1N1YlByb2Nlc3MiLCJwYXJlbnQiLCJlbmdpbmUiLCJpbml0aWFsaXplIiwicmVzb2x2ZSIsInJlamVjdCIsImZyb21YTUwiLCJlcnIiLCJkZWZpbml0aW9ucyIsInJvb3RFbGVtZW50IiwiZmluZCIsInJvb3RFbCIsImZsb3dFbCIsImZsb3dPYmplY3RzIiwiZXhlY3V0ZSIsImxhc3RBY3Rpdml0eSIsIm5leHRzIiwibGVuZ3RoIiwiRXJyb3IiLCJjcmVhdGVGbG93T2JqZWN0IiwibWFrZVJlYWR5IiwibWFrZUFjdGl2ZSIsIm1ha2VDb21wbGV0ZSIsInBlcnNpc3RVcGRhdGUiLCJwZXJzaXN0IiwidG9rZW5JbnN0YW5jZSIsInVwZGF0ZSIsIiRzZXQiLCJ0b0pTT04iLCJwZXJzaXN0Q3JlYXRlIiwiY3JlYXRlIiwicmVzdWx0IiwiRmxvd09iamVjdFR5cGUiLCJzY29wZWRQbHVnaW5zIiwicGx1Z2lucyIsImVsZW1lbnQiLCJVc2VyVGFzayIsInVzZXJUYXNrIiwiU2VydmljZVRhc2siLCJzZXJ2aWNlVGFzayJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBRUEsTUFBTUEsTUFBTSxxQkFBTSxRQUFOLENBQVo7O0FBRUEsTUFBTUMsU0FBUyxJQUFJQyxvQkFBSixFQUFmOztBQUVBLE1BQU1DLGtCQUFrQixDQUFDQyxZQUFELEVBQWVDLEVBQWYsRUFBbUJDLElBQW5CLEtBQTRCO0FBQ2xERixlQUFhRyxPQUFiLENBQXNCQyxXQUFELElBQWlCO0FBQ3BDQSxnQkFBWUMsV0FBWixHQUEwQjtBQUN4QkosUUFEd0I7QUFFeEJDO0FBRndCLEtBQTFCOztBQUtBLFFBQUlFLFlBQVlKLFlBQWhCLEVBQThCO0FBQzVCRCxzQkFBZ0JLLFlBQVlKLFlBQTVCLEVBQTBDQyxFQUExQyxFQUE4Q0MsSUFBOUM7QUFDRDtBQUNGLEdBVEQ7QUFVRCxDQVhEOztBQWFBLE1BQU1JLFdBQVcsQ0FBQ04sWUFBRCxFQUFlTyxJQUFmLEtBQXdCO0FBQ3ZDUCxlQUFhRyxPQUFiLENBQXNCQyxXQUFELElBQWlCO0FBQ3BDLFFBQUksQ0FBQ0EsWUFBWUksS0FBakIsRUFBd0I7QUFDdEJKLGtCQUFZSSxLQUFaLEdBQW9CLENBQUMsRUFBRVAsSUFBSU0sS0FBS04sRUFBWCxFQUFlQyxNQUFNSyxLQUFLTCxJQUExQixFQUFELENBQXBCO0FBQ0QsS0FGRCxNQUdLO0FBQ0hFLGtCQUFZSSxLQUFaLENBQWtCQyxJQUFsQixDQUF1QixFQUFFUixJQUFJTSxLQUFLTixFQUFYLEVBQWVDLE1BQU1LLEtBQUtMLElBQTFCLEVBQXZCO0FBQ0Q7O0FBRUQsUUFBSUUsWUFBWUosWUFBaEIsRUFBOEI7QUFDNUJNLGVBQVNGLFlBQVlKLFlBQXJCLEVBQW1DTyxJQUFuQztBQUNEO0FBQ0YsR0FYRDtBQVlELENBYkQ7O0FBZUEsTUFBTUcsV0FBV0M7QUFDZjtB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dkI7QUFDQSxVQUFNc0QsZ0JBQWdCLEtBQUsvQixNQUFMLENBQVlnQyxPQUFsQzs7QUFFQSxVQUFNQSxVQUFVLHNCQUFjLEVBQWQsRUFBa0JELGNBQWNFLE9BQWhDLENBQWhCOztBQUVBLFFBQUlILG1CQUFtQkksa0JBQXZCLEVBQWlDO0FBQy9CLDRCQUFjRixPQUFkLEVBQXVCRCxjQUFjSSxRQUFyQztBQUNEO0FBQ0QsUUFBSUwsbUJBQW1CTSxxQkFBdkIsRUFBb0M7QUFDbEMsNEJBQWNKLE9BQWQsRUFBdUJELGNBQWNNLFdBQXJDO0FBQ0Q7O0FBRUQsVUFBTTlELGFBQWEsSUFBSXVELGNBQUosQ0FBbUI7QUFDcENyRCxnQkFEb0M7QUFFcEN1RCxhQUZvQztBQUdwQ1QscUJBQWU7QUFIcUIsS0FBbkIsQ0FBbkI7O0FBTUEsV0FBT2hELFVBQVA7QUFDRDs7QUFsRmdDO2tCQUFkZSxhIiwiZmlsZSI6IlRva2VuSW5zdGFuY2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQlBNTk1vZGRsZSBmcm9tICdicG1uLW1vZGRsZSc7XG5pbXBvcnQgZGVidWcgZnJvbSAnbGliL2RlYnVnJztcbmltcG9ydCBnZXRGbG93T2JqZWN0VHlwZSBmcm9tICdsaWIvZ2V0Rmxvd09iamVjdFR5cGUnO1xuaW1wb3J0IHsgVXNlclRhc2ssIFNlcnZpY2VUYXNrIH0gZnJvbSAnbGliL0VsZW1lbnRzJztcblxuY29uc3QgbG9nID0gZGVidWcoJ2VuZ2luZScpO1xuXG5jb25zdCBtb2RkbGUgPSBuZXcgQlBNTk1vZGRsZSgpO1xuXG5jb25zdCBzZXRQYXJ0aWNpcGFudHMgPSAoZmxvd0VsZW1lbnRzLCBpZCwgbmFtZSkgPT4ge1xuICBmbG93RWxlbWVudHMuZm9yRWFjaCgoZmxvd0VsZW1lbnQpID0+IHtcbiAgICBmbG93RWxlbWVudC5wYXJ0aWNpcGFudCA9IHtcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICB9O1xuXG4gICAgaWYgKGZsb3dFbGVtZW50LmZsb3dFbGVtZW50cykge1xuICAgICAgc2V0UGFydGljaXBhbnRzKGZsb3dFbGVtZW50LmZsb3dFbGVtZW50cywgaWQsIG5hbWUpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5jb25zdCBzZXRMYW5lcyA9IChmbG93RWxlbWVudHMsIGxhbmUpID0+IHtcbiAgZmxvd0VsZW1lbnRzLmZvckVhY2goKGZsb3dFbGVtZW50KSA9PiB7XG4gICAgaWYgKCFmbG93RWxlbWVudC5sYW5lcykge1xuICAgICAgZmxvd0VsZW1lbnQubGFuZXMgPSBbeyBpZDogbGFuZS5pZCwgbmFtZTogbGFuZS5uYW1lIH1dO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGZsb3dFbGVtZW50LmxhbmVzLnB1c2goeyBpZDogbGFuZS5pZCwgbmFtZTogbGFuZS5uYW1lIH0pO1xuICAgIH1cblxuICAgIGlmIChmbG93RWxlbWVudC5mbG93RWxlbWVudHMpIHtcbiAgICAgIHNldExhbmVzKGZsb3dFbGVtZW50LmZsb3dFbGVtZW50cywgbGFuZSk7XG4gICAgfVxuICB9KTtcbn07XG5cbmNvbnN0IGdldE5leHRzID0gZmxvd09iamVjdCA9PlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgKGZsb3dPYmplY3QubmV4dFxuICAgID8gW2Zsb3dPYmplY3QubmV4dF1cbiAgICA6IGZsb3dPYmplY3QuZGVmaW5pdGlvbi5vdXRnb2luZ1xuICAgICAgPyBmbG93T2JqZWN0LmRlZmluaXRpb24ub3V0Z29pbmdcbiAgICAgIDogW2Zsb3dPYmplY3QuZGVmaW5pdGlvbi50YXJnZXRSZWZdKTtcblxuY29uc3QgcGFyc2VQYXJ0aWNpcGFudHNBbmRMYW5lcyA9IChyb290RWxlbWVudHMpID0+IHtcbiAgLy8gc2V0IHBhcnRpY2lwYW50IGZvciBhbGwgZmxvd0VsZW1lbnRzXG4gIHJvb3RFbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGlmIChlbC4kdHlwZSA9PT0gJ2JwbW46Q29sbGFib3JhdGlvbicpIHtcbiAgICAgIGVsLmdldCgncGFydGljaXBhbnRzJykuZm9yRWFjaCgoeyBpZCwgbmFtZSwgcHJvY2Vzc1JlZiB9KSA9PiB7XG4gICAgICAgIHNldFBhcnRpY2lwYW50cyhwcm9jZXNzUmVmLmZsb3dFbGVtZW50cywgaWQsIG5hbWUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBzZXQgbGFuZXMgZm9yIGFsbCBmbG93RWxlbWVudHNcbiAgcm9vdEVsZW1lbnRzLmZvckVhY2goKGVsKSA9PiB7XG4gICAgaWYgKGVsLiR0eXBlID09PSAnYnBtbjpQcm9jZXNzJykge1xuICAgICAgZWwuZ2V0KCdsYW5lU2V0cycpLmZvckVhY2goKGxhbmVTZXQpID0+IHtcbiAgICAgICAgaWYgKGxhbmVTZXQubGFuZXMpIHtcbiAgICAgICAgICBsYW5lU2V0LmxhbmVzLmZvckVhY2goKGxhbmUpID0+IHtcbiAgICAgICAgICAgIHNldExhbmVzKGxhbmUuZmxvd05vZGVSZWYsIGxhbmUpO1xuICAgICAgICAgICAgaWYgKGxhbmUuY2hpbGRMYW5lU2V0KSB7XG4gICAgICAgICAgICAgIGxhbmUuY2hpbGRMYW5lU2V0LmxhbmVzLmZvckVhY2goKGNoaWxkTGFuZSkgPT4ge1xuICAgICAgICAgICAgICAgIHNldExhbmVzKGNoaWxkTGFuZS5mbG93Tm9kZVJlZiwgY2hpbGRMYW5lKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUb2tlbkluc3RhbmNlIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIHByb2Nlc3NJZCxcbiAgICB0b2tlbklkLFxuICAgIHBheWxvYWQsXG4gICAgd29ya2Zsb3dEZWZpbml0aW9uLFxuICAgIHN0YXR1cyxcbiAgICBjdXJyZW50QWN0aXZpdHksXG4gICAgaXNTdWJQcm9jZXNzLFxuICAgIHBhcmVudCxcbiAgICBlbmdpbmUsXG4gIH0pIHtcbiAgICB0aGlzLndvcmtmbG93RGVmaW5pdGlvbiA9IHdvcmtmbG93RGVmaW5pdGlvbjtcbiAgICB0aGlzLmVuZ2luZSA9IGVuZ2luZTtcblxuICAgIE9iamVjdC5hc3NpZ24odGhpcywge1xuICAgICAgdG9rZW5JZCxcbiAgICAgIHByb2Nlc3NJZCxcbiAgICAgIHBheWxvYWQsXG4gICAgICBwYXJlbnQsXG4gICAgICBpc1N1YlByb2Nlc3MsXG4gICAgICBjdXJyZW50QWN0aXZpdHksXG4gICAgICBzdGF0dXMsXG4gICAgfSk7XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgcmVzdWx0LmN1cnJlbnRBY3Rpdml0eSA9IHRoaXMubmV4dCAmJiB0aGlzLm5leHQuaWQ7XG4gICAgcmVzdWx0LnByb2Nlc3NJZCA9IHRoaXMucHJvY2Vzc0lkO1xuICAgIHJlc3VsdC50b2tlbklkID0gdGhpcy50b2tlbklkO1xuICAgIHJlc3VsdC5wYXlsb2FkID0gdGhpcy5wYXlsb2FkO1xuICAgIHJlc3VsdC5wYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICByZXN1bHQuaXNTdWJQcm9jZXNzID0gdGhpcy5pc1N1YlByb2Nlc3M7XG4gICAgcmVzdWx0LnN0YXR1cyA9IHRoaXMuc3RhdHVzO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGluaXRpYWxpemUgPSAoKSA9PlxuICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIG1vZGRsZS5mcm9tWE1MKHRoaXMud29ya2Zsb3dEZWZpbml0aW9uLCAnYnBtbjpEZWZpbml0aW9ucycsIChlcnIsIGRlZmluaXRpb25zKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb290RWxlbWVudHMgPSBkZWZpbml0aW9ucy5nZXQoJ3Jvb3RFbGVtZW50cycpO1xuXG4gICAgICAgIGNvbnN0IHJvb3RFbGVtZW50ID0gcm9vdEVsZW1lbnRzLmZpbmQocm9vdEVsID0+XG4gICAgICAgICAgcm9vdEVsLiR0eXBlID09PSAnYnBtbjpQcm9jZXNzJyAmJlxuICAgICAgICAgICAgcm9vdEVsLmZsb3dFbGVtZW50cy5maW5kKGZsb3dFbCA9PiBmbG93RWwuJHR5cGUgPT09ICdicG1uOlN0YXJ0RXZlbnQnKSk7XG5cbiAgICAgICAgdGhpcy5mbG93T2JqZWN0cyA9IHJvb3RFbGVtZW50LmdldCgnZmxvd0VsZW1lbnRzJyk7XG5cbiAgICAgICAgcGFyc2VQYXJ0aWNpcGFudHNBbmRMYW5lcyhyb290RWxlbWVudHMpO1xuXG4gICAgICAgIGxvZygnZmxvd09iamVjdHMgcGFyc2VkJyk7XG5cbiAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gIGNyZWF0ZUZsb3dPYmplY3QoZGVmaW5pdGlvbikge1xuICAgIGNvbnN0IEZsb3dPYmplY3RUeXBlID0gZ2V0Rmxvd09iamVjdFR5cGUoZGVmaW5pdGlvbik7XG4gICAgY29uc3Qgc2NvcGVkUGx1Z2lucyA9IHRoaXMuZW5naW5lLnBsdWdpbnM7XG5cbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmFzc2lnbih7fSwgc2NvcGVkUGx1Z2lucy5lbGVtZW50KTtcblxuICAgIGlmIChGbG93T2JqZWN0VHlwZSA9PT0gVXNlclRhc2spIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocGx1Z2lucywgc2NvcGVkUGx1Z2lucy51c2VyVGFzayk7XG4gICAgfVxuICAgIGlmIChGbG93T2JqZWN0VHlwZSA9PT0gU2VydmljZVRhc2spIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocGx1Z2lucywgc2NvcGVkUGx1Z2lucy5zZXJ2aWNlVGFzayk7XG4gICAgfVxuXG4gICAgY29uc3QgZmxvd09iamVjdCA9IG5ldyBGbG93T2JqZWN0VHlwZSh7XG4gICAgICBkZWZpbml0aW9uLFxuICAgICAgcGx1Z2lucyxcbiAgICAgIHRva2VuSW5zdGFuY2U6IHRoaXMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmxvd09iamVjdDtcbiAgfVxuXG4gIGV4ZWN1dGUgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKHRoaXMubmV4dCkge1xuICAgICAgdGhpcy5sYXN0QWN0aXZpdHkgPSB0aGlzLm5leHQuaWQ7XG4gICAgfVxuICAgIGlmICghdGhpcy5zdGF0dXMpIHtcbiAgICAgIHRoaXMubmV4dCA9IHRoaXMuZmxvd09iamVjdHMuZmluZChlbCA9PiBlbC4kdHlwZSA9PT0gJ2JwbW46U3RhcnRFdmVudCcpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLm5leHRzKSB7XG4gICAgICBpZiAodGhpcy5uZXh0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgW3RoaXMubmV4dF0gPSB0aGlzLm5leHRzO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGxvZygnVE9ETycpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm5leHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gbmV4dCBmbG93T2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmxvd09iamVjdCA9IHRoaXMuY3JlYXRlRmxvd09iamVjdCh0aGlzLm5leHQpO1xuXG4gICAgLy8gaWYgdGhoZSBjdXJyZW50IGZsb3cgb2JqZWN0IGlzIG5vdCBhIHNlcXVlbmNlZmxvd1xuICAgIC8vIC0gbWFrZSBpdCByZWFkeVxuICAgIC8vIC0gbWFrZSBpdCBhY3RpdmVcbiAgICBpZiAoZmxvd09iamVjdC5jb25zdHJ1Y3Rvci5uYW1lICE9PSAnU2VxdWVuY2VGbG93Jykge1xuICAgICAgLy8gaWYgd2UgZXhlY3V0ZSBhIHBhdXNlZCB0b2tlblxuICAgICAgLy8gbWFrZSBpdCBtb3ZlXG4gICAgICBpZiAodGhpcy5zdGF0dXMgPT09ICdwYXVzZWQnKSB7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gJ3J1bm5pbmcnO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIGNhbGwgdGhlIG1ha2VSZWFkeSBvZiB0aGUgY3VycmVudCBmbG93T2JqZWN0XG4gICAgICAgIGF3YWl0IGZsb3dPYmplY3QubWFrZVJlYWR5KCk7XG5cbiAgICAgICAgLy8gaWYgdGhlIHRva2VuIGlzIHN0aWxsIG1vdmluZyAobWFrZVJlYWR5IGRpZCBub3QgbWFrZSBpdCBwYXVzZSlcbiAgICAgICAgLy8gdGhlbiBjYWxsIHRoZSBtYWtlQWN0aXZlIG9mIHRoZSBjdXJyZW50IGZsb3dPYmplY3RcbiAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAncnVubmluZycpIHtcbiAgICAgICAgICBhd2FpdCBmbG93T2JqZWN0Lm1ha2VBY3RpdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBpZiB3ZSBhcmUgaW4gYSBtb3ZpbmcgdG9rZW5cbiAgICAgIC8vIC0gY29tcGxldGUgdGhlIGFjdGl2aXR5XG4gICAgICBpZiAodGhpcy5zdGF0dXMgPT09ICdydW5uaW5nJykge1xuICAgICAgICBhd2FpdCBmbG93T2JqZWN0Lm1ha2VDb21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIHRoZSB0b2tlbiBpcyBzdGlsbCBtb3ZpbmdcbiAgICAvLyBjb250aW51ZSBleGVjdXRpb24gKGF1dG9tYXRpb24gS0VZLWNvbmNlcHQpXG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSAncnVubmluZycpIHtcbiAgICAgIHRoaXMubmV4dHMgPSBnZXROZXh0cyhmbG93T2JqZWN0KTtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH07XG5cbiAgcGVyc2lzdFVwZGF0ZSA9ICgpID0+XG4gICAgdGhpcy5lbmdpbmUucGVyc2lzdC50b2tlbkluc3RhbmNlLnVwZGF0ZSh7IHRva2VuSWQ6IHRoaXMudG9rZW5JZCB9LCB7ICRzZXQ6IHRoaXMudG9KU09OKCkgfSk7XG5cbiAgcGVyc2lzdENyZWF0ZSA9ICgpID0+IHRoaXMuZW5naW5lLnBlcnNpc3QudG9rZW5JbnN0YW5jZS5jcmVhdGUodGhpcy50b0pTT04oKSk7XG59XG4iXX0=