d3-graphviz
Version:
Graphviz DOT rendering and animated transitions for D3
753 lines (739 loc) • 806 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-selection'), require('d3-dispatch'), require('d3-transition'), require('d3-timer'), require('d3-interpolate'), require('d3-zoom'), require('d3-format'), require('d3-path')) :
typeof define === 'function' && define.amd ? define(['exports', 'd3-selection', 'd3-dispatch', 'd3-transition', 'd3-timer', 'd3-interpolate', 'd3-zoom', 'd3-format', 'd3-path'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["d3-graphviz"] = {}, global.d3, global.d3, global.d3, global.d3, global.d3, global.d3, global.d3, global.d3));
})(this, (function (exports, d3, d3Dispatch, d3Transition, d3Timer, d3Interpolate, d3Zoom, d3Format, d3Path) { 'use strict';
function _interopNamespaceDefault(e) {
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n.default = e;
return Object.freeze(n);
}
var d3__namespace = /*#__PURE__*/_interopNamespaceDefault(d3);
function _arrayLikeToArray(r, a) {
(null == a || a > r.length) && (a = r.length);
for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
return n;
}
function _arrayWithoutHoles(r) {
if (Array.isArray(r)) return _arrayLikeToArray(r);
}
function _defineProperty(e, r, t) {
return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
value: t,
enumerable: !0,
configurable: !0,
writable: !0
}) : e[r] = t, e;
}
function _iterableToArray(r) {
if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r);
}
function _nonIterableSpread() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _toConsumableArray(r) {
return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();
}
function _toPrimitive(t, r) {
if ("object" != typeof t || !t) return t;
var e = t[Symbol.toPrimitive];
if (void 0 !== e) {
var i = e.call(t, r || "default");
if ("object" != typeof i) return i;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return ("string" === r ? String : Number)(t);
}
function _toPropertyKey(t) {
var i = _toPrimitive(t, "string");
return "symbol" == typeof i ? i : i + "";
}
function _unsupportedIterableToArray(r, a) {
if (r) {
if ("string" == typeof r) return _arrayLikeToArray(r, a);
var t = {}.toString.call(r).slice(8, -1);
return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
}
}
function extractElementData(element) {
var datum = {};
var tag = element.node().nodeName;
datum.tag = tag;
if (tag == '#text') {
datum.text = element.text();
} else if (tag == '#comment') {
datum.comment = element.text();
}
datum.attributes = {};
var attributes = element.node().attributes;
if (attributes) {
for (var i = 0; i < attributes.length; i++) {
var attribute = attributes[i];
var name = attribute.name;
var value = attribute.value;
datum.attributes[name] = value;
}
}
var transform = element.node().transform;
if (transform && transform.baseVal.numberOfItems != 0) {
var matrix = transform.baseVal.consolidate().matrix;
datum.translation = {
x: matrix.e,
y: matrix.f
};
datum.scale = matrix.a;
}
if (tag == 'ellipse') {
datum.center = {
x: datum.attributes.cx,
y: datum.attributes.cy
};
}
if (tag == 'polygon') {
var points = element.attr('points').split(' ');
var x = points.map(function (p) {
return p.split(',')[0];
});
var y = points.map(function (p) {
return p.split(',')[1];
});
var xmin = Math.min.apply(null, x);
var xmax = Math.max.apply(null, x);
var ymin = Math.min.apply(null, y);
var ymax = Math.max.apply(null, y);
var bbox = {
x: xmin,
y: ymin,
width: xmax - xmin,
height: ymax - ymin
};
datum.bbox = bbox;
datum.center = {
x: (xmin + xmax) / 2,
y: (ymin + ymax) / 2
};
}
if (tag == 'path') {
var d = element.attr('d');
var points = d.split(/[A-Z ]/);
points.shift();
var x = points.map(function (p) {
return +p.split(',')[0];
});
var y = points.map(function (p) {
return +p.split(',')[1];
});
var xmin = Math.min.apply(null, x);
var xmax = Math.max.apply(null, x);
var ymin = Math.min.apply(null, y);
var ymax = Math.max.apply(null, y);
var bbox = {
x: xmin,
y: ymin,
width: xmax - xmin,
height: ymax - ymin
};
datum.bbox = bbox;
datum.center = {
x: (xmin + xmax) / 2,
y: (ymin + ymax) / 2
};
datum.totalLength = element.node().getTotalLength();
}
if (tag == 'text') {
datum.center = {
x: element.attr('x'),
y: element.attr('y')
};
}
if (tag == '#text') {
datum.text = element.text();
} else if (tag == '#comment') {
datum.comment = element.text();
}
return datum;
}
function extractAllElementsData(element) {
var datum = extractElementData(element);
datum.children = [];
var children = d3__namespace.selectAll(element.node().childNodes);
children.each(function () {
var childData = extractAllElementsData(d3__namespace.select(this));
childData.parent = datum;
datum.children.push(childData);
});
return datum;
}
function createElement(data) {
if (data.tag == '#text') {
return document.createTextNode("");
} else if (data.tag == '#comment') {
return document.createComment(data.comment);
} else {
return document.createElementNS('http://www.w3.org/2000/svg', data.tag);
}
}
function createElementWithAttributes(data) {
var elementNode = createElement(data);
var element = d3__namespace.select(elementNode);
var attributes = data.attributes;
for (var _i = 0, _Object$keys = Object.keys(attributes); _i < _Object$keys.length; _i++) {
var attributeName = _Object$keys[_i];
var attributeValue = attributes[attributeName];
element.attr(attributeName, attributeValue);
}
return elementNode;
}
function replaceElement(element, data) {
var parent = d3__namespace.select(element.node().parentNode);
var newElementNode = createElementWithAttributes(data);
var newElement = parent.insert(function () {
return newElementNode;
}, function () {
return element.node();
});
element.remove();
return newElement;
}
function insertElementData(element, datum) {
element.datum(datum);
element.data([datum], function (d) {
return d.key;
});
}
function insertAllElementsData(element, datum) {
insertElementData(element, datum);
var children = d3__namespace.selectAll(element.node().childNodes);
children.each(function (d, i) {
insertAllElementsData(d3__namespace.select(this), datum.children[i]);
});
}
function insertChildren(element, index) {
var children = element.selectAll(function () {
return element.node().childNodes;
});
children = children.data(function (d) {
return d.children;
}, function (d) {
return d.tag + '-' + index;
});
var childrenEnter = children.enter().append(function (d) {
return createElement(d);
});
var childrenExit = children.exit();
childrenExit = childrenExit.remove();
children = childrenEnter.merge(children);
var childTagIndexes = {};
children.each(function (childData) {
var childTag = childData.tag;
if (childTagIndexes[childTag] == null) {
childTagIndexes[childTag] = 0;
}
var childIndex = childTagIndexes[childTag]++;
attributeElement.call(this, childData, childIndex);
});
}
function attributeElement(data) {
var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var element = d3__namespace.select(this);
data.tag;
var attributes = data.attributes;
var currentAttributes = element.node().attributes;
if (currentAttributes) {
for (var i = 0; i < currentAttributes.length; i++) {
var currentAttribute = currentAttributes[i];
var name = currentAttribute.name;
if (name.split(':')[0] != 'xmlns' && currentAttribute.namespaceURI) {
var namespaceURIParts = currentAttribute.namespaceURI.split('/');
var namespace = namespaceURIParts[namespaceURIParts.length - 1];
name = namespace + ':' + name;
}
if (!(name in attributes)) {
attributes[name] = null;
}
}
}
for (var _i2 = 0, _Object$keys2 = Object.keys(attributes); _i2 < _Object$keys2.length; _i2++) {
var attributeName = _Object$keys2[_i2];
element.attr(attributeName, attributes[attributeName]);
}
if (data.text) {
element.text(data.text);
}
insertChildren(element, index);
}
function zoom (enable) {
this._options.zoom = enable;
if (this._options.zoom && !this._zoomBehavior) {
createZoomBehavior.call(this);
} else if (!this._options.zoom && this._zoomBehavior) {
this._zoomSelection.on(".zoom", null);
this._zoomBehavior = null;
}
return this;
}
function createZoomBehavior() {
var graphvizInstance = this;
function zoomed(event) {
var g = d3__namespace.select(svg.node().querySelector("g"));
g.attr('transform', event.transform);
graphvizInstance._dispatch.call('zoom', graphvizInstance);
}
var root = this._selection;
var svg = d3__namespace.select(root.node().querySelector("svg"));
if (svg.size() == 0) {
return this;
}
this._zoomSelection = svg;
var zoomBehavior = d3Zoom.zoom().scaleExtent(this._options.zoomScaleExtent).translateExtent(this._options.zoomTranslateExtent).interpolate(d3Interpolate.interpolate).on("zoom", zoomed);
this._zoomBehavior = zoomBehavior;
var g = d3__namespace.select(svg.node().querySelector("g"));
svg.call(zoomBehavior);
if (!this._active) {
translateZoomBehaviorTransform.call(this, g);
}
this._originalTransform = d3Zoom.zoomTransform(svg.node());
return this;
}
function getTranslatedZoomTransform(selection) {
// Get the current zoom transform for the top level svg and
// translate it uniformly with the given selection, using the
// difference between the translation specified in the selection's
// data and it's saved previous translation. The selection is
// normally the top level g element of the graph.
var oldTranslation = this._translation;
var oldScale = this._scale;
var newTranslation = selection.datum().translation;
var newScale = selection.datum().scale;
var t = d3Zoom.zoomTransform(this._zoomSelection.node());
if (oldTranslation) {
t = t.scale(1 / oldScale);
t = t.translate(-oldTranslation.x, -oldTranslation.y);
}
t = t.translate(newTranslation.x, newTranslation.y);
t = t.scale(newScale);
return t;
}
function translateZoomBehaviorTransform(selection) {
// Translate the current zoom transform for the top level svg
// uniformly with the given selection, using the difference
// between the translation specified in the selection's data and
// it's saved previous translation. The selection is normally the
// top level g element of the graph.
this._zoomBehavior.transform(this._zoomSelection, getTranslatedZoomTransform.call(this, selection));
// Save the selections's new translation and scale.
this._translation = selection.datum().translation;
this._scale = selection.datum().scale;
// Set the original zoom transform to the translation and scale specified in
// the selection's data.
this._originalTransform = d3Zoom.zoomIdentity.translate(selection.datum().translation.x, selection.datum().translation.y).scale(selection.datum().scale);
}
function resetZoom(transition) {
// Reset the zoom transform to the original zoom transform.
var selection = this._zoomSelection;
if (transition) {
selection = selection.transition(transition);
}
selection.call(this._zoomBehavior.transform, this._originalTransform);
return this;
}
function zoomScaleExtent(extent) {
this._options.zoomScaleExtent = extent;
return this;
}
function zoomTranslateExtent(extent) {
this._options.zoomTranslateExtent = extent;
return this;
}
function zoomBehavior() {
return this._zoomBehavior || null;
}
function zoomSelection() {
return this._zoomSelection || null;
}
function pathTween(points, d1) {
return function () {
var pointInterpolators = points.map(function (p) {
return d3Interpolate.interpolate([p[0][0], p[0][1]], [p[1][0], p[1][1]]);
});
return function (t) {
return t < 1 ? "M" + pointInterpolators.map(function (p) {
return p(t);
}).join("L") : d1;
};
};
}
function pathTweenPoints(node, d1, precision, precisionIsRelative) {
var path0 = node;
var path1 = path0.cloneNode();
var n0 = path0.getTotalLength();
var n1 = (path1.setAttribute("d", d1), path1).getTotalLength();
// Uniform sampling of distance based on specified precision.
var distances = [0];
var i = 0;
var dt = precisionIsRelative ? precision : precision / Math.max(n0, n1);
while ((i += dt) < 1) {
distances.push(i);
}
distances.push(1);
// Compute point-interpolators at each distance.
var points = distances.map(function (t) {
var p0 = path0.getPointAtLength(t * n0);
var p1 = path1.getPointAtLength(t * n1);
return [[p0.x, p0.y], [p1.x, p1.y]];
});
return points;
}
function data () {
return this._data || null;
}
function isEdgeElementParent(datum) {
return datum.attributes["class"] == 'edge' || datum.tag == 'a' && datum.parent.tag == 'g' && datum.parent.parent.attributes["class"] == 'edge';
}
function isEdgeElement(datum) {
return datum.parent && isEdgeElementParent(datum.parent);
}
function getEdgeGroup(datum) {
if (datum.parent.attributes["class"] == 'edge') {
return datum.parent;
} else {
// datum.parent.tag == 'g' && datum.parent.parent.tag == 'g' && datum.parent.parent.parent.attributes.class == 'edge'
return datum.parent.parent.parent;
}
}
function getEdgeTitle(datum) {
return getEdgeGroup(datum).children.find(function (e) {
return e.tag == 'title';
});
}
function render (callback) {
if (this._busy) {
this._queue.push(this.render.bind(this, callback));
return this;
}
this._dispatch.call('renderStart', this);
if (this._transitionFactory) {
d3Timer.timeout(function () {
// Decouple from time spent. See https://github.com/d3/d3-timer/issues/27
this._transition = d3Transition.transition(this._transitionFactory());
_render.call(this, callback);
}.bind(this), 0);
} else {
_render.call(this, callback);
}
return this;
}
function _render(callback) {
var transitionInstance = this._transition;
var fade = this._options.fade && transitionInstance != null;
var tweenPaths = this._options.tweenPaths;
var tweenShapes = this._options.tweenShapes;
var convertEqualSidedPolygons = this._options.convertEqualSidedPolygons;
var growEnteringEdges = this._options.growEnteringEdges && transitionInstance != null;
var attributer = this._attributer;
var graphvizInstance = this;
function insertChildren(element) {
var children = element.selectAll(function () {
return element.node().childNodes;
});
children = children.data(function (d) {
return d.children;
}, function (d) {
return d.key;
});
var childrenEnter = children.enter().append(function (d) {
var element = createElement(d);
if (d.tag == '#text' && fade) {
element.nodeValue = d.text;
}
return element;
});
if (fade || growEnteringEdges && isEdgeElementParent(element.datum())) {
var childElementsEnter = childrenEnter.filter(function (d) {
return d.tag[0] == '#' ? null : this;
}).each(function (d) {
var childEnter = d3__namespace.select(this);
for (var _i = 0, _Object$keys = Object.keys(d.attributes); _i < _Object$keys.length; _i++) {
var attributeName = _Object$keys[_i];
var attributeValue = d.attributes[attributeName];
childEnter.attr(attributeName, attributeValue);
}
});
childElementsEnter.filter(function (d) {
return d.tag == 'svg' || d.tag == 'g' ? null : this;
}).style("opacity", 0.0);
}
var childrenExit = children.exit();
if (attributer) {
childrenExit.each(attributer);
}
if (transitionInstance) {
childrenExit = childrenExit.transition(transitionInstance);
if (fade) {
childrenExit.filter(function (d) {
return d.tag[0] == '#' ? null : this;
}).style("opacity", 0.0);
}
}
childrenExit = childrenExit.remove();
children = childrenEnter.merge(children).order();
children.each(attributeElement);
}
function attributeElement(data) {
var element = d3__namespace.select(this);
if (data.tag == "svg") {
var options = graphvizInstance._options;
if (options.width != null || options.height != null) {
var width = options.width;
var height = options.height;
if (width == null) {
width = data.attributes.width.replace('pt', '') * 4 / 3;
} else {
element.attr("width", width);
data.attributes.width = width;
}
if (height == null) {
height = data.attributes.height.replace('pt', '') * 4 / 3;
} else {
element.attr("height", height);
data.attributes.height = height;
}
if (!options.fit) {
element.attr("viewBox", "0 0 ".concat(width * 3 / 4 / options.scale, " ").concat(height * 3 / 4 / options.scale));
data.attributes.viewBox = "0 0 ".concat(width * 3 / 4 / options.scale, " ").concat(height * 3 / 4 / options.scale);
}
}
if (options.scale != 1 && (options.fit || options.width == null && options.height == null)) {
width = data.attributes.viewBox.split(' ')[2];
height = data.attributes.viewBox.split(' ')[3];
element.attr("viewBox", "0 0 ".concat(width / options.scale, " ").concat(height / options.scale));
data.attributes.viewBox = "0 0 ".concat(width / options.scale, " ").concat(height / options.scale);
}
}
if (attributer) {
element.each(attributer);
}
var tag = data.tag;
var attributes = data.attributes;
var currentAttributes = element.node().attributes;
if (currentAttributes) {
for (var i = 0; i < currentAttributes.length; i++) {
var currentAttribute = currentAttributes[i];
var name = currentAttribute.name;
if (name.split(':')[0] != 'xmlns' && currentAttribute.namespaceURI) {
var namespaceURIParts = currentAttribute.namespaceURI.split('/');
var namespace = namespaceURIParts[namespaceURIParts.length - 1];
name = namespace + ':' + name;
}
if (!(name in attributes)) {
attributes[name] = null;
}
}
}
var convertShape = false;
var convertPrevShape = false;
if (tweenShapes && transitionInstance) {
if ((this.nodeName == 'polygon' || this.nodeName == 'ellipse') && data.alternativeOld) {
convertPrevShape = true;
}
if ((tag == 'polygon' || tag == 'ellipse') && data.alternativeNew) {
convertShape = true;
}
if (this.nodeName == 'polygon' && tag == 'polygon' && data.alternativeOld) {
var prevData = extractElementData(element);
var prevPoints = prevData.attributes.points;
if (!convertEqualSidedPolygons) {
var nPrevPoints = prevPoints.split(' ').length;
var points = data.attributes.points;
var nPoints = points.split(' ').length;
if (nPoints == nPrevPoints) {
convertShape = false;
convertPrevShape = false;
}
}
}
if (convertPrevShape) {
var prevPathData = data.alternativeOld;
var pathElement = replaceElement(element, prevPathData);
pathElement.data([data], function () {
return data.key;
});
element = pathElement;
}
if (convertShape) {
var newPathData = data.alternativeNew;
tag = 'path';
attributes = newPathData.attributes;
}
}
var elementTransition = element;
if (transitionInstance) {
elementTransition = elementTransition.transition(transitionInstance);
if (fade) {
elementTransition.filter(function (d) {
return d.tag[0] == '#' ? null : this;
}).style("opacity", 1.0);
}
elementTransition.filter(function (d) {
return d.tag[0] == '#' ? null : this;
}).on("end", function (d) {
d3__namespace.select(this).attr('style', d && d.attributes && d.attributes.style || null);
});
}
var growThisPath = growEnteringEdges && tag == 'path' && data.offset;
if (growThisPath) {
var totalLength = data.totalLength;
element.attr("stroke-dasharray", totalLength + " " + totalLength).attr("stroke-dashoffset", totalLength).attr('transform', 'translate(' + data.offset.x + ',' + data.offset.y + ')');
attributes["stroke-dashoffset"] = 0;
attributes['transform'] = 'translate(0,0)';
elementTransition.attr("stroke-dashoffset", attributes["stroke-dashoffset"]).attr('transform', attributes['transform']).on("start", function () {
d3__namespace.select(this).style('opacity', null);
}).on("end", function () {
d3__namespace.select(this).attr('stroke-dashoffset', null).attr('stroke-dasharray', null).attr('transform', null);
});
}
var moveThisPolygon = growEnteringEdges && tag == 'polygon' && isEdgeElement(data) && data.offset && data.parent.children[3].tag == 'path';
if (moveThisPolygon) {
var edgePath = d3__namespace.select(element.node().parentNode.querySelector("path"));
var p0 = edgePath.node().getPointAtLength(0);
var p1 = edgePath.node().getPointAtLength(data.totalLength);
var p2 = edgePath.node().getPointAtLength(data.totalLength - 1);
var angle1 = Math.atan2(p1.y - p2.y, p1.x - p2.x) * 180 / Math.PI;
var x = p0.x - p1.x + data.offset.x;
var y = p0.y - p1.y + data.offset.y;
element.attr('transform', 'translate(' + x + ',' + y + ')');
elementTransition.attrTween("transform", function () {
return function (t) {
var p = edgePath.node().getPointAtLength(data.totalLength * t);
var p2 = edgePath.node().getPointAtLength(data.totalLength * t + 1);
var angle = Math.atan2(p2.y - p.y, p2.x - p.x) * 180 / Math.PI - angle1;
x = p.x - p1.x + data.offset.x * (1 - t);
y = p.y - p1.y + data.offset.y * (1 - t);
return 'translate(' + x + ',' + y + ') rotate(' + angle + ' ' + p1.x + ' ' + p1.y + ')';
};
}).on("start", function () {
d3__namespace.select(this).style('opacity', null);
}).on("end", function () {
d3__namespace.select(this).attr('transform', null);
});
}
var tweenThisPath = tweenPaths && transitionInstance && tag == 'path' && element.attr('d') != null;
for (var _i2 = 0, _Object$keys2 = Object.keys(attributes); _i2 < _Object$keys2.length; _i2++) {
var attributeName = _Object$keys2[_i2];
var attributeValue = attributes[attributeName];
if (tweenThisPath && attributeName == 'd') {
var points = (data.alternativeOld || data).points;
if (points) {
elementTransition.attrTween("d", pathTween(points, attributeValue));
}
} else {
if (attributeName == 'transform' && data.translation) {
if (transitionInstance) {
var onEnd = elementTransition.on("end");
elementTransition.on("start", function () {
if (graphvizInstance._zoomBehavior) {
// Update the transform to transition to, just before the transition starts
// in order to catch changes between the transition scheduling to its start.
elementTransition.tween("attr.transform", function () {
var node = this;
return function (t) {
node.setAttribute("transform", d3Interpolate.interpolateTransformSvg(d3Zoom.zoomTransform(graphvizInstance._zoomSelection.node()).toString(), getTranslatedZoomTransform.call(graphvizInstance, element).toString())(t));
};
});
}
}).on("end", function () {
onEnd.call(this);
// Update the zoom transform to the new translated transform
if (graphvizInstance._zoomBehavior) {
translateZoomBehaviorTransform.call(graphvizInstance, element);
}
});
} else {
if (graphvizInstance._zoomBehavior) {
// Update the transform attribute to set with the current pan translation
translateZoomBehaviorTransform.call(graphvizInstance, element);
attributeValue = getTranslatedZoomTransform.call(graphvizInstance, element).toString();
}
}
}
elementTransition.attr(attributeName, attributeValue);
}
}
if (convertShape) {
elementTransition.on("end", function (d, i, nodes) {
pathElement = d3__namespace.select(this);
var newElement = replaceElement(pathElement, d);
newElement.data([d], function () {
return d.key;
});
});
}
if (data.text) {
elementTransition.text(data.text);
}
insertChildren(element);
}
var root = this._selection;
if (transitionInstance != null) {
// Ensure original SVG shape elements are restored after transition before rendering new graph
var jobs = this._jobs;
if (graphvizInstance._active) {
jobs.push(null);
return this;
} else {
root.transition(transitionInstance).transition().duration(0).on("end", function () {
graphvizInstance._active = false;
if (jobs.length != 0) {
jobs.shift();
graphvizInstance.render();
}
});
this._active = true;
}
}
if (transitionInstance != null) {
root.transition(transitionInstance).on("start", function () {
graphvizInstance._dispatch.call('transitionStart', graphvizInstance);
}).on("end", function () {
graphvizInstance._dispatch.call('transitionEnd', graphvizInstance);
}).transition().duration(0).on("start", function () {
graphvizInstance._dispatch.call('restoreEnd', graphvizInstance);
graphvizInstance._dispatch.call('end', graphvizInstance);
if (callback) {
callback.call(graphvizInstance);
}
});
}
var data = this._data;
var svg = root.selectAll("svg").data([data], function (d) {
return d.key;
});
svg = svg.enter().append("svg").merge(svg);
attributeElement.call(svg.node(), data);
if (this._options.zoom && !this._zoomBehavior) {
createZoomBehavior.call(this);
}
graphvizInstance._dispatch.call('renderEnd', graphvizInstance);
if (transitionInstance == null) {
this._dispatch.call('end', this);
if (callback) {
callback.call(this);
}
}
return this;
}
function graphvizVersion () {
return this._graphvizVersion;
}
var io=ArrayBuffer,H=Uint8Array,Qe=Uint16Array,so=Int16Array,qe=Int32Array,pr=function(p,c,d){if(H.prototype.slice)return H.prototype.slice.call(p,c,d);(c==null||c<0)&&(c=0),(d==null||d>p.length)&&(d=p.length);var s=new H(d-c);return s.set(p.subarray(c,d)),s},Ye=function(p,c,d,s){if(H.prototype.fill)return H.prototype.fill.call(p,c,d,s);for((d==null||d<0)&&(d=0),(s==null||s>p.length)&&(s=p.length);d<s;++d)p[d]=c;return p},uo=function(p,c,d,s){if(H.prototype.copyWithin)return H.prototype.copyWithin.call(p,c,d,s);for((d==null||d<0)&&(d=0),(s==null||s>p.length)&&(s=p.length);d<s;)p[c++]=p[d++];},po=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],T=function(p,c,d){var s=new Error(c||po[p]);if(s.code=p,Error.captureStackTrace&&Error.captureStackTrace(s,T),!d)throw s;return s},jr=function(p,c,d){for(var s=0,f=0;s<d;++s)f|=p[c++]<<(s<<3);return f},lo=function(p,c){return (p[c]|p[c+1]<<8|p[c+2]<<16|p[c+3]<<24)>>>0},co=function(p,c){var d=p[0]|p[1]<<8|p[2]<<16;if(d==3126568&&p[3]==253){var s=p[4],f=s>>5&1,m=s>>2&1,_=s&3,h=s>>6;s&8&&T(0);var M=6-f,I=_==3?4:_,Q=jr(p,M,I);M+=I;var Z=h?1<<h:f,Y=jr(p,M,Z)+(h==1&&256),z=Y;if(!f){var q=1<<10+(p[5]>>3);z=q+(q>>3)*(p[5]&7);}z>2145386496&&T(1);var X=new H((c==1?Y||z:c?0:z)+12);return X[0]=1,X[4]=4,X[8]=8,{b:M+Z,y:0,l:0,d:Q,w:c&&c!=1?c:X.subarray(12),e:z,o:new qe(X.buffer,0,3),u:Y,c:m,m:Math.min(131072,z)}}else if((d>>4|p[3]<<20)==25481893)return lo(p,4)+8;T(0);},Xe=function(p){for(var c=0;1<<c<=p;++c);return c-1},je=function(p,c,d){var s=(c<<3)+4,f=(p[c]&15)+5;f>d&&T(3);for(var m=1<<f,_=m,h=-1,M=-1,I=-1,Q=m,Z=new io(512+(m<<2)),Y=new so(Z,0,256),z=new Qe(Z,0,256),q=new Qe(Z,512,m),X=512+(m<<1),V=new H(Z,X,m),re=new H(Z,X+m);h<255&&_>0;){var S=Xe(_+1),P=s>>3,ae=(1<<S+1)-1,J=(p[P]|p[P+1]<<8|p[P+2]<<16)>>(s&7)&ae,w=(1<<S)-1,j=ae-_-1,W=J&w;if(W<j?(s+=S,J=W):(s+=S+1,J>w&&(J-=j)),Y[++h]=--J,J==-1?(_+=J,V[--Q]=h):_-=J,!J)do{var ie=s>>3;M=(p[ie]|p[ie+1]<<8)>>(s&7)&3,s+=2,h+=M;}while(M==3)}(h>255||_)&&T(0);for(var b=0,k=(m>>1)+(m>>3)+3,se=m-1,oe=0;oe<=h;++oe){var K=Y[oe];if(K<1){z[oe]=-K;continue}for(I=0;I<K;++I){V[b]=oe;do b=b+k&se;while(b>=Q)}}for(b&&T(0),I=0;I<m;++I){var L=z[V[I]]++,A=re[I]=f-Xe(L);q[I]=(L<<A)-m;}return [s+7>>3,{b:f,s:V,n:re,t:q}]},fo=function(p,c){var d=0,s=-1,f=new H(292),m=p[c],_=f.subarray(0,256),h=f.subarray(256,268),M=new Qe(f.buffer,268);if(m<128){var I=je(p,c+1,6),Q=I[0],Z=I[1];c+=m;var Y=Q<<3,z=p[c];z||T(0);for(var q=0,X=0,V=Z.b,re=V,S=(++c<<3)-8+Xe(z);S-=V,!(S<Y);){var P=S>>3;if(q+=(p[P]|p[P+1]<<8)>>(S&7)&(1<<V)-1,_[++s]=Z.s[q],S-=re,S<Y)break;P=S>>3,X+=(p[P]|p[P+1]<<8)>>(S&7)&(1<<re)-1,_[++s]=Z.s[X],V=Z.n[q],q=Z.t[q],re=Z.n[X],X=Z.t[X];}++s>255&&T(0);}else {for(s=m-127;d<s;d+=2){var ae=p[++c];_[d]=ae>>4,_[d+1]=ae&15;}++c;}var J=0;for(d=0;d<s;++d){var w=_[d];w>11&&T(0),J+=w&&1<<w-1;}var j=Xe(J)+1,W=1<<j,ie=W-J;for(ie&ie-1&&T(0),_[s++]=Xe(ie)+1,d=0;d<s;++d){var w=_[d];++h[_[d]=w&&j+1-w];}var b=new H(W<<1),k=b.subarray(0,W),se=b.subarray(W);for(M[j]=0,d=j;d>0;--d){var oe=M[d];Ye(se,d,oe,M[d-1]=oe+h[d]*(1<<j-d));}for(M[0]!=W&&T(0),d=0;d<s;++d){var K=_[d];if(K){var L=M[K];Ye(k,d,L,M[K]=L+(1<<j-K));}}return [c,{n:se,b:j,s:k}]},vo=je(new H([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],mo=je(new H([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],_o=je(new H([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],Pr=function(p,c){for(var d=p.length,s=new qe(d),f=0;f<d;++f)s[f]=c,c+=1<<p[f];return s},cr=new H(new qe([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),go=Pr(cr,0),dr=new H(new qe([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),ho=Pr(dr,3),Ze=function(p,c,d){var s=p.length,f=c.length,m=p[s-1],_=(1<<d.b)-1,h=-d.b;m||T(0);for(var M=0,I=d.b,Q=(s<<3)-8+Xe(m)-I,Z=-1;Q>h&&Z<f;){var Y=Q>>3,z=(p[Y]|p[Y+1]<<8|p[Y+2]<<16)>>(Q&7);M=(M<<I|z)&_,c[++Z]=d.s[M],Q-=I=d.n[M];}(Q!=h||Z+1!=f)&&T(0);},wo=function(p,c,d){var s=6,f=c.length,m=f+3>>2,_=m<<1,h=m+_;Ze(p.subarray(s,s+=p[0]|p[1]<<8),c.subarray(0,m),d),Ze(p.subarray(s,s+=p[2]|p[3]<<8),c.subarray(m,_),d),Ze(p.subarray(s,s+=p[4]|p[5]<<8),c.subarray(_,h),d),Ze(p.subarray(s),c.subarray(h),d);},yo=function(p,c,d){var s,f=c.b,m=p[f],_=m>>1&3;c.l=m&1;var h=m>>3|p[f+1]<<5|p[f+2]<<13,M=(f+=3)+h;if(_==1)return f>=p.length?void 0:(c.b=f+1,d?(Ye(d,p[f],c.y,c.y+=h),d):Ye(new H(h),p[f]));if(!(M>p.length)){if(_==0)return c.b=M,d?(d.set(p.subarray(f,M),c.y),c.y+=h,d):pr(p,f,M);if(_==2){var I=p[f],Q=I&3,Z=I>>2&3,Y=I>>4,z=0,q=0;Q<2?Z&1?Y|=p[++f]<<4|(Z&2&&p[++f]<<12):Y=I>>3:(q=Z,Z<2?(Y|=(p[++f]&63)<<4,z=p[f]>>6|p[++f]<<2):Z==2?(Y|=p[++f]<<4|(p[++f]&3)<<12,z=p[f]>>2|p[++f]<<6):(Y|=p[++f]<<4|(p[++f]&63)<<12,z=p[f]>>6|p[++f]<<2|p[++f]<<10)),++f;var X=d?d.subarray(c.y,c.y+c.m):new H(c.m),V=X.length-Y;if(Q==0)X.set(p.subarray(f,f+=Y),V);else if(Q==1)Ye(X,p[f++],V);else {var re=c.h;if(Q==2){var S=fo(p,f);z+=f-(f=S[0]),c.h=re=S[1];}else re||T(0);(q?wo:Ze)(p.subarray(f,f+=z),X.subarray(V),re);}var P=p[f++];if(P){P==255?P=(p[f++]|p[f++]<<8)+32512:P>127&&(P=P-128<<8|p[f++]);var ae=p[f++];ae&3&&T(0);for(var J=[mo,_o,vo],w=2;w>-1;--w){var j=ae>>(w<<1)+2&3;if(j==1){var W=new H([0,0,p[f++]]);J[w]={s:W.subarray(2,3),n:W.subarray(0,1),t:new Qe(W.buffer,0,1),b:0};}else j==2?(s=je(p,f,9-(w&1)),f=s[0],J[w]=s[1]):j==3&&(c.t||T(0),J[w]=c.t[w]);}var ie=c.t=J,b=ie[0],k=ie[1],se=ie[2],oe=p[M-1];oe||T(0);var K=(M<<3)-8+Xe(oe)-se.b,L=K>>3,A=0,Le=(p[L]|p[L+1]<<8)>>(K&7)&(1<<se.b)-1;L=(K-=k.b)>>3;var Be=(p[L]|p[L+1]<<8)>>(K&7)&(1<<k.b)-1;L=(K-=b.b)>>3;var Re=(p[L]|p[L+1]<<8)>>(K&7)&(1<<b.b)-1;for(++P;--P;){var Ne=se.s[Le],Pe=se.n[Le],Ve=b.s[Re],ye=b.n[Re],ke=k.s[Be],be=k.n[Be];L=(K-=ke)>>3;var $e=1<<ke,ce=$e+((p[L]|p[L+1]<<8|p[L+2]<<16|p[L+3]<<24)>>>(K&7)&$e-1);L=(K-=dr[Ve])>>3;var me=ho[Ve]+((p[L]|p[L+1]<<8|p[L+2]<<16)>>(K&7)&(1<<dr[Ve])-1);L=(K-=cr[Ne])>>3;var _e=go[Ne]+((p[L]|p[L+1]<<8|p[L+2]<<16)>>(K&7)&(1<<cr[Ne])-1);if(L=(K-=Pe)>>3,Le=se.t[Le]+((p[L]|p[L+1]<<8)>>(K&7)&(1<<Pe)-1),L=(K-=ye)>>3,Re=b.t[Re]+((p[L]|p[L+1]<<8)>>(K&7)&(1<<ye)-1),L=(K-=be)>>3,Be=k.t[Be]+((p[L]|p[L+1]<<8)>>(K&7)&(1<<be)-1),ce>3)c.o[2]=c.o[1],c.o[1]=c.o[0],c.o[0]=ce-=3;else {var Ge=ce-(_e!=0);Ge?(ce=Ge==3?c.o[0]-1:c.o[Ge],Ge>1&&(c.o[2]=c.o[1]),c.o[1]=c.o[0],c.o[0]=ce):ce=c.o[0];}for(var w=0;w<_e;++w)X[A+w]=X[V+w];A+=_e,V+=_e;var Ee=A-ce;if(Ee<0){var De=-Ee,We=c.e+Ee;De>me&&(De=me);for(var w=0;w<De;++w)X[A+w]=c.w[We+w];A+=De,me-=De,Ee=0;}for(var w=0;w<me;++w)X[A+w]=X[Ee+w];A+=me;}if(A!=V)for(;V<X.length;)X[A++]=X[V++];else A=X.length;d?c.y+=A:X=pr(X,0,A);}else if(d){if(c.y+=Y,V)for(var w=0;w<Y;++w)X[w]=X[V+w];}else V&&(X=pr(X,V));return c.b=M,X}T(2);}},bo=function(p,c){if(p.length==1)return p[0];for(var d=new H(c),s=0,f=0;s<p.length;++s){var m=p[s];d.set(m,f),f+=m.length;}return d};function Eo(p,c){for(var d=[],s=+!c,f=0,m=0;p.length;){var _=co(p,s||c);if(typeof _=="object"){for(s?(c=null,_.w.length==_.u&&(d.push(c=_.w),m+=_.u)):(d.push(c),_.e=0);!_.l;){var h=yo(p,_,c);h||T(5),c?_.e=_.y:(d.push(h),m+=h.length,uo(_.w,0,h.length),_.w.set(h,_.w.length-h.length));}f=_.b+_.c*4;}else f=_;p=p.subarray(f);}return bo(d,m)}var Mo=(()=>{typeof document<"u"?document.currentScript?.src:void 0;return function(c={}){var d,s=c,f,m,_=new Promise((e,r)=>{f=e,m=r;}),M=Object.assign({},s),I="./this.program",Q=(e,r)=>{throw r},Z="";function Y(e){return Z+e}var z,q,X=console.log.bind(console),V=console.error.bind(console);Object.assign(s,M),M=null;var re;s.wasmBinary&&(re=s.wasmBinary);var S,P=!1;function J(e,r){e||_e(r);}var w,j,W,b,k,oe;function K(){var e=S.buffer;s.HEAP8=w=new Int8Array(e),s.HEAP16=W=new Int16Array(e),s.HEAPU8=j=new Uint8Array(e),s.HEAPU16=new Uint16Array(e),s.HEAP32=b=new Int32Array(e),s.HEAPU32=k=new Uint32Array(e),s.HEAPF32=new Float32Array(e),s.HEAPF64=oe=new Float64Array(e);}var L=[],A=[],Le=[];function Re(){Ae(L);}function Ne(){!s.noFSInit&&!o.init.initialized&&o.init(),o.ignorePermissions=!1,Ae(A);}function Pe(){Ae(Le);}function Ve(e){A.unshift(e);}var ye=0,be=null;function ce(e){ye++;}function me(e){if(ye--,ye==0&&(be)){var r=be;be=null,r();}}function _e(e){e="Aborted("+e+")",V(e),P=!0,e+=". Build with -sASSERTIONS for more info.";var r=new WebAssembly.RuntimeError(e);throw m(r),r}var Ge="data:application/octet-stream;base64,",Ee=e=>e.startsWith(Ge),De=e=>e.startsWith("file://");function We(){var e="graphvizlib.wasm";return Ee(e)?e:Y(e)}var Je;function fr(e){if(e==Je&&re)return new Uint8Array(re);throw "both async and sync fetching of the wasm failed"}function Jr(e){return re?Promise.resolve().then(()=>fr(e)):z(e).then(r=>new Uint8Array(r),()=>fr(e))}function vr(e,r,t){return Jr(e).then(n=>WebAssembly.instantiate(n,r)).then(t,n=>{V(`failed to asynchronously prepare wasm: ${n}`),_e(n);})}function Sr(e,r,t,n){return !e&&typeof WebAssembly.instantiateStreaming=="function"&&!Ee(r)&&!De(r)&&typeof fetch=="function"?fetch(r,{credentials:"same-origin"}).then(a=>{var i=WebAssembly.instantiateStreaming(a,t);return i.then(n,function(u){return V(`wasm streaming compile failed: ${u}`),V("falling back to ArrayBuffer instantiation"),vr(r,t,n)})}):vr(r,t,n)}function Hr(){return {a:Qt}}function Tr(){var e=Hr();function r(n,a){return N=n.exports,S=N.B,K(),Ve(N.C),me(),N}ce();function t(n){r(n.instance);}return Je||(Je=We()),Sr(re,Je,e,t).catch(m),{}}var R,$,Qr={172808:(e,r)=>{var t=ue(e),n=ue(r);o.createPath("/",C.dirname(t)),o.writeFile(C.join("/",t),n);}};function qr(e){this.name="ExitStatus",this.message=`Program terminated with exit(${e})`,this.status=e;}var Ae=e=>{for(;e.length>0;)e.shift()(s);};class $r{constructor(r){this.excPtr=r,this.ptr=r-24;}set_type(r){k[this.ptr+4>>2]=r;}get_type(){return k[this.ptr+4>>2]}set_destructor(r){k[this.ptr+8>>2]=r;}get_destructor(){return k[this.ptr+8>>2]}set_caught(r){r=r?1:0,w[this.ptr+12]=r;}get_caught(){return w[this.ptr+12]!=0}set_rethrown(r){r=r?1:0,w[this.ptr+13]=r;}get_rethrown(){return w[this.ptr+13]!=0}init(r,t){this.set_adjusted_ptr(0),this.set_type(r),this.set_destructor(t);}set_adjusted_ptr(r){k[this.ptr+16>>2]=r;}get_adjusted_ptr(){return k[this.ptr+16>>2]}get_exception_ptr(){var r=Yr(this.get_type());if(r)return k[this.excPtr>>2];var t=this.get_adjusted_ptr();return t!==0?t:this.excPtr}}var mr=0,Ar=(e,r,t)=>{var n=new $r(e);throw n.init(r,t),mr=e,mr},C={isAbs:e=>e.charAt(0)==="/",splitPath:e=>{var r=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return r.exec(e).slice(1)},normalizeArray:(e,r)=>{for(var t=0,n=e.length-1;n>=0;n--){var a=e[n];a==="."?e.splice(n,1):a===".."?(e.splice(n,1),t++):t&&(e.splice(n,1),t--);}if(r)for(;t;t--)e.unshift("..");return e},normalize:e=>{var r=C.isAbs(e),t=e.substr(-1)==="/";return e=C.normalizeArray(e.split("/").filter(n=>!!n),!r).join("/"),!e&&!r&&(e="."),e&&t&&(e+="/"),(r?"/":"")+e},dirname:e=>{var r=C.splitPath(e),t=r[0],n=r[1];return !t&&!n?".":(n&&(n=n.substr(0,n.length-1)),t+n)},basename:e=>{if(e==="/")return "/";e=C.normalize(e),e=e.replace(/\/$/,"");var r=e.lastIndexOf("/");return r===-1?e:e.substr(r+1)},join:(...e)=>C.normalize(e.join("/")),join2:(e,r)=>C.normalize(e+"/"+r)},et=()=>{if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function")return e=>crypto.getRandomValues(e);_e("initRandomDevice");},_r=e=>(_r=et())(e),he={resolve:(...e)=>{for(var r="",t=!1,n=e.length-1;n>=-1&&!t;n--){var a=n>=0?e[n]:o.cwd();if(typeof a!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!a)return "";r=a+"/"+r,t=C.isAbs(a);}return r=C.normalizeArray(r.split("/").filter(i=>!!i),!t).join("/"),(t?"/":"")+r||"."},relative:(e,r)=>{e=he.resolve(e).substr(1),r=he.resolve(r).substr(1);function t(E){for(var G=0;G<E.length&&E[G]==="";G++);for(var x=E.length-1;x>=0&&E[x]==="";x--);return G>x?[]:E.slice(G,x-G+1)}for(var n=t(e.split("/")),a=t(r.split("/")),i=Math.min(n.length,a.length),u=i,l=0;l<i;l++)if(n[l]!==a[l]){u=l;break}for(var v=[],l=u;l<n.length;l++)v.push("..");return v=v.concat(a.slice(u)),v.join("/")}},gr=typeof TextDecoder<"u"?new TextDecoder:void 0,Fe=(e,r,t)=>{for(var n=r+t,a=r;e[a]&&!(a>=n);)++a;if(a-r>16&&e.buffer&&gr)return gr.decode(e.subarray(r,a));for(var i="";r<a;){var u=e[r++];if(!(u&128)){i+=String.fromCharCode(u);continue}var l=e[r++]&63;if((u&224)==192){i+=String.fromCharCode((u&31)<<6|l);continue}var v=e[r++]&63;if((u&240)==224?u=(u&15)<<12|l<<6|v:u=(u&7)<<18|l<<12|v<<6|e[r++]&63,u<65536)i+=String.fromCharCode(u);else {var E=u-65536;i+=String.fromCharCode(55296|E>>10,56320|E&1023);}}return i},er=[],rr=e=>{for(var r=0,t=0;t<e.length;++t){var n=e.charCodeAt(t);n<=127?r++:n<=2047?r+=2:n>=55296&&n<=57343?(r+=4,++t):r+=3;}return r},tr=(e,r,t,n)=>{if(!(n>0))return 0;for(var a=t,i=t+n-1,u=0;u<e.length;++u){var l=e.charCodeAt(u);if(l>=55296&&l<=57343){var v=e.charCodeAt(++u);l=65536+((l&1023)<<10)|v&1023;}if(l<=127){if(t>=i)break;r[t++]=l;}else if(l<=2047){if(t+1>=i)break;r[t++]=192|l>>6,r[t++]=128|l&63;}else if(l<=65535){if(t+2>=i)break;r[t++]=224|l>>12,r[t++]=128|l>>6&63,r[t++]=128|l&63;}else {if(t+3>=i)break;r[t++]=240|l>>18,r[t++]=128|l>>12&63,r[t++]=128|l>>6&63,r[t++]=128|l&63;}}return r[t]=0,t-a};function or(e,r,t){var n=rr(e)+1,a=new Array(n),i=tr(e,a,0,a.length);return r&&(a.length=i),a}var rt=()=>{if(!er.length){var e=null;if(!e)return null;er=or(e,!0);}return er.shift()},Me={ttys:[],init(){},shutdown(){},register(e,r){Me.ttys[e]={input:[],output:[],ops:r},o.registerDevice(e,Me.stream_ops);},stream_ops:{open(e){var r=Me.ttys[e.node.rdev];if(!r)throw new o.ErrnoError(43);e.tty=r,e.seekable=!1;},close(e){e.tty.ops.fsync(e.tty);},fsync(e){e.tty.ops.fsync(e.tty);},read(e,r,t,n,a){if(!e.tty||!e.tty.ops.get_char)throw new o.ErrnoError(60);for(var i=0,u=0;u<n;u++){var l;try{l=e.tty.ops.get_char(e.tty);}catch{throw new o.ErrnoError(29)}if(l===void 0&&i===0)throw new o.ErrnoError(6);if(l==null)break;i++,r[t+u]=l;}return i&&(e.node.timestamp=Date.now()),i},write(e,r,t,n,a){if(!e.tty||!e.tty.ops.put_char)throw new o.ErrnoError(60);try{for(var i=0;i<n;i++)e.tty.ops.put_char(e.tty,r[t+i]);}catch{throw new o.ErrnoError(29)}return n&&(e.node.timestamp=Date.now()),i}},default_tty_ops:{get_char(e){return rt()},put_char(e,r){r===null||r===10?(X(Fe(e.output,0)),e.output=[]):r!=0&&e.output.push(r);},fsync(e){e.output&&e.output.length>0&&(X(Fe(e.output,0)),e.output=[]);},ioctl_tcgets(e){return {c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(e,r,t){return 0},ioctl_tiocgwinsz(e){return [24,80]}},default_tty1_ops:{put_char(e,r){r===null||r===10?(V(Fe(e.output,0)),e.output=[]):r!=0&&e.output.push(r);},fsync(e){e.output&&e.output.length>0&&(V(Fe(e.output,0)),e.output=[]);}}},tt=(e,r)=>(j.fill(0,e,e+r),e),hr=(e,r)=>Math.ceil(e/r)*r,wr=e=>{e=hr(e,65536);var r=Zr(65536,e);return r?tt(r,e):0},D={ops_table:null,mount(e){return D.createNode(null,"/",16895,0)},createNode(e,r,t,n){if(o.isBlkdev(t)||o.isFIFO(t))throw new o.ErrnoError(63);D.ops_table||={dir:{node:{getattr:D.node_ops.getattr,setattr:D.node_ops.setattr,lookup:D.node_ops.lookup,mknod:D.node_ops.mknod,rename:D.node_ops.rename,unlink:D.node_ops.unlink,rmdir:D.node_ops.rmdir,readdir:D.node_ops.readdir,symlink:D.node_ops.symlink},stream:{llseek:D.stream_ops.llseek}},file:{node:{getattr:D.node_ops.getattr,setattr:D.node_ops.setattr},stream:{llseek:D.stream_ops.llseek,read:D.stream_ops.read,write:D.stream_ops.write,allocate:D.stream_ops.allocate,mmap:D.stream_ops.mmap,msync:D.stream_ops.msync}},link:{node:{getattr:D.node_ops.getattr,setattr:D.node_ops.setattr,readlink:D.node_ops.readlink},stream:{}},chrdev:{node:{getattr:D.node_ops.getattr,setattr:D.node_ops.setattr},stream:o.chrdev_stream_ops}};var a=o.createNode(e,r,t,n);return o.isDir(a.mode)?(a.node_ops=D.ops_table.dir.node,a.stream_ops=D.ops_table.dir.stream,a.contents={}):o.isFile(a.mode)?(a.node_ops=D.ops_table.file.node,a.stream_ops=D.ops_table.file.stream,a.usedBytes=0,a.contents=null):o.isLink(a.mode)?(a.node_ops=D.ops_table.link.node,a.stream_ops=D.ops_table.link.stream):o.isChrdev(a.mode)&&(a.node_ops=D.ops_table.chrdev.node,a.stream_ops=D.ops_table.chrdev.stream),a.timestamp=Date.now(),e&&(e.contents[r]=a,e.timestamp=a.timestamp),a},getFileDataAsTypedArray(e){return e.contents?e.contents.subarray?e.contents.subarray(0,e.usedBytes):new Uint8Array(e.contents):new Uint8Array(0)},expandFileStorage(e,r){var t=e.contents?e.contents.length:0;if(!(t>=r)){var n=1048576;r=Math.max(r,t*(t<n?2:1.125)>>>0),t!=0&&(r=Math.max(r,256));var a=e.contents;e.contents=new Uint8Array(r),e.usedBytes>0&&e.contents.set(a.subarray(0,e.usedBytes),0);}},resizeFileStorage(e,r){if(e.usedBytes!=r)if(r==0)e.contents=null,e.usedBytes=0;else {var t=e.contents;e.contents=new Uint8Array(r),t&&e.contents.set(t.subarray(0,Math.min(r,e.usedBytes))),e.usedBytes=r;}},node_ops:{getattr(e){var r={};return r.dev=o.isChrdev(e.mode)?e.id:1,r.ino=e.id,r.mode=e.mode,r.nlink=1,r.uid=0,r.gid=0,r.rdev=e.rdev,o.isDir(e.mode)?r.size=4096:o.isFile(e.mode)?r.size=e.usedBytes:o.isLink(e.mode)?r.size=e.link.length:r.size=0,r.atime=new Date(e.timestamp),r.mtime=new Date(e.timestamp),r.ctime=new Date(e.timestamp),r.blksize=4096,r.blocks=Math.ceil(r.size/r.blksize),r},setattr(e,r){r.mode!==void 0&&(e.mode=r.mode),r.timestamp!==void 0&&(e.timestamp=r.timestamp),r.size!==void 0&&D.resizeFileStorage(e,r.size);},lookup(e,r){throw o.genericErrors[44]},mknod(e,r,t,n){return D.createNode(e,r,t,n)},rename(e,r,t){if(o.isDir(e.mode)){var n;try{n=o.lookupNode(r,t);}catch{}if(n)for(var a in n.contents)throw new o.ErrnoError(55)}delete e.parent.contents[e.name],e.parent.timestamp=Date.now(),e.name=t,r.contents[t]=e,r.timestamp=e.parent.timestamp;},unlink(e,r){delete e.contents[r],e.timestamp=Date.now();},rmdir(e,r){var t=o.lookupNode(e,r);for(var n in t.contents)throw new o.ErrnoError(55);delete e.contents[r],e.timestamp=Date.now();},readdir(e){var r=[".",".."];for(var t of Object.keys(e.contents))r.push(t);return r},symlink(e,r,t){var n=D.createNode(e,r,41471,0);return n.link=t,n},readlink(e){if(!o.isLink(e.mode))throw new o.ErrnoError(28);return e.link}},stream_ops:{read(e,r,t,n,a){var i=e.node.contents;if(a>=e.node.usedBytes)return 0;var u=Math.min(e.node.usedBytes-a,n);if(u>8&&i.subarray)r.set(i.subarray(a,a+u),t);else for(var l=0;l<u;l++)r[t+l]=i[a+l];return u},write(e,r,t,n,a,i){if(r.buffer===w.buffer&&(i=!1),!n)return 0;var u=e.node;if(u.timestamp=Date.now(),r.subarray&&(!u.contents||u.contents.subarray)){if(i)return u.contents=r.subarray(t,t+n),u.usedBytes=n,n;if(u.usedBytes===0&&a===0)return u.contents=r.slice(t,t+n),u.usedBytes=n,n;if(a+n<=u.usedBytes)return u.contents.set(r.subarray(t,t+n),a),n}if(D.expandFileStorage(u,a+n),u.contents.subarray&&r.subarray)u.contents.set(r.subarray(t,t+n),a);else for(var l=0;l<n;l++)u.contents[a+l]=r[t+l];return u.usedBytes=Math.max(u.usedBytes,a+n),n},llseek(e,r,t){var n=r;if(t===1?n+=e.position:t===2&&o.isFile(e.node.mode)&&(n+=e.node.usedBytes),n<0)throw new o.ErrnoError(28);return n},allocate(e,r,t){D.expandFileStorage(e.node,r+t),e.node.usedBytes=Math.max(e.node.usedBytes,r+t);},mmap(e,r,t,n,a){if(!o.isFile(e.node.mode))throw new o.ErrnoError(43);var i,u,l=e.node.contents;if(!(a&2)&&l.buffer===w.buffer)u=!1,i=l.byteOffset;else {if((t>0||t+r<l.length)&&(l.subarray?l=l.subarray(t,t+r):l=Array.prototype.slice.call(l,t,t+r)),u=!0,i=wr(r),!i)throw new o.ErrnoError(48);w.set(l,i);}return {ptr:i,allocated:u}},msync(e,r,t,n,a){return D.stream_ops.write(e,r,0,n,t,!1),0}}},ot=(e,r,t,n)=>{var a=`al ${e}`;z(e).then(i=>{r(new Uint8Array(i)),a&&me();},i=>{if(t)t();else throw `Loading data file "${e}" failed.`}),a&&ce();},nt=(e,r,t,n,a,i)=>{o.createDataFile(e,r,t,n,a,i);},at=[],it=(e,r,t,n)=>{typeof Browser<"u"&&Browser.init();var a=!1;return at.forEach(i=>{a||i.canHandle(r)&&(i.handle(e,r,t,n),a=!0);}),a},st=(e,r,t,n,a,i,u,l,v,E)=>{var G=r?he.resolve(C.join2(e,r)):e;function B(y){function O(te){E?.(),l||nt(e,r,te,n,a,v),i?.(),me();}it(y,G,O,()=>{u?.(),me();})||O(y);}ce(),typeof t=="string"?ot(t,B,u):B(t);},ut=e=>{var r={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},t=r[e];if(typeof t>"u")throw new Error(`Unknown file open mode: ${e}`);return t},nr=(e,r)=>{var t=0;return e&&(t|=365),r&&(t|=146),t},o={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,ErrnoError:class{constructor(e){this.name="ErrnoError",this.errno=e;}},genericErrors:{},filesystems:null,syncFSRequests:0,FSStream:class{constructor(){this.shared={};}get object(){return this.node}set object(e){this.node=e;}get isRead(){return (this.flags&2097155)!==1}get isWrite(){return (this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(e){this.shared.flags=e;}get position(){return this.shared.position}set