@future-grid/fgp-graph
Version:
fgp-graph is a chart lib based on Dygraphs
274 lines (217 loc) • 33.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var Series = function Series(parentElement, viewConfig, g, onChangeListener) {
var _this = this;
_classCallCheck(this, Series);
this.parentElement = parentElement;
this.viewConfig = viewConfig;
this.g = g;
_defineProperty(this, "checkBoxDiv", void 0);
_defineProperty(this, "chosenCollection", void 0);
_defineProperty(this, "currentGraphData", void 0);
_defineProperty(this, "labels", void 0);
_defineProperty(this, "isInit", true);
_defineProperty(this, "options", void 0);
_defineProperty(this, "initDom", function () {
var dropdownContainer = document.createElement('div');
dropdownContainer.setAttribute("class", "fgp-series-dropdown");
var multiSelectDiv = document.createElement("div");
multiSelectDiv.setAttribute("class", "graph-series-multi-select"); //------------ select -----------------//
var selectBoxDiv = document.createElement("div");
selectBoxDiv.setAttribute("class", "select-box");
var expanded = false;
selectBoxDiv.addEventListener("click", function (e) {
// show content
if (!expanded && _this.checkBoxDiv) {
_this.checkBoxDiv.style.display = "block";
expanded = true;
} else if (expanded && _this.checkBoxDiv) {
_this.checkBoxDiv.style.display = "none";
expanded = false;
}
}); // create select and put it into div
var select = document.createElement("select");
var placeholder = document.createElement("option");
placeholder.text = "series";
select.add(placeholder);
selectBoxDiv.appendChild(select); // over select
var overSelect = document.createElement("div");
overSelect.setAttribute("class", "over-select");
selectBoxDiv.append(overSelect);
multiSelectDiv.appendChild(selectBoxDiv); //------------ options -----------------//
var checkboxDiv = _this.checkBoxDiv = document.createElement("div");
checkboxDiv.setAttribute("class", "graph-series-checkboxes");
multiSelectDiv.append(checkboxDiv);
dropdownContainer.appendChild(multiSelectDiv);
_this.parentElement.appendChild(dropdownContainer);
});
_defineProperty(this, "selectNDeselect", function (series, checked, all) {
var _this$g, _this$g2;
var visibility = (_this$g = _this.g) === null || _this$g === void 0 ? void 0 : _this$g.getOption('visibility');
var labels = (_this$g2 = _this.g) === null || _this$g2 === void 0 ? void 0 : _this$g2.getLabels();
if (all) {
//
if ("all" === series) {
all.checked = true; // select all
if (visibility && labels) {
var _this$g3;
//
labels.forEach(function (label, index) {
if (label != "x") {
visibility[index - 1] = true;
var options = _this.options;
options[index - 1].checked = true;
}
}); // update graph
(_this$g3 = _this.g) === null || _this$g3 === void 0 ? void 0 : _this$g3.updateOptions({
visibility: visibility
});
}
} else {
// no deselect all
if (visibility && labels) {
var _this$g4;
var fullChecked = true; //
labels.forEach(function (label, index) {
if (label == series) {
visibility[index - 1] = checked;
}
});
visibility.map(function (v) {
if (!v) {
fullChecked = false;
}
});
all.checked = fullChecked; // update graph
(_this$g4 = _this.g) === null || _this$g4 === void 0 ? void 0 : _this$g4.updateOptions({
visibility: visibility
});
}
}
} else {
if (visibility && labels) {
var _this$g5;
//
labels.forEach(function (label, index) {
if (label == series) {
visibility[index - 1] = checked;
}
}); // update graph
(_this$g5 = _this.g) === null || _this$g5 === void 0 ? void 0 : _this$g5.updateOptions({
visibility: visibility
});
}
}
});
_defineProperty(this, "createOptions", function (viewConfig, parentElement) {
_this.options = []; // device view or scatter view ?
if (viewConfig.graphConfig.entities.length > 1 && parentElement) {
parentElement.innerHTML = ''; // add select all
var option = document.createElement("label");
var allCheckbox = document.createElement("input");
allCheckbox.type = 'checkbox';
allCheckbox.checked = true;
allCheckbox.addEventListener('click', function () {
_this.selectNDeselect("all", allCheckbox.checked, allCheckbox);
});
option.append(allCheckbox);
option.append("All");
parentElement.append(option); // scatter view
viewConfig.graphConfig.entities.forEach(function (_child) {
if (!_child.fragment) {
var _this$labels;
var _option = document.createElement("label");
var checkbox = document.createElement("input");
checkbox.type = 'checkbox'; // find out if data column all null or NaN
var hasData = false;
(_this$labels = _this.labels) === null || _this$labels === void 0 ? void 0 : _this$labels.forEach(function (label, index) {
if (label === _child.name) {
var _this$currentGraphDat;
// 2. check data
(_this$currentGraphDat = _this.currentGraphData) === null || _this$currentGraphDat === void 0 ? void 0 : _this$currentGraphDat.forEach(function (_data) {
//
if (_data[index + 1] !== null && !isNaN(_data[index + 1])) {
hasData = true;
}
});
}
});
checkbox.checked = hasData;
if (!hasData) {
_option.style.pointerEvents = "none";
} else {
checkbox.addEventListener('click', function () {
_this.selectNDeselect(_child.name, checkbox.checked, allCheckbox);
});
}
_option.append(checkbox);
_option.append("".concat(_child.name));
_this.options.push(checkbox);
parentElement.append(_option);
}
});
} else if (viewConfig.graphConfig.entities.length === 1 && parentElement) {
// device view
parentElement.innerHTML = '';
if (_this.chosenCollection) {
//
_this.chosenCollection.series.forEach(function (_series) {
var _this$labels2;
var option = document.createElement("label");
console.log("".concat(_series.visibility));
var checkbox = document.createElement("input");
checkbox.type = 'checkbox'; // find out if data column all null or NaN
var hasData = false;
(_this$labels2 = _this.labels) === null || _this$labels2 === void 0 ? void 0 : _this$labels2.forEach(function (label, index) {
if (label === _series.label) {
var _this$currentGraphDat2;
// 2. check data
(_this$currentGraphDat2 = _this.currentGraphData) === null || _this$currentGraphDat2 === void 0 ? void 0 : _this$currentGraphDat2.forEach(function (_data) {
//
if (_data[index + 1] !== null && !isNaN(_data[index + 1])) {
hasData = true;
}
});
}
});
checkbox.checked = !(_series.visibility !== undefined && !_series.visibility);
if (checkbox.checked && !hasData) {
checkbox.checked = hasData;
}
if (!hasData) {
option.style.pointerEvents = "none";
} else {
checkbox.addEventListener('click', function () {
_this.selectNDeselect(_series.label, checkbox.checked, undefined);
});
}
option.append(checkbox);
option.append("".concat(_series.label));
_this.options.push(checkbox);
parentElement.append(option);
});
}
}
});
_defineProperty(this, "setData", function (data, labels, collection) {
_this.chosenCollection = collection;
_this.currentGraphData = data;
_this.labels = labels; // update options ups to labels and data
_this.createOptions(_this.viewConfig, _this.checkBoxDiv);
});
_defineProperty(this, "updateOption", function (checked, index) {
console.log("".concat(checked, " ").concat(index, " ").concat(_this.options[index]));
if (_this.options[index]) {
_this.options[index].checked = checked;
}
});
this.initDom();
this.options = [];
};
exports["default"] = Series;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9leHRyYXMvdG9vbGJhci93aWRnZXRzL1Nlcmllcy50cyJdLCJuYW1lcyI6WyJTZXJpZXMiLCJwYXJlbnRFbGVtZW50Iiwidmlld0NvbmZpZyIsImciLCJvbkNoYW5nZUxpc3RlbmVyIiwiZHJvcGRvd25Db250YWluZXIiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJzZXRBdHRyaWJ1dGUiLCJtdWx0aVNlbGVjdERpdiIsInNlbGVjdEJveERpdiIsImV4cGFuZGVkIiwiYWRkRXZlbnRMaXN0ZW5lciIsImUiLCJjaGVja0JveERpdiIsInN0eWxlIiwiZGlzcGxheSIsInNlbGVjdCIsInBsYWNlaG9sZGVyIiwidGV4dCIsImFkZCIsImFwcGVuZENoaWxkIiwib3ZlclNlbGVjdCIsImFwcGVuZCIsImNoZWNrYm94RGl2Iiwic2VyaWVzIiwiY2hlY2tlZCIsImFsbCIsInZpc2liaWxpdHkiLCJnZXRPcHRpb24iLCJsYWJlbHMiLCJnZXRMYWJlbHMiLCJmb3JFYWNoIiwibGFiZWwiLCJpbmRleCIsIm9wdGlvbnMiLCJ1cGRhdGVPcHRpb25zIiwiZnVsbENoZWNrZWQiLCJtYXAiLCJ2IiwiZ3JhcGhDb25maWciLCJlbnRpdGllcyIsImxlbmd0aCIsImlubmVySFRNTCIsIm9wdGlvbiIsImFsbENoZWNrYm94IiwidHlwZSIsInNlbGVjdE5EZXNlbGVjdCIsIl9jaGlsZCIsImZyYWdtZW50IiwiY2hlY2tib3giLCJoYXNEYXRhIiwibmFtZSIsImN1cnJlbnRHcmFwaERhdGEiLCJfZGF0YSIsImlzTmFOIiwicG9pbnRlckV2ZW50cyIsInB1c2giLCJjaG9zZW5Db2xsZWN0aW9uIiwiX3NlcmllcyIsImNvbnNvbGUiLCJsb2ciLCJ1bmRlZmluZWQiLCJkYXRhIiwiY29sbGVjdGlvbiIsImNyZWF0ZU9wdGlvbnMiLCJpbml0RG9tIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztJQUVxQkEsTSxHQWVqQixnQkFBbUJDLGFBQW5CLEVBQWtE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Q0FBQ0MsR0FBUixXQUFlbkMsT0FBZixjQUEwQlEsS0FBMUIsY0FBbUMsS0FBSSxDQUFDQyxPQUFMLENBQWFELEtBQWIsQ0FBbkM7O0FBQ0EsUUFBSSxLQUFJLENBQUNDLE9BQUwsQ0FBYUQsS0FBYixDQUFKLEVBQXlCO0FBQ3JCLE1BQUEsS0FBSSxDQUFDQyxPQUFMLENBQWFELEtBQWIsRUFBb0JSLE9BQXBCLEdBQThCQSxPQUE5QjtBQUNIO0FBRUosR0FsUDRIOztBQUN6SCxPQUFLd0MsT0FBTDtBQUNBLE9BQUsvQixPQUFMLEdBQWUsRUFBZjtBQUNILEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0dyYXBoQ29sbGVjdGlvbiwgR3JhcGhTZXJpZXMsIFZpZXdDb25maWd9IGZyb20gXCIuLi8uLi8uLi9tZXRhZGF0YS9jb25maWd1cmF0aW9uc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZXJpZXMge1xuXG5cbiAgICBwcml2YXRlIGNoZWNrQm94RGl2PzogSFRNTERpdkVsZW1lbnQ7XG5cbiAgICBwcml2YXRlIGNob3NlbkNvbGxlY3Rpb24/OiBHcmFwaENvbGxlY3Rpb247XG5cbiAgICBwcml2YXRlIGN1cnJlbnRHcmFwaERhdGE/OiBBcnJheTxhbnk+O1xuXG4gICAgcHJpdmF0ZSBsYWJlbHM/OiBzdHJpbmdbXTtcblxuICAgIHByaXZhdGUgaXNJbml0OiBib29sZWFuID0gdHJ1ZTtcblxuICAgIHByaXZhdGUgb3B0aW9uczogQXJyYXk8SFRNTElucHV0RWxlbWVudD47XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcGFyZW50RWxlbWVudDogRWxlbWVudCwgcHVibGljIHZpZXdDb25maWc6IFZpZXdDb25maWcsIHB1YmxpYyBnPzogRHlncmFwaCwgb25DaGFuZ2VMaXN0ZW5lcj86ICgpID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5pbml0RG9tKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IFtdO1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBpbml0RG9tID0gKCkgPT4ge1xuICAgICAgICBsZXQgZHJvcGRvd25Db250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGRyb3Bkb3duQ29udGFpbmVyLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwiZmdwLXNlcmllcy1kcm9wZG93blwiKTtcblxuICAgICAgICBjb25zdCBtdWx0aVNlbGVjdERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIG11bHRpU2VsZWN0RGl2LnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwiZ3JhcGgtc2VyaWVzLW11bHRpLXNlbGVjdFwiKTtcblxuICAgICAgICAvLy0tLS0tLS0tLS0tLSBzZWxlY3QgLS0tLS0tLS0tLS0tLS0tLS0vL1xuICAgICAgICBjb25zdCBzZWxlY3RCb3hEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBzZWxlY3RCb3hEaXYuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJzZWxlY3QtYm94XCIpO1xuXG4gICAgICAgIGxldCBleHBhbmRlZCA9IGZhbHNlO1xuXG5cbiAgICAgICAgc2VsZWN0Qm94RGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gc2hvdyBjb250ZW50XG4gICAgICAgICAgICBpZiAoIWV4cGFuZGVkICYmIHRoaXMuY2hlY2tCb3hEaXYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQm94RGl2LnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgZXhwYW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChleHBhbmRlZCAmJiB0aGlzLmNoZWNrQm94RGl2KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0JveERpdi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgICAgICAgICAgZXhwYW5kZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGNyZWF0ZSBzZWxlY3QgYW5kIHB1dCBpdCBpbnRvIGRpdlxuICAgICAgICBjb25zdCBzZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIpO1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7XG4gICAgICAgIHBsYWNlaG9sZGVyLnRleHQgPSBcInNlcmllc1wiO1xuICAgICAgICBzZWxlY3QuYWRkKHBsYWNlaG9sZGVyKTtcbiAgICAgICAgc2VsZWN0Qm94RGl2LmFwcGVuZENoaWxkKHNlbGVjdCk7XG4gICAgICAgIC8vIG92ZXIgc2VsZWN0XG4gICAgICAgIGNvbnN0IG92ZXJTZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBvdmVyU2VsZWN0LnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwib3Zlci1zZWxlY3RcIik7XG4gICAgICAgIHNlbGVjdEJveERpdi5hcHBlbmQob3ZlclNlbGVjdCk7XG4gICAgICAgIG11bHRpU2VsZWN0RGl2LmFwcGVuZENoaWxkKHNlbGVjdEJveERpdik7XG5cblxuICAgICAgICAvLy0tLS0tLS0tLS0tLSBvcHRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLy9cbiAgICAgICAgY29uc3QgY2hlY2tib3hEaXYgPSB0aGlzLmNoZWNrQm94RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgY2hlY2tib3hEaXYuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJncmFwaC1zZXJpZXMtY2hlY2tib3hlc1wiKTtcbiAgICAgICAgbXVsdGlTZWxlY3REaXYuYXBwZW5kKGNoZWNrYm94RGl2KTtcbiAgICAgICAgZHJvcGRvd25Db250YWluZXIuYXBwZW5kQ2hpbGQobXVsdGlTZWxlY3REaXYpO1xuICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25Db250YWluZXIpO1xuICAgIH07XG5cblxuICAgIHByaXZhdGUgc2VsZWN0TkRlc2VsZWN0ID0gKHNlcmllczogc3RyaW5nLCBjaGVja2VkOiBib29sZWFuLCBhbGw6IEhUTUxJbnB1dEVsZW1lbnQgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgbGV0IHZpc2liaWxpdHkgPSB0aGlzLmc/LmdldE9wdGlvbigndmlzaWJpbGl0eScpO1xuICAgICAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmc/LmdldExhYmVscygpO1xuXG4gICAgICAgIGlmIChhbGwpIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBpZiAoXCJhbGxcIiA9PT0gc2VyaWVzKSB7XG4gICAgICAgICAgICAgICAgYWxsLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIHNlbGVjdCBhbGxcbiAgICAgICAgICAgICAgICBpZiAodmlzaWJpbGl0eSAmJiBsYWJlbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzLmZvckVhY2goKGxhYmVsOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbCAhPSBcInhcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2liaWxpdHlbaW5kZXggLSAxXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1tpbmRleCAtIDFdLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGdyYXBoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZz8udXBkYXRlT3B0aW9ucyh7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OiB2aXNpYmlsaXR5XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gbm8gZGVzZWxlY3QgYWxsXG4gICAgICAgICAgICAgICAgaWYgKHZpc2liaWxpdHkgJiYgbGFiZWxzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmdWxsQ2hlY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5mb3JFYWNoKChsYWJlbDogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWwgPT0gc2VyaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJpbGl0eVtpbmRleCAtIDFdID0gY2hlY2tlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHZpc2liaWxpdHkubWFwKCh2OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsQ2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYWxsLmNoZWNrZWQgPSBmdWxsQ2hlY2tlZDtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGdyYXBoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZz8udXBkYXRlT3B0aW9ucyh7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OiB2aXNpYmlsaXR5XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHZpc2liaWxpdHkgJiYgbGFiZWxzKSB7XG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICBsYWJlbHMuZm9yRWFjaCgobGFiZWw6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWwgPT0gc2VyaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmlsaXR5W2luZGV4IC0gMV0gPSBjaGVja2VkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGdyYXBoXG4gICAgICAgICAgICAgICAgdGhpcy5nPy51cGRhdGVPcHRpb25zKHtcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJpbGl0eVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cblxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBjcmVhdGUgb3B0aW9uc1xuICAgICAqIEBwYXJhbSBwYXJlbnRFbGVtZW50XG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVPcHRpb25zID0gKHZpZXdDb25maWc6IFZpZXdDb25maWcsIHBhcmVudEVsZW1lbnQ/OiBFbGVtZW50KSA9PiB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IFtdO1xuICAgICAgICAvLyBkZXZpY2UgdmlldyBvciBzY2F0dGVyIHZpZXcgP1xuICAgICAgICBpZiAodmlld0NvbmZpZy5ncmFwaENvbmZpZy5lbnRpdGllcy5sZW5ndGggPiAxICYmIHBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHBhcmVudEVsZW1lbnQuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgICAgICAvLyBhZGQgc2VsZWN0IGFsbFxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIpO1xuICAgICAgICAgICAgY29uc3QgYWxsQ2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgICAgICBhbGxDaGVja2JveC50eXBlID0gJ2NoZWNrYm94JztcbiAgICAgICAgICAgIGFsbENoZWNrYm94LmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICAgICAgYWxsQ2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RORGVzZWxlY3QoXCJhbGxcIiwgYWxsQ2hlY2tib3guY2hlY2tlZCwgYWxsQ2hlY2tib3gpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvcHRpb24uYXBwZW5kKGFsbENoZWNrYm94KTtcbiAgICAgICAgICAgIG9wdGlvbi5hcHBlbmQoXCJBbGxcIik7XG4gICAgICAgICAgICBwYXJlbnRFbGVtZW50LmFwcGVuZChvcHRpb24pO1xuXG4gICAgICAgICAgICAvLyBzY2F0dGVyIHZpZXdcbiAgICAgICAgICAgIHZpZXdDb25maWcuZ3JhcGhDb25maWcuZW50aXRpZXMuZm9yRWFjaChfY2hpbGQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghX2NoaWxkLmZyYWdtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrYm94LnR5cGUgPSAnY2hlY2tib3gnO1xuICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIG91dCBpZiBkYXRhIGNvbHVtbiBhbGwgbnVsbCBvciBOYU5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGhhc0RhdGEgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbHM/LmZvckVhY2goKGxhYmVsLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsID09PSBfY2hpbGQubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIGNoZWNrIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRHcmFwaERhdGE/LmZvckVhY2goX2RhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2RhdGFbaW5kZXggKyAxXSAhPT0gbnVsbCAmJiAhaXNOYU4oX2RhdGFbaW5kZXggKyAxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0RhdGEgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjaGVja2JveC5jaGVja2VkID0gaGFzRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNEYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24uc3R5bGUucG9pbnRlckV2ZW50cyA9IFwibm9uZVwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RORGVzZWxlY3QoX2NoaWxkLm5hbWUsIGNoZWNrYm94LmNoZWNrZWQsIGFsbENoZWNrYm94KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uLmFwcGVuZChjaGVja2JveCk7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbi5hcHBlbmQoYCR7X2NoaWxkLm5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wdXNoKGNoZWNrYm94KTtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmQob3B0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuXG4gICAgICAgIH0gZWxzZSBpZiAodmlld0NvbmZpZy5ncmFwaENvbmZpZy5lbnRpdGllcy5sZW5ndGggPT09IDEgJiYgcGFyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gZGV2aWNlIHZpZXdcbiAgICAgICAgICAgIHBhcmVudEVsZW1lbnQuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgICAgICBpZiAodGhpcy5jaG9zZW5Db2xsZWN0aW9uKSB7XG5cbiAgICAgICAgICAgICAgICAvL1xuXG4gICAgICAgICAgICAgICAgdGhpcy5jaG9zZW5Db2xsZWN0aW9uLnNlcmllcy5mb3JFYWNoKF9zZXJpZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke19zZXJpZXMudmlzaWJpbGl0eX1gKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrYm94LnR5cGUgPSAnY2hlY2tib3gnO1xuICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIG91dCBpZiBkYXRhIGNvbHVtbiBhbGwgbnVsbCBvciBOYU5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGhhc0RhdGEgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbHM/LmZvckVhY2goKGxhYmVsLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsID09PSBfc2VyaWVzLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4gY2hlY2sgZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEdyYXBoRGF0YT8uZm9yRWFjaChfZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfZGF0YVtpbmRleCArIDFdICE9PSBudWxsICYmICFpc05hTihfZGF0YVtpbmRleCArIDFdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzRGF0YSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICAgICAgICAgICAgICBjaGVja2JveC5jaGVja2VkID0gKCEoX3Nlcmllcy52aXNpYmlsaXR5ICE9PSB1bmRlZmluZWQgJiYgIV9zZXJpZXMudmlzaWJpbGl0eSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmKGNoZWNrYm94LmNoZWNrZWQgJiYgIWhhc0RhdGEpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tib3guY2hlY2tlZCA9IGhhc0RhdGE7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbi5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdE5EZXNlbGVjdChfc2VyaWVzLmxhYmVsLCBjaGVja2JveC5jaGVja2VkLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uLmFwcGVuZChjaGVja2JveCk7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbi5hcHBlbmQoYCR7X3Nlcmllcy5sYWJlbH1gKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnB1c2goY2hlY2tib3gpO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRFbGVtZW50LmFwcGVuZChvcHRpb24pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHB1YmxpYyBzZXREYXRhID0gKGRhdGE6IGFueSwgbGFiZWxzOiBzdHJpbmdbXSwgY29sbGVjdGlvbjogR3JhcGhDb2xsZWN0aW9uKSA9PiB7XG4gICAgICAgIHRoaXMuY2hvc2VuQ29sbGVjdGlvbiA9IGNvbGxlY3Rpb247XG4gICAgICAgIHRoaXMuY3VycmVudEdyYXBoRGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMubGFiZWxzID0gbGFiZWxzO1xuICAgICAgICAvLyB1cGRhdGUgb3B0aW9ucyB1cHMgdG8gbGFiZWxzIGFuZCBkYXRhXG4gICAgICAgIHRoaXMuY3JlYXRlT3B0aW9ucyh0aGlzLnZpZXdDb25maWcsIHRoaXMuY2hlY2tCb3hEaXYpO1xuXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHVwZGF0ZSBkcm9wZG93biBzZWxlY3Rpb25cbiAgICAgKiBAcGFyYW0gY2hlY2tlZFxuICAgICAqIEBwYXJhbSBpbmRleFxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVPcHRpb24gPSAoY2hlY2tlZDogYm9vbGVhbiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgJHtjaGVja2VkfSAke2luZGV4fSAke3RoaXMub3B0aW9uc1tpbmRleF19YCk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnNbaW5kZXhdKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnNbaW5kZXhdLmNoZWNrZWQgPSBjaGVja2VkO1xuICAgICAgICB9XG5cbiAgICB9O1xuXG5cbn0iXX0=