From e263d05819bcce1c4452d2af0c68653f20607ef0 Mon Sep 17 00:00:00 2001 From: Phil Ewels Date: Thu, 6 Nov 2025 01:09:41 +0100 Subject: [PATCH] Get @flowfuse/flow-renderer working for examples Cool, but doesn't render custom Seqera nodes well, and UI is a bit basic. --- docs/customisation/flow-renderer.min.js | 2460 +++++++++++++++++ docs/examples/01-simple-launch-monitor.md | 5 + docs/examples/02-launch-on-file-upload.md | 5 + docs/examples/03-auto-resume-on-failure.md | 5 +- .../04-rnaseq-differential-abundance.md | 5 + docs/examples/05-studio-slack-webhook.md | 5 + docs/overrides/main.html | 39 + mkdocs.yml | 1 + 8 files changed, 2524 insertions(+), 1 deletion(-) create mode 100644 docs/customisation/flow-renderer.min.js create mode 100644 docs/overrides/main.html diff --git a/docs/customisation/flow-renderer.min.js b/docs/customisation/flow-renderer.min.js new file mode 100644 index 0000000..e997fbd --- /dev/null +++ b/docs/customisation/flow-renderer.min.js @@ -0,0 +1,2460 @@ +const FlowRenderer = function () { + const t = this || {}, + e = 100, + i = 8e3, + n = 8e3, + M = 13.5, + o = { view: {} }; + (o.view.tools = {}), + (o.utils = {}), + (o.view.gridSize = function () { + return 20; + }), + (o.view.tools.calculateGridSnapOffsets = function (t, e) { + 0; + e = e || { align: "nearest" }; + const i = { x: 0, y: 0 }, + n = o.view.gridSize(), + M = t.x - (n * Math.round((t.x - t.w / 2) / n) + t.w / 2), + A = t.x - (n * Math.round((t.x + t.w / 2) / n) - t.w / 2); + (i.x = A), "right" === e.align || (("left" === e.align || Math.abs(M) < Math.abs(A)) && (i.x = M)); + return (i.y = t.y - n * Math.round(t.y / n)), i; + }), + (o.utils.parseContextKey = function (t, e) { + const i = {}, + n = /^#:\((\S+?)\)::(.*)$/.exec(t); + n ? ((i.store = n[1]), (i.key = n[2])) : ((i.key = t), e && (i.store = e)); + return i; + }); + const A = { + arrows: !1, + gridLines: !0, + zoom: !0, + images: !0, + linkLines: !1, + labels: !0, + autoZoom: !0, + autoScroll: !0, + flowId: void 0, + container: void 0, + document: void 0, + }, + a = { width: 10, height: 10 }, + g = { rx: 3, ry: 3 }, + s = { + junction: { width: 10, height: 10 }, + "link in": { width: 30, height: 30 }, + "link out": { width: 30, height: 30 }, + subflow: { width: 40, height: 40 }, + _default: { width: 100, height: 30 }, + _default_no_label: { width: 30, height: 30 }, + }, + r = { + batch: "batch.svg", + catch: "alert.svg", + change: "swap.svg", + complete: "alert.svg", + rbe: "rbe.png", + comment: "comment.svg", + csv: "parser-csv.svg", + debug: "debug.svg", + delay: "timer.svg", + exec: "cog.svg", + feedparse: "parser-xml.svg", + file: "file-out.svg", + "file in": "file-in.svg", + function: "function.svg", + "http response": "white-globe.svg", + "http in": "white-globe.svg", + "http request": "white-globe.svg", + inject: "inject.svg", + join: "join.svg", + json: "parser-json.svg", + "link in": "link-out.svg", + "link out": "link-out.svg", + "link outlink": "link-out.svg", + "link outreturn": "link-return.svg", + "link call": "link-call.svg", + xml: "parser-xml.svg", + yaml: "parser-yaml.svg", + "mqtt in": "bridge.svg", + "mqtt out": "bridge.svg", + "tcp in": "bridge.svg", + "tcp out": "bridge.svg", + "tcp request": "bridge.svg", + "udp in": "bridge.svg", + "udp out": "bridge.svg", + markdown: "parser-markdown.png", + postgresql: "db.svg", + range: "range.svg", + sort: "sort.svg", + split: "split.svg", + subflow: "subflow.svg", + switch: "switch.svg", + template: "template.svg", + trigger: "trigger.svg", + ui_button: "ui_button.png", + ui_template: "ui_template.png", + ui_toast: "ui_toast.png", + ui_audio: "feed.svg", + ui_chart: "ui_chart.png", + ui_colour_picker: "ui_colour_picker.png", + ui_date_picker: "ui_date_picker.png", + ui_dropdown: "ui_dropdown.png", + ui_form: "ui_form.png", + ui_gauge: "ui_gauge.png", + ui_numeric: "ui_numeric.png", + ui_slider: "ui_slider.png", + ui_switch: "ui_switch.png", + ui_text: "ui_text.png", + ui_text_input: "ui_text.png", + "ui-button": "ui_button.png", + "ui-button-group": "ui_button.png", + "ui-chart": "ui_chart.png", + "ui-dropdown": "ui_dropdown.png", + "ui-form": "ui_form.png", + "ui-gauge": "ui_gauge.png", + "ui-markdown": "ui_text.png", + "ui-slider": "ui_slider.png", + "ui-switch": "ui_switch.png", + "ui-template": "ui_template.png", + "ui-text": "ui_text.png", + "ui-text-input": "ui_text.png", + "websocket in": "white-globe.svg", + "websocket out": "white-globe.svg", + Thought: "alert.svg", + Idea: "light.svg", + cronplus: "timer.svg", + "i2c scan": "serial.svg", + "i2c in": "serial.svg", + "i2c out": "serial.svg", + "jimp-image": "image.png", + "image viewer": "watch.svg", + "annotate-image": "image.png", + "MC Read": "plc-read.png", + "MC Write": "plc-write.png", + "FINS Read": "plc-read.png", + "FINS Write": "plc-write.png", + "FINS Read Multiple": "plc-read.png", + "FINS Fill": "plc-write.png", + "FINS Transfer": "plc-write.png", + "FINS Control": "plc-read.png", + "s7comm read": "arrow-in.svg", + "s7comm write": "arrow-in.svg", + "project link out": "ff-logo.svg", + "project link in": "ff-logo.svg", + "project link call": "ff-logo.svg", + "ff-mqtt-in": "ff-logo.svg", + "ff-mqtt-out": "ff-logo.svg", + "tables-query": "ff-logo-red.svg", + "mcp-tool": "function.svg", + "mcp-resource": "file.svg", + "mcp-prompt": "template.svg", + "mcp-response": "arrow-in.svg", + "advanced-ai": "advanced-ai-node.svg", + "image-classification": "classification-node.svg", + "image-depth": "depth-estimation-node.svg", + "object-detection": "object-detection-node.svg", + }, + d = { + "alert.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjE2Ljc0IC00MTUuMDQpIHNjYWxlKC42MjE0MykiIGZpbGw9IiNmZmYiPjxwYXRoIGQ9Ik0zNzEuMyA2ODMuOTdsMS42MS0xLjYxSDM4OWwxLjYxIDEuNjEtMy4yMTkgNDAuMjMtMy4yMTggMy4yMThoLTYuNDM3bC0zLjIxOS0zLjIxOHoiLz48cmVjdCB4PSIzNzIuOTEiIHk9IjczNS40NyIgd2lkdGg9IjE2LjA5MiIgaGVpZ2h0PSIxNi4wOTIiIHJ5PSIzLjAxNyIgY29sb3I9IiMwMDAiLz48L2c+PC9zdmc+Cg==", + "arduino.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAG7AAABuwBHnU4NQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHYSURBVEiJ7ZTBq4xRGMZ/77kzC6XuWN26V8qNdAsbyoI/AvU5u7tB3SihZMGClIVSlhSShb4zN5uxoGYplMWNbCjlkjuUmjKjKXdm3sfCN2NY6i6keVbnvOf0e9/zPuccy/OctVRYU9oYOAb+r8DSkBzCRJZlR4EzwCzSquChmZ1NKb0BiDEacA2YByrAV+BWs9m8WK/XWwDkeY6k0O/3b+qXGpJ6kuTuS5ImJVm/3z8/2ODuDZe+F+NXkibzPB8e+VAI4TDwGdifUpput9tTwFUz2wEsuvuJEMIl4BEwV61Wpw3mJD0xs+3AjdEKL0j6Jmmm+H0MsGLt1EjlL4rYlKT3q9LuYv5ckkYrBOimlFayLDsuySV5jHErcAfoShJwJcZYAR4Dm8pwEsDdnw69GAFOxBg3hBDuApuBWWDZ3SNQMjMDFoBWt9vNJDV6vd7twtBdfwI/AOv1sw9bUkrLwCdgPoSwACwBi8A+4HS5XG6a2cFSqfQuxnhZ0h7g2W8uS3owMFDSS0mdQd8kzRQ34XoR60p67e5fCpffdjqdjcMeppQcOODu54AWsBNYV2Q9klJaSSl5COGYu98DHNhmZhVJ981sb61W+8jAybXUv/+Wx8Ax8C/0A+UBSZXw25H1AAAAAElFTkSuQmCC", + "arrow-in.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTggNXYxMkg3djI2aDExdjEybDE0LTI1eiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPgo=", + "batch.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii42MTIiPjxwYXRoIGQ9Ik0zNC4wMDEgMjcuOTg3bC00IC4wMDR2My45OTdsNC0uMDFNNDAuMDAxIDI3Ljk4N2wtNCAuMDA0djMuOTk3bDQtLjAxTTI2LjAwMSAyOS45ODdsLTctNy45ODZ2MTUuOTg2TTM0LjAwMSAxMy45ODdsLTQgLjAwNHYzLjk5N2w0LS4wMU00MC4wMDEgMTMuOTg3bC00IC4wMDR2My45OTdsNC0uMDFNMzQuMDAxIDQxLjk4OGwtNCAuMDAzdjMuOTk3bDQtLjAxTTQwLjAwMSA0MS45ODhsLTQgLjAwM3YzLjk5N2w0LS4wMU04LjAwMSAyNy45ODdsLTQgLjAwNHYzLjk5N2w0LS4wMU0xNC4wMDEgMjcuOTg3bC00IC4wMDR2My45OTdsNC0uMDFNOC4wMDEgMTkuOTg3bC00IC4wMDR2My45OTdsNC0uMDFNMTQuMDAxIDE5Ljk4N2wtNCAuMDA0djMuOTk3bDQtLjAxTTguMDAxIDM1Ljk4N2wtNCAuMDA0djMuOTk3bDQtLjAxTTE0LjAwMSAzNS45ODdsLTQgLjAwNHYzLjk5N2w0LS4wMSIvPjwvZz48L3N2Zz4K", + "bluetooth.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAuCAQAAADjedMPAAAAAXNSR0IArs4c6QAAAAJiS0dEAACqjSMyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gYEFSkDI2AawgAACLlJREFUSMeNVm1wFeUZPe/H7t7szZIbAkRirsqtCtGEBEQjesGULymKBiLCVYRq60csHWvb0Tqj/Zg60zpjp2WKf0oLgiiCtFhERSUSmPIRQhC4EQU0FZIKwcSb5JLN3bv7vk9/LNQ6g9Pun3d3Z8+zZ87zPGcOuySCi1weinjCO8grWVzC7HQ/VxnDutiH4Bd9C43r3HJrW/VTkzb4Rh4oE8VqCN7/W8BDoSoqaQ2+iM9+a091jwDixUnDBy5S4hsYjNLHs11q1CAvqt79i6tM1ZnZ7F1nDCpTef+7gAehIFpV0vIZYJnj9z5VW6Wm2Ifcb7EyVmkEX+Mhv4JZ509AiRv9QvscjABgsMzpbw6bPuNwtWDWEZ/lytGFQRECrZCBB8UNcB+QQdxw/V/6+2Pl6kCOBAAwIDbp/c2Tanzy5vBKFmMTItXa5DUG0K+Eywq4oyN+rd/F63Wxsq0Jkf2209cLi9VfWr6UwEDgkcsWWjs/6P3YP6FW6Ga6Uo8PpFEouOKPBlk12e41ovYtzn7rqGmpDYNlQ0M28CUxA8QAcBCkM2XHM2Pr1EJnAQM+4a8YEPtyM31+yHgo0p2t0h3B1mxBUIJtfp1+SxsukPQzEowAqCwARMxJ78+ftCFbLuIyzat0d/ahyCGDL1Cr3FCQGVa1fDr4rT7Iq3S51Qtt2woaAA48MHQMIAin7r13J4yxusR4A5BY5S5Q/DnU2L59WCXkDv9us+D518SU4SNlazDCas2fszVnRMBAutZPA4B0anb/qGq/S95h5ds19nNAo4gZSbPCTJobSt0PSZ9+rQExYxlrQCrWMp2IiKjl2yl7eZmXDp/8ge21jqgwk2bMaBRImklzGYsZFWb/Pk1EmjJrUqZlNoqkeb6AbplVYSbN5WX5I5o0Ka0yeyfFjGUsaSZNvoc+kyv5/GE19tFHqR9gFFuyYvUN1joATAMaYD77nLcRurPtDABjymR6/rCV/DO5h+Q8f5RuFifyh9zY4cFbp21DjGH4PRvNJ5cCFI4RDDWNR3hq5fAUwIj6d83+y8ddIiHqvLMKc5wGLLFLjZR9hT3afvcmlSEirenklgJj3wwiIk1vzG1A75rwXmc23dqAokipscRuwByHt+Wi9qA7zegMJuBKsfHoXxfofjDgsrldL+ZNQIOhUL3wavESAoH635j/hx1Ru9afZgy6Ubsth208ZSbNCnNWiSmSZirmiH013mD4t3ynJtKaQvFIBwN7J05xro40IOxCytzG+THWibg8yX/dZyEuxw78DPPT22dTP4FBlDOAAaKKAaD+trr6NHnjI1PFZc5JHpedOMZElPJ2k/qNv84abqWpB5/w4QW7zlRuLVtEkdAsGBgI1N90288//Z27i4/JbRIVg9+jF/hl5tmcgBmRNe7fCj70Rhk351iQxuTIzqGjZ8a+F7+bWWAAAAqGdsx+7EAkfyw4JbJ8CFXWWjl1KGudBC8BeVNFeVBjr3VPO91mQmzI3mG04okj+2cSAxQIxD5INrTUyCrVbXYpZo2wdvrlwVRBXkloKG0WUOk+7oi+ExSX86zNXtSIy6t+CAACDIzKnpkcKxlqFsDt1u5cuTipQxQg6qwZ/m4k5EY1TB3iyZFv9x/n49nVBStWjrwXIDACI1ZUcfulm7Ye5Muoq6god1DdbhTzjmCBypmIGctF0kyaZSJppmxHJM0GNIqzL58fm/AgIk09r5YaMcMRS+xwAZPmchEzxCTZGwyKhBxnN+Wulcf5meC49ebq4fey84NMCE0FKLhm6TWntrTTteIYSiMJltG9QVQiZjSKJXbMiBn1MUdMcRrFl+vC8VHn9j0bbmPTs9SjiUhR78vLxTSRcpJmzAiZ8EqWFh3BaDZRN2Wjxhj1q7WxexnA0Hegju8KByHa3HQb+gCO4nsWv+TbN7rdNJp1BGlRyXiXXKCA62VezBpxpf79n0beAxB0f+vMnxzRmkAEAL/8oHWazmowFKc2r3zd/gLXS2CB6pJI2TFjbukssVw4IrOWSBNpNbC9tsKc47w9N5SxZVaBMc/eN1H3EREp6l/TKGaJuaUxI2Xzd8TCSGHWFR/jn6uL7gMAPbB/2vfTJWjLFQ8BDCCoekMX3N/eslJDg8NZvOR+VxRmF0beEfLv7i38JjZSNqPlyGwAgds8Z/WRGrvJA3ImgwZnjHUGI9TqRbU/DU2mb8Pzb42UncEef6fmc3lUVykHNcVPLt/+Y9Z78JaPWjpR3m/z6Y41BHBonHFO0OMLb1gTtrN7083fxecOqlRUz+UypYG0KHWz+bx88c+n3nisa6IAOgoLVI/LDYAAGjmw8aGpKwCA0LM+9fAYK6PgdpiLFTQfJ1YBiNo76awahYdPLvWrFHC5OxkJCaUB4uyKR6auIGgAfS+tv++Md7l7J6I2sArjhOh0zuVnUqFlGuOsT3Nx9hH/B13Cz/KE969IXXn5fYyBoteGUSKz9sGlrYXD5GndG5RGRuQ/xCeFfGqWG+vQlY2rHhcASlAtAGANH/A8QaGPgwHoXzuzcZQg7/KhNuo227w+S/C6vHyRR1BsKbPDBYCEBDqCMHLEbRMMFzZyYO3kB0+TK+L6FEliNnld4jvBFs2LhKl69Z5cCOoILsBfo043H8JBLPPS9MbT9AQbYe2lvFiMQ+6QbHHf4+fAASYksqqdgPawT0hIYJEwFYFAADLrG35wgzeavW2lc/Osp4P1vFac9KOGhBVmJAsQpIBKlpAXGEyI7M1ZAQPQ+3L9A3GZFnG9112MNXpgGAbbOM5nqv+kNCbaKSE7gnYKVTiaqzc8CWReqX+AWTd6jgyoWtxJsyJNOSksWF+PeRYAJTqCkAUA3GVs9Sz64pWxjyTkXe7rdrPfiiq1SPS4UPK/Yh77Kit7IFXJLqgQ9Y7GHpUbu0eJdnuMGnS7TWaRl5Bb/Ij4xqCpREICVapKDZhpobJ/zETtZpHOAd0mQN4w6x3/DuPrsfTf18syu360MqUAAAAASUVORK5CYII=", + "bridge-dash.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTkuOTI0IDYuNjFjNC4zNzIgNS40MzMgNy4xODIgMTMuODkzIDcuMTgyIDIzLjM5NyAwIDkuNDkzLTIuODA0IDE3Ljk0Ni03LjE2NyAyMy4zNzltLTQuMjk0LTM4LjM5YzUuNjQ1IDkuNDE3IDcuMTcyIDIwLjk0NC4wMjQgMjkuOTkzbS00LjM2LTIxLjY2MWMxLjMzOCAxLjQ1OSAyLjIxNSAzLjkwNiAyLjIxNSA2LjY4IDAgMi41NzEtLjc1NSA0Ljg2My0xLjkzMSA2LjM0NiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmIiBzdHJva2UtZGFzaGFycmF5PSIxNC4wOTYsIDMuNTI0IiBzdHJva2Utd2lkdGg9IjMuNTI0Ii8+PC9zdmc+Cg==", + "bridge.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTkuOTI0IDYuNjFjNC4zNzIgNS40MzMgNy4xODIgMTMuODkzIDcuMTgyIDIzLjM5NyAwIDkuNDkzLTIuODA0IDE3Ljk0Ni03LjE2NyAyMy4zNzltLTQuMjk0LTM4LjM5YzUuNjQ1IDkuNDE3IDcuMTcyIDIwLjk0NC4wMjQgMjkuOTkzbS00LjM2LTIxLjY2MWMxLjMzOCAxLjQ1OSAyLjIxNSAzLjkwNiAyLjIxNSA2LjY4IDAgMi41NzEtLjc1NSA0Ljg2My0xLjkzMSA2LjM0NiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjMuMjI0Ii8+PC9zdmc+", + "cog.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMjAgMTJhMTggMTggMCAwIDAtMy40OTQuMzZsLTEuNDI4IDUuNzE1LTUuMDYtMy4wMzZhMTggMTggMCAwIDAtNC45NDYgNC45MTdsMy4wNDUgNS4wNzgtNS43NjUgMS40NDJBMTggMTggMCAwIDAgMiAzMGExOCAxOCAwIDAgMCAuMzQ1IDMuNDM0bDUuNzc1IDEuNDQ0LTMuMDcyIDUuMTJhMTggMTggMCAwIDAgNC44OTMgNC45MjRsNS4xMzctMy4wODMgMS40NTUgNS44MkExOCAxOCAwIDAgMCAyMCA0OGExOCAxOCAwIDAgMCAzLjQ3LS4zNTNsMS40NTItNS44MDcgNS4xMjggMy4wNzZhMTggMTggMCAwIDAgNC45MDUtNC45MTNsLTMuMDc0LTUuMTI0IDUuNzgzLTEuNDQ2QTE4IDE4IDAgMCAwIDM4IDMwYTE4IDE4IDAgMCAwLS4zNjctMy41MjlsLTUuNzUtMS40MzcgMy4wNDEtNS4wNjlhMTggMTggMCAwIDAtNC45MzctNC45MjhsLTUuMDY1IDMuMDM4LTEuNDMzLTUuNzI4QTE4IDE4IDAgMCAwIDIwIDEyem0wIDlhOSA5IDAgMCAxIDkgOSA5IDkgMCAwIDEtOSA5IDkgOSAwIDAgMS05LTkgOSA5IDAgMCAxIDktOXoiIGNvbG9yPSIjMDAwIiBmaWxsPSIjZmZmIiBvcGFjaXR5PSIuOTgiIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiLz48L3N2Zz4K", + "comment.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMzYuMTkgMjguNmMwIDYuMDg4LTcuMjg5IDExLjAyNC0xNi4yOCAxMS4wMjRhMjMuOTggMjMuOTggMCAwIDEtMi45ODItLjE4NWMtMS4yNzItLjE1OS03LjkzMyA3LjUyNi0xMy4xMTMgNi41My4xOC0yLjAwNCA4LjE4LTYuMDA0IDUuODctOC43OUM1Ljk5MyAzNS4xNiAzLjYzIDMyLjA2NiAzLjYzIDI4LjZjMC02LjA4OCA3LjI4OS0xMS4wMjQgMTYuMjgtMTEuMDI0IDguOTkxIDAgMTYuMjggNC45MzYgMTYuMjggMTEuMDI0eiIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjYmFiYWJhIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMS41IiBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIi8+PC9zdmc+Cg==", + "db.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzU1IC03MDQuMzYpIj48ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCgxLjI4NjggMCAwIDEuOTI2MyAtNjQuNDQ0IC02MDcuNTYpIiBjeD0iMzQxLjI1IiBjeT0iNjg4LjYxIiByeD0iOS44NCIgcnk9IjMuMjUiIGNvbG9yPSIjMDAwIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTM4Ny4zMiA3NTAuNDhjMCAxLjk0OS01LjY2OSA1Ljg3OS0xMi42NjIgNS44NzlzLTEyLjY2Mi0zLjkzLTEyLjY2Mi01Ljg3OXYtMjcuMDQzYzAgMS45NDkgNS42NjkgNi4yNDIgMTIuNjYyIDYuMjQyczEyLjY2Mi00LjI5MyAxMi42NjItNi4yNDJ2MjcuMDQzIiBjb2xvcj0iIzAwMCIgZmlsbD0iI2ZmZiIvPjwvZz48L3N2Zz4K", + "debug.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTAuMDA0IDE0LjQ5OWgyME0xMC4wMDQgNDYuNTAzaDIwTTEwLjAwNCAyMi41aDIwTTEwLjAwNCAzMC41MDFoMjBNMTAuMDA0IDM4LjUwMmgyMCIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjIuOTk5NzAwMDAwMDAwMDAwMyIvPjwvc3ZnPgo=", + "envelope.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMjAgMzIuOTZsLTE4LTE4aDM2eiIvPjxwYXRoIGQ9Ik0yIDIwLjM2bDE4IDE4IDE4LTE4djI2LjFIMnoiLz48L2c+PC9zdmc+Cg==", + "feed.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjYjg1YzVjIiBzdHJva2U9IiMwMDAiPjxwYXRoIGNvbG9yPSIjMDAwIiBkPSJNLS4wMS0uMDA0aDM5Ljk5OHY2MEgtLjAxeiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJub25lIi8+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQ1MC4yNjYgLTU4NS4zNykiPjxyZWN0IHg9IjQ2NC4yNyIgeT0iNjI1LjM3IiB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHJ5PSIyLjQiIGNvbG9yPSIjMDAwIiBmaWxsPSIjZmZmIiBzdHJva2U9Im5vbmUiLz48ZyBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iNCI+PHBhdGggZD0iTTQ2MS4yNyA2MTguODdsNS41LTIuNWg3bDUuNSAyLjVNNDU5LjI3IDYwOC44N2w1LjUtMi41aDExbDUuNSAyLjVNNDU3LjI3IDU5OC44N2w1LjUtMi41aDE1bDUuNSAyLjUiLz48L2c+PC9nPjwvZz48L3N2Zz4=", + "file-in.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBjb2xvcj0iIzAwMCIgZmlsbD0ibm9uZSIgZD0iTTAtLjA0aDQwdjYwSDB6Ii8+PGcgZmlsbD0iI2ZmZiI+PHBhdGggZD0iTTUgOS45NmgxNHYxNmg5djdIMTh2MTBoMTB2N0g1eiIvPjxwYXRoIGQ9Ik0yMiA5Ljk2bDEzIDEzSDIyeiIvPjxwYXRoIGQ9Ik0yOCAyNS45Nmg3djZsNSA2LTQuOTg3IDYtLjAxMyA2aC03bDEwLTEyeiIgZmlsbC1ydWxlPSJldmVub2RkIi8+PC9nPjwvc3ZnPg==", + "file-out.svg": + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0MCIgaGVpZ2h0PSI2MCIgdmlld0JveD0iMCwgMCwgNDAsIDYwIj48cGF0aCBjb2xvcj0iIzAwMCIgZmlsbD0ibm9uZSIgZD0iTTAtLjA0aDQwdjYwSDB6Ii8+PGcgZmlsbD0iI2ZmZiI+PHBhdGggZD0iTTUgOS45NmgxNHYxNmgxNnYyNEg1di03aDV2N2wxMC0xMi0xMC0xMnY3SDV6Ii8+PHBhdGggZD0iTTIyIDkuOTZsMTMgMTNIMjJ6Ii8+PC9nPjxwYXRoIGQ9Ik01IDMwLjk2SDB2MTRoNXYtMkgydi0xMGgzeiIgZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIi8+PHNjcmlwdCB4bWxucz0iIi8+PC9zdmc+", + "file.svg": + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0MCIgaGVpZ2h0PSI2MCIgdmlld0JveD0iMCwgMCwgNDAsIDYwIj48ZyBmaWxsPSIjZmZmIj48cGF0aCBkPSJNNSAxMGgxNHYxNmgxNnYyNEg1eiIvPjxwYXRoIGQ9Ik0yMiAxMGwxMyAxM0gyMnoiLz48L2c+PHNjcmlwdCB4bWxucz0iIi8+PC9zdmc+", + "function.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMzAuOTk5IDMxLjAwNXYtM2gtNi43NjJzLjgxMi0xMi4zOTcgMS4xNjItMTQgLjU5Ny0zLjM1IDIuNjI4LTMuMTAzIDEuOTcxIDMuMTAzIDEuOTcxIDMuMTAzbDQuODYyLS4wMTZzLS43ODMtMy45ODQtMi43ODMtNS45ODQtNy45NDYtMS43LTkuNjMzLjAzYy0xLjY4NyAxLjczLTIuMzAyIDUuMDY1LTIuNTk3IDYuNDIyLS41ODggNC41LS44NTQgOS4wMjctMS4yNDggMTMuNTQ3aC04LjZ2M0gxOC4xcy0uODEyIDEyLjM5OC0xLjE2MiAxNC0uNTk3IDMuMzUtMi42MjggMy4xMDMtMS45NzItMy4xMDItMS45NzItMy4xMDJsLTQuODYyLjAxNXMuNzgzIDMuOTg1IDIuNzgzIDUuOTg1YzIgMiA3Ljk0NiAxLjY5OSA5LjYzNC0uMDMxIDEuNjg3LTEuNzMgMi4zMDItNS4wNjUgMi41OTctNi40MjIuNTg3LTQuNS44NTQtOS4wMjcgMS4yNDgtMTMuNTQ3eiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPgo=", + "hash.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii44NTciPjxwYXRoIGQ9Ik0xNy45OTcgOC45OThsLTUuOTcyLjA3Mi00LjAyOCA0My45MjggNS45MTQuMDcyeiIvPjxwYXRoIGQ9Ik02IDE2Ljk5OWwtMSA2IDMxIDEgMS02eiIvPjxwYXRoIGQ9Ik0zMS45OTYgOC45OThsLTUuOTcxLjA3Mi00LjAyOSA0My45MjggNS45MTQuMDcyeiIvPjxwYXRoIGQ9Ik0zLjk5OCAzNy4wMDRsLTEgNiAzMSAxIDEtNnoiLz48L2c+PC9zdmc+Cg==", + "image.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAYAAAAe2bNZAAACQ0lEQVR4AeyWyys9YRjHz5zfxSXksrKR3JYkKZGF2ChKysIfIEsLLFwWNqws7FiwoZTCRlZSyjVlZ0GKlGxdshKOz8OcSe953zNzZGbOgr4f7zzPe3m+533nzJxoJI3+0s9MLBZbg7A1EsXBH06qG0Qt/AuaeO1xOSYLAx+yLGsnaCi8AaJsMSMXvsHO50MJ/HUr4qsZDExj4A6u4YG4ltYo38xQuJOqgxBXNhfH5LNotfLNDNX6QZUcVbWajMd+mrmNF1HaRyV2wpTNsM2TIJ/QWcRwMaHJn5A7A61SMoOJSlYZhUVIKh4RsjNlDNqDJ5CbuZF8jGutPJvBiMUKqyDqJdbdE9LnQOEraIZcGIZnp1Nz4dkMc9vh6803h6Eacj8mT2Yo+o+KK6DqgL48NekWM8eCUnWcJzNMGoIcUCXPjl0Wlveb2qeN7bHywdrUAa5mmFzIpCkwSY5u1tT5Nc9amcSH0AMJcjXDjAVwUx+FepMNor+I/kuoB62SmmEB+dRd2pmJyWXGy1c/oYd8FckbKAajjGZYQL7K68aZ+g5598h95PSyjtwb5yTkiGjMMpphipxrOW0qymfwNgYqbAaIt8CTtGZYKIPZS/AdNTDpwmaG1rO0Zpg9Bv8hUJnMtAbqwi5mMmN3B9v8mjHtt3ZneNU3gd+aV01pzaiDgorFzGsk8lmO58t+0FD5CEQXUc5CfgZ2SASNIVBHzTfolp2JYGiTQJ66BbRhkIGH0w8zGBBDzyTuQ+JFPDhmJAibtDLzDgAA///iRoiIAAAABklEQVQDAPQ90lai088BAAAAAElFTkSuQmCC", + "inject.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTggNXYxMkg3djloMTV2LTdsNiAxMS02IDEydi04SDd2OWgxMXYxMmwxNC0yNXoiIGZpbGw9IiNmZmYiLz48L3N2Zz4K", + "join.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNDAuMDAxIDM5Ljk5bC0uMDMyLTE5Ljk1NS0xMS45NjcuMDE3djE5Ljk4M2wxMi0uMDQ2TTguMDAxIDI4LjAyN2wtNCAuMDA0djMuOTk3bDQtLjAxTTE0LjAwMSAyOC4wMjdsLTQgLjAwNHYzLjk5N2w0LS4wMU0yNS4wMDEgMzAuMDI3bC03LTcuOTg2djE1Ljk4Nk04LjAwMSAyMC4wMjdsLTQgLjAwNHYzLjk5Nmw0LS4wMU0xNC4wMDEgMjAuMDI3bC00IC4wMDR2My45OTZsNC0uMDFNOC4wMDEgMzYuMDI3bC00IC4wMDR2My45OTdsNC0uMDFNMTQuMDAxIDM2LjAyN2wtNCAuMDA0djMuOTk3bDQtLjAxIiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii42MTIiLz48L3N2Zz4K", + "leveldb.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAyCAYAAADWU2JnAAAAAXNSR0IArs4c6QAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAALEwAACxMBAJqcGAAABh9JREFUWMPtWFtsXNUVXfuO52XjJ8GxMRBI0oAhgBJCCI9IpSppRVErVKmI9wdCQiAM4qGqjUDqRyWQEI+qIPGQ+KiUFEFLAAFVixCRGqUBSoIDcV6O7Tjx+BHb4xnP3OfZqx9jx46ZO34wjoSa/Xnu3eeus886a+17gDNxJn7AIfNNOLiDF5x3ORoDDyuqz0b9qU8pJOi70t+5k3su/YkcBUTLAmYFGNnZhfVi4ed1zXiyIspk4GM4UiFpEZrAQzsARqLw1SBCFUuEzSZAsiKOczVAM0SQG+FfIXh75Ci+WH611Tuv1R/exab0AF9z80oTcE/Xbn3QGN680PJnhvQ3gc9/kqQzrnuzJ/jTWZNIWnZWHyPJ3Kj+tpx8ICkA4Lt6rzHakxvVd0lNhiY4Od5nAu0DgIFBlcUka+9ePum77C6BXrn/EzbNd2Inx3+pkvk03yH5up3h6t0fal3qgFaWylOjB3Z/pK1hpeTAET6x0NXms/pI4LFflSSVpNIYsnMXX9r/b2480cOLssOs3gSV0RS3GKOvknwotDK+p1s8m0z3c2M+o9GFAnPz+r4qnQKwQqhSCyALYANfX1HVByZzrCKnXaIJoKYR25PV8FQ51L2bvyI11rmLFnVuXIpXWr+0LEnkRvC4GnqFmSGl1KQiVIAmEkWw5IIruY0ELrqaVMLYGR5S5XsjvdjbcpmsfOMB/u3mR9Ha0orVGsDyXNkUT+IqCCMAISKygOOn9D1uZcnQ0LHpXCn+3qk5qvonz9aHZ63M/ERbJqu5EIeRopxxsuJbFmOnwxRP9OC4iESmj1kzj7abQ4oEy/95YnJekqxdij6AVigYANGnNqDNHsNHhaTygHKyuGmsX1oHj/DGvg48AeBtUO4EJB4uWmN60u7dHJebgH/0HOanCKqzsbIoUZ2sriuqwKpvera2FSVwJDpFpniVHAGwGcDm7v+yuaaRl0pEliWrcVfgM1lVLxsATvCP0xYkXjSBvBp8nU7hPRrp1IDfhHM3pPjGKPNjfH6wawrt3EKlr0Mb5vq2neG9To6dpL48vTLF7GArSfquOr7DLaMp3lgO3oyPcO3IMf4+8Dk8seWTOtNWQmcKO1URkziA2+uacLubZ8aKYB+AHc44D8Ur0dH9pfSt2iiHZ2YHnl5LlWjgAZEof2ECWUnl6mQNVlXVF05SmBbNSfRiSdQA2EDymrMaCtL2oxsAkiA500YAEBUT5yQ6QyhLWcO8FLjYRAuxnbD4rmsL5XQocGEREg7GswXZQdm/OAo8/aCAXp7HRRBuB8Yn7TT+TGUai4aH0IDqZPEzAJUlt6nlMjnhHZOlvisfTgIqZ6WcLLa/sxnVtU3WtzPJP9MOzMyxoW7eRmW3qo4GntrTrKFIzzLzmVKVaTV6JPD12e/aAcPtIJaE9cXfed2y9fi68TzJAcA5F8pbAN46uZUB173waziPb5Mfj/VzSeAyPu3vFg3LeFxErPtr+eYbGStbVACzjI904R6RQjs6S6entDP6wWgXz2pF+f6fSE2mU3wsTIGtMANLVMsttcuY3UeoMZpW5dPtH2tssIsRNYyU+qgJNOK7jJIa7dmjt3o2P5tQ3nzNUjz3vXvgiZVMthFKPWXoZFCnmmCdaorD5pvNm0qJ1PSG9xSRL5UjIX8fABA/2o4Ds2zT6QkTSLBiPZaHgBE4GX6+2CBI0BnH6yBb0/1oLwomN8I/kFjb286nFhMIQHuoC+8SsrG+2dpRognSTz1btx/v4CW+q3mWKQpsVo7189bsMH9XuBTQVbNd6sRSB/W+CfXc+vGLer6b021Tijr/ptwEmkqnuO7T17hJVXs9R7vtLBvmfKeXHdaWwMVdlfV4JpaQg0M9fL+2EUP5Meyra5I78mk0VCS4JpZA42Rj7dkYjSZQnxnEC91fyT/6DyO96jquOf9y3G1FcH3gyc7cGNsamq0vF3zbOdCpa+pb0AZirYhcQXA0GsfQQCcOnXMh4ibAgBXBEt8VJ1GF5cZnQyQqLQChBp9A8Bd3HP+prLUOlvXqFQDWgJWf27g48LnSd2GpL1ZtM+qOfcuOqgbJ1zfTEbHaz9xsn4n/q/gfqTGjd49vU6gAAAAASUVORK5CYII=", + "light.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyB0cmFuc2Zvcm09Im1hdHJpeCguNzg3MzcgMCAwIC43ODc5MyAtMjcxLjI5NCAtNTI5Ljk5KSIgc3Ryb2tlPSIjZmZmIiBmaWxsPSJub25lIj48ZWxsaXBzZSB0cmFuc2Zvcm09Im1hdHJpeCgxLjQ5MjQgMCAwIDEuNDYxNiAtNTkuNDkxIC0zNDMuNDYpIiBjeD0iMjg3Ljc1IiBjeT0iNzE1Ljg2IiByeD0iMTAuNzUiIHJ5PSIxMiIgY29sb3I9IiMwMDAiIHN0cm9rZS13aWR0aD0iNC4wNzEiLz48cGF0aCBkPSJNMzYyLjUgNzE3Ljg2djE1LjVjNi4zNzEgMi4xMjggOC43MTIgMi4wMDMgMTUgMHYtMTUuNSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1LjAxIi8+PHBhdGggZD0iTTM2Ni41IDcxNy44NmwxLTEyaDVsMSAxMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjMuMDA2Ii8+PC9nPjwvc3ZnPgo=", + "link-call.svg": + "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLSBDcmVhdGVkIHdpdGggSW5rc2NhcGUgKGh0dHA6Ly93d3cuaW5rc2NhcGUub3JnLykgLS0+Cjxzdmcgd2lkdGg9IjEwLjU4M21tIiBoZWlnaHQ9IjE1Ljg3NW1tIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCAxMC41ODMgMTUuODc1IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogPHBhdGggZD0ibTguMjAyMSAyLjM4MTItNC44OTIyIDAuNTM2MTIgMS42MDQgMC45MjYwNC0xLjAzOTUgMS44MDA0YzAuNzM3MTktMC4zNzQwMiAxLjY0MzctMC4zODIyNyAyLjQwOTUgMC4wNTk4OTIgMC43NjUxMSAwLjQ0MTc0IDEuMjExOCAxLjIzMDEgMS4yNTc3IDIuMDU1bDEuMDM4NC0xLjc5ODYgMS42MDQgMC45MjYwNHptLTIuMzgxMyA0LjEyNDRjLTAuNzcwMTYtMC40NDQ2NS0xLjc0MDItMC4xODQ3NC0yLjE4NDggMC41ODU0Mi0wLjQ0NDY1IDAuNzcwMTYtMC4xODUgMS43NDA2IDAuNTg1MTYgMi4xODUzIDAuNzcwMTYgMC40NDQ2NSAxLjc0MjIgMC4xODUzMyAyLjE4NjktMC41ODQ4MyAwLjQ0NDY1LTAuNzcwMTYgMC4xODI5NS0xLjc0MTItMC41ODcyMS0yLjE4NTh6bS0zLjMxOTMgMS41MTU5LTEuODIxMSAzLjE1NDIgMy42NjYyIDIuMTE2NyAxLjgyLTMuMTUyNGMtMC43MzczMSAwLjM3MjY2LTEuNjQzMSAwLjM3OTYxLTIuNDA4Mi0wLjA2MjEyOS0wLjc2NTg1LTAuNDQyMTYtMS4yMTIyLTEuMjMwOS0xLjI1NjktMi4wNTYzeiIgZmlsbD0iI2ZmZiIvPgo8L3N2Zz4K", + "link-out.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNyAzOC45OHYzLjk4M2gxMXYxMmwxMy0yM0gxOWwtLjQ2My4wMTdjLTEuMjggNC4wNDgtNS4wNjYgNi45ODMtOS41MzcgNi45ODN6bTEyLTExLjAxN2gxMmwtMTMtMjN2MTJIN1YyMC45bDIgLjA2NGM0LjQ2NyAwIDguMjUgMi45MyA5LjUzNCA2Ljk3MnpNNi45NSAyNC4yMmE2IDYgMCAxIDEtLjA4MyAxMS40NTYiIGZpbGw9IiNmZmYiIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiLz48L3N2Zz4K", + "link-return.svg": + "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLSBDcmVhdGVkIHdpdGggSW5rc2NhcGUgKGh0dHA6Ly93d3cuaW5rc2NhcGUub3JnLykgLS0+Cjxzdmcgd2lkdGg9IjEwLjU4M21tIiBoZWlnaHQ9IjE1Ljg3NW1tIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCAxMC41ODMgMTUuODc1IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogPHBhdGggZD0ibTIuNjYyMyAxMy4yOTIgNC44OTIyLTAuNTM2MTItMS42MDQtMC45MjYwNCAxLjAzOTUtMS44MDA0Yy0wLjczNzE5IDAuMzc0MDItMS42NDM3IDAuMzgyMjctMi40MDk1LTAuMDU5ODkyLTAuNzY1MTEtMC40NDE3NC0xLjIxMTgtMS4yMzAxLTEuMjU3Ny0yLjA1NWwtMS4wMzg0IDEuNzk4Ni0xLjYwNC0wLjkyNjA0em0yLjM4MTMtNC4xMjQ0YzAuNzcwMTYgMC40NDQ2NSAxLjc0MDIgMC4xODQ3NCAyLjE4NDgtMC41ODU0MiAwLjQ0NDY1LTAuNzcwMTYgMC4xODUtMS43NDA2LTAuNTg1MTYtMi4xODUzLTAuNzcwMTYtMC40NDQ2NS0xLjc0MjItMC4xODUzMy0yLjE4NjkgMC41ODQ4My0wLjQ0NDY1IDAuNzcwMTYtMC4xODI5NSAxLjc0MTIgMC41ODcyMSAyLjE4NTh6bTMuMzE5My0xLjUxNTkgMS44MjExLTMuMTU0Mi0zLjY2NjItMi4xMTY3LTEuODIgMy4xNTI0YzAuNzM3MzEtMC4zNzI2NiAxLjY0MzEtMC4zNzk2MSAyLjQwODIgMC4wNjIxMjkgMC43NjU4NSAwLjQ0MjE2IDEuMjEyMiAxLjIzMDkgMS4yNTY5IDIuMDU2M3oiIGZpbGw9IiNmZmYiLz4KPC9zdmc+Cg==", + "mongodb.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAG7AAABuwBHnU4NQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEbSURBVEiJ7davSwRBGMbx76rJ4Gky62EThNOmWfwL7mlm0WAw2U2mK3aDwj5gMBgEi8FmEbGIWYMGwR8gJssGhb2dmdsNIr5t5n3nMy8TZibL85wmY6hR7e+AkmYlTTUCSpoAjoEjSa1aoKRhIAfaQAc4kTRap8NtYPnbeAnYHQiUNAZslaTWJS0O0uEGMF4ynwG9JFBSBmxWbLYgqZPSYRuYrAABVlPA+QAGMJcCTkeAMyngcwT4mQI+RYCPKeAZ8BYAL6JB2y/AQQB0NFjEXkXu0PZlEmj7BjgtSd0Ca/3WhS6HLj/P6gPo2u57vpWg7VdgBbgrpnZsX1etCV6wtt+Bh2J4H6r//Y/USGTdPnAOXIUKs/+fQ+34AkBdPov8hXWQAAAAAElFTkSuQmCC", + "mouse.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB98CBBcXKYRGaWIAAAIfSURBVEjHrVY9a1RBFD33bjAhNqYTBW0kpBErawPpjIq4RWyEYG2hiIWdnY3+Aiut/GhiYyeIhb/AJGgQFAtTpFlWCYjnHIvMw3XzXvI2m1vNx50zc7/OHaClSLLtB2WMsUXSkiSRfHgYYAAA29clmeSZJt0cBdh2pwz7h/HKm9qRJ2OD2Z4vpi7vF5SJOn9lZgV0SdKk7bsAEBEXbSeALdtvIuLPoP4uIVmBzktyMdG2RdJlooH1hcFzTaDvCtgLSfNl7bgkD1gxK+lWccPzRjeQXC5gdwaVSJ4eBKxeZPt20e8OO726+ZOkrzUX/Qc4tLci6WN1SRZnV/uzth+3jT5JZOYqgJkskdkVnsxcbwvY6XRgmxExASCaKiVGzNG9S8/2WFQyUbN2VdIvAOuZ2Ss+/l1z8REAc7bnALiR86qELolsSZ9tr5REfkTytaSfA4lu2z8q4ohhQABd25sRcTIiFm1fADATEZOl7PoANgA8i4g1Sd3MXAJwIiK4y+SI6GfmhzJ91YInFw7MhzUpNh7BHijKto+OAhARYVtVPuYwU0TE5REBp2z3M1N1Tn5q+9uIreELydWmzRsl9061LLtzhRPP79nQSXq4hQ7PSR4juW37ZSNr24akqfLK7ySvNdDWFUnbRW+61U9C0lo5sCnpHslFSfclbXmnsbytY5s9fwqSzkra8L/OZJLvq59DK7A635EM29O9Xm/fc38BtSAs2DgLlw8AAAAASUVORK5CYII=", + "parser-csv.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMjYuMDAxIDcuMDM0bC0yMiAuMDQzdjQ1Ljk1OGgzMnYtMzZ6bS0xNC44MzggMTRoMi44Mzh2MTUuMDAxaC0zVjI1LjczOGMtMS4wMjcuOTYtMi42MDYgMS4xMTQtNCAxLjU3NFYyNC43NmMuNzM0LS4yNCAxLjUzLS43MDYgMi4zOS0xLjM3My44NjEtLjY3MyAxLjQ1Mi0xLjQ1NyAxLjc3Mi0yLjM1MXptMTUuOTQ4IDBjMS40NDggMCAyLjgyNC4zOTIgMy42NSAxLjE3My44MjguNzggMS4yNCAxLjc1MSAxLjI0IDIuOTEyIDAgLjY2LS4xMiAxLjI5LS4zNiAxLjg5YTcuMTQzIDcuMTQzIDAgMCAxLTEuMDUgMS44NzJjLS4zNC40MzMtLjk1MiAxLjA1Ny0xLjg0IDEuODctLjg4Ni44MTUtMS42ODcgMS4zNTUtMS45MjcgMS42MjItLjIzMy4yNjctLjQyMy40MDgtLjU3LjY2Mmg1Ljc0OHYzSDIxLjk4Yy4xMDctLjk4Ny40MjctMi4xOTIuOTYtMy4wNzIuNTM0LS44ODcgMS44MjUtMi4wNiAzLjQtMy41MjIgMS4yNjctMS4xOCAxLjk3Mi0xLjk4MiAyLjI1OS0yLjQwMi4zODctLjU4LjQwMi0xLjE1NC40MDItMS43MjEgMC0uNjI3LjAwOC0xLjEwOC0uMzMyLTEuNDQxLS4zMzMtLjM0LTEuMDM1LS41MS0xLjYyOS0uNTEtLjU4NyAwLTEuMDUzLjE3OC0xLjQuNTMxLS4zNDcuMzU0LS41NDYgMS4zMTYtLjYgMi4xMzdoLTMuMDM5Yy4xNjctMS41NDguOTI4LTMuMzE1IDEuODA5LTMuOTg5Ljg4LS42NzMgMS45OC0xLjAxMSAzLjMtMS4wMTF6TTE3LjAwMiAzMy4wMzZoM3YxLjkyOGMwIC44MTQtLjA3MyAxLjQ1NS0uMjEzIDEuOTIyLS4xNC40NzMtLjQwNy44OTgtLjggMS4yNzEtLjM4Ny4zNzQtLjg4LjY2Ni0xLjQ4MS44OGwtLjU0OS0xLjE2MWMuNTY3LS4xODcuOTY5LS40NDMgMS4yMS0uNzcuMjQtLjMyNy4zNjctLjUwMy4zOC0xLjA3aC0xLjU0N3oiIGZpbGw9IiNmZmYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIuNjEyIi8+PC9zdmc+Cg==", + "parser-html.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMjYuMDAxIDcuMDM0bC0yMiAuMDQzdjQ1Ljk1OGgzMnYtMzZ6bS0xMyAxM2wzIDItNiA4IDYgOC4wMDEtMyAyLTctMTB6bTEzIDBsNyAxMC03IDEwLjAwMS0zLTIgNi04LTYtOHoiIGZpbGw9IiNmZmYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIuNjEyIi8+PC9zdmc+Cg==", + "parser-json.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMjYuMDAxIDcuMDM0bC0yMiAuMDQzdjQ1Ljk1OGgzMnYtMzZ6bS05LjE3IDEwLjAwMmgxLjE5N3YzLjExYy0uOTc0IDAtMi4xLjA1Ny0yLjM4MS4xN2ExLjE0NiAxLjE0NiAwIDAgMC0uNjA2LjQ5M2MtLjEzMS4yMTctLjE5Ny41OTMtLjE5NyAxLjEzMSAwIC41NDYtLjA0IDEuNTgzLS4xMTkgMy4xMS0uMDQ0Ljg1OC0uMTU4IDEuNTU2LS4zNDIgMi4wOTMtLjE4NC41My0uNDIxLjk2OC0uNzEgMS4zMTUtLjI4MS4zNDctLjcxNi43MDUtMS4zMDMgMS4wNzguNTE3LjI5NS45MzkuNjQyIDEuMjYzIDEuMDQuMzM0LjM5MS41ODguODY5Ljc2NCAxLjQzMy4xNzUuNTYzLjI5IDEuMzE4LjM0MiAyLjI2M2E4Ni45IDg2LjkgMCAwIDEgLjA5MiAyLjc1NmMwIC41NzMuMDcuOTcyLjIxIDEuMTk4LjE0LjIyNS4zNS4zOTUuNjMxLjUwNy4yOS4xMjIgMS40MDguMTgyIDIuMzU2LjE4MnYzLjEyMUgxNi44M2MtMS4xODUgMC0yLjA5My0uMDk1LTIuNzI1LS4yODVhMy42OSAzLjY5IDAgMCAxLTEuNjA0LS45MjQgMy4zIDMuMyAwIDAgMS0uODY5LTEuNjEzYy0uMTQ5LS42MzMtLjIyNC0xLjYzNC0uMjI0LTMuMDA0IDAtMS41OTYtLjA3LTIuNjMzLS4yMS0zLjExLS4xOTItLjY5My0uNDg3LTEuMTg3LS44ODItMS40ODItLjM4Ni0uMzAzLTIuNTA5LS41MzktMy4zMTYtLjU4MnYtM2MuNjQtLjAzNSAyLjY0OS0uMTkgMi45NzQtLjM0Ni4zMjQtLjE1Ni42MDUtLjQxNy44NDItLjc4MS4yMzctLjM3My4zOTgtLjgzNi40ODYtMS4zOS4wNy0uNDE3LjEwNi0xLjE0My4xMDYtMi4xNzUgMC0xLjY4Mi4wOC0yLjg1Mi4yMzgtMy41MTEuMTU4LS42NjguNDQzLTEuMjAxLjg1NS0xLjYuNDEzLS40MDggMS4wMTItLjcyOSAxLjgwMS0uOTYzLjUzNS0uMTU2IDMuNjc3LS4yMzQgMi41MjctLjIzNHptNS4xNTcgMGgxLjE5N2MxLjE1IDAgMS45OTMuMDc4IDIuNTI4LjIzNC43OS4yMzQgMS4zODguNTU1IDEuOC45NjMuNDEzLjM5OS42OTguOTMyLjg1NiAxLjYuMTU4LjY1OS4yMzggMS44My4yMzggMy41MTEgMCAxLjAzMi4wMzYgMS43NTguMTA2IDIuMTc0LjA4Ny41NTUuMjUgMS4wMTguNDg2IDEuMzkuMjM3LjM2NS41MTcuNjI2Ljg0Mi43ODIuMzI0LjE1NiAyLjMzMy4zMTEgMi45NzMuMzQ2djNjLS44MDcuMDQzLTIuOTMuMjc4LTMuMzE1LjU4Mi0uMzk1LjI5NS0uNjkuNzg5LS44ODMgMS40ODItLjE0LjQ3Ny0uMjA5IDEuNTE0LS4yMDkgMy4xMSAwIDEuMzctLjA3NSAyLjM3LS4yMjQgMy4wMDQtLjE1LjY0MS0uNDQgMS4xOC0uODcgMS42MTNhMy42OSAzLjY5IDAgMCAxLTEuNjAzLjkyNGMtLjYzMi4xOS0zLjkwOS4yODUtMi43MjUuMjg1aC0xLjE5N3YtMy4xMjFjLjk0NyAwIDIuMDY2LS4wNiAyLjM1Ni0uMTgyLjI4LS4xMTIuNDktLjI4Mi42My0uNTA4LjE0LS4yMjUuMjExLS42MjUuMjExLTEuMTk3IDAtLjM5OS4wMy0xLjMxNi4wOTItMi43NTYuMDUzLS45NDUuMTY2LTEuNy4zNDItMi4yNjQuMTc1LS41NjMuNDMtMS4wNDEuNzY0LTEuNDMxYTQuNDM0IDQuNDM0IDAgMCAxIDEuMjYzLTEuMDQxYy0uNTg3LS4zNzMtMS4wMjItLjczMS0xLjMwMi0xLjA3OC0uMjktLjM0Ny0uNTI3LS43ODYtLjcxMS0xLjMxNS0uMTg1LS41MzctLjI5OC0xLjIzNS0uMzQyLTIuMDk0LS4wOC0xLjUyNi0uMTItMi41NjMtLjEyLTMuMTA5IDAtLjUzOC0uMDY1LS45MTQtLjE5Ny0xLjEzYTEuMTQ2IDEuMTQ2IDAgMCAwLS42MDUtLjQ5NWMtLjI4LS4xMTMtMS40MDctLjE3LTIuMzgtLjE3eiIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9Ii42MTIiLz48L3N2Zz4K", + "parser-xml.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMjYuMDAxIDcuMDM0bC0yMiAuMDQzdjQ1Ljk1OGgzMnYtMzZ6bS0xMyAxM2wzIDItNiA4IDYgOC4wMDEtMyAyLTctMTB6bTEzIDBsNyAxMC03IDEwLjAwMS0zLTIgNi04LTYtOHoiIGZpbGw9IiNmZmYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIuNjEyIi8+PC9zdmc+Cg==", + "parser-yaml.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMjYuMDAxIDYuOTg3bC0yMiAuMDQzdjQ1Ljk1OGgzMlYxNi45ODd6TTEwLjU2NyAxOS4zNjJoNS4zNTJjLjc2OCAwIDEuMjgyLjEwNCAxLjU0My4zMTMuMjczLjIwOC40MS41NzMuNDEgMS4wOTMgMCAuNTIxLS4xNjMuODg2LS40ODggMS4wOTQtLjMxMy4yMDktLjg5Mi4zMTMtMS43MzkuMzEzaC0uNjQ0bDQuNzI2IDguNDc3IDQuOTAzLTguNDc3aC0uODAxYy0uNzAzIDAtMS4xOTEtLjEwNC0xLjQ2NS0uMzEzLS4yNzMtLjIwOC0uNDEtLjU3My0uNDEtMS4wOTQgMC0uNTQ2LjExNy0uOTE4LjM1Mi0xLjExMy4yMzQtLjE5NS44MjYtLjI5MyAxLjc3Ny0uMjkzaDMuNTk0Yy45OSAwIDEuNjIuMTA0IDEuODk0LjMxMy4yODcuMTk1LjQzLjU2LjQzIDEuMDkzIDAgLjUyMS0uMTQzLjg4Ni0uNDMgMS4wOTQtLjI3My4yMDktLjguMzEzLTEuNTgyLjMxM2gtLjMxMmwtNi42NCAxMS4zODd2Ni4yMTFoMi44NWMxLjAwMyAwIDEuNjQxLjA5OCAxLjkxNS4yOTMuMjg2LjE4Mi40My41MzQuNDMgMS4wNTUgMCAuNTM0LS4xNDQuOTA1LS40MyAxLjExMy0uMjc0LjE5NS0uODM0LjI5My0xLjY4LjI5M2gtOS4yNzdjLS44NDcgMC0xLjQwNi0uMDk4LTEuNjgtLjI5My0uMjczLS4yMDgtLjQxLS41OC0uNDEtMS4xMTMgMC0uNTIxLjE1LS44NzMuNDUtMS4wNTUuMzEyLS4xOTUuOTUtLjI5MyAxLjkxMy0uMjkzaDIuODMyVjMzLjI5bC02LjUwNC0xMS4xMTRoLS4zMzJjLS43ODEgMC0xLjMxNS0uMTA0LTEuNjAxLS4zMTItLjI4Ny0uMjA5LS40My0uNTczLS40My0xLjA5NCAwLS40ODIuMTE3LS44MzMuMzUxLTEuMDU1LjI0OC0uMjM0LjYyNi0uMzUxIDEuMTMzLS4zNTF6IiBmaWxsPSIjZmZmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iLjYxMiIvPjwvc3ZnPgo=", + "range.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNOC4wMDMgNDIuMDA3aDV2LTE4aC01ek04LjAwMyAyMC4wMDZoNXYtNWgtNXpNMjUgNTIuMDA3aDh2LTI5aC04ek0yNSAxNS4wMWg4di04aC04eiIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSJub25lIi8+PHBhdGggZD0iTTE1LjgxOSAxNS42MzlsNi4yOTMtMi41MTdNMTUuMTkgNDIuMzg1bDcuMjM2IDMuNzc1IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMS4yNTg2MiIvPjwvc3ZnPgo=", + "rbe.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAYAAAAe2bNZAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3wcPFiwJnbnE1AAAAIlJREFUWMPtl7sJgEAQRGcPYwMbELQni7AJW7QYEzEYYwX1vog4L13YeWw0CwjxR0hOjKCEiC8LyZXkTLIvIWIBMiPJ1ne3xVzlsMDMrubn2RMu5UqhYUVlciMZyUhGMpKRjGQk87ZMauGuPAIaABuADsCQMzyoA6eExVRSd/eKRHrUubuxEJ9gB2tHwAJpckKMAAAAAElFTkSuQmCC", + "redis.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAG7AAABuwBHnU4NQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJdSURBVEiJ7ZVNSFVREMd/zxQL2kSBQl+4qSgoKVxKrSoo+lgNLdUylSzaJLWpNhG0SPuwoIW0sTvRIhShTSRRELTQQEOjoiCoJLEPi1Ly3+KdZ+c9nwbiIqiBw+XMnf/vMnPmzE0lScJcWsGc0v4D58QK/xRgZkXA0rD94u7DswKa2QrgIFADlAT3TzPrAJrd/X4+XSruQzNLAduBemAH6ZK8B7qAcWA1sCWE9wAtwA13H5uEJEmCpCWSjkl6od/WLckkFSVJQmZJ2iCpTdL3EPdO0klJJUmSTKb8BigGPgOXgCvu/jRfSu7+BKgys6aQST1wCjgOzM8Ai4FeoNLdR6eraw54CDhtZmeBh8AmyD6UcuCRmTUD7e7+bSagmRUCVUAdsDHjzwAvA/uAdcA14JyZXQeuuvtADmgRcAA4BCwP7g/ATWDyUBSK3CHpoqRX0eHcldQoqU5Sq6TR4B+WdEvSPUljkpQkSRbwmaSKsC+QtFNSl6SfyrZ+SbWSFoTYckmDucC+SNAjqToSlEnaE1Zl9MHdkh5Eur4YOBi9GA/PEUnnJa2KenChpMOSnoeYiUg3mJvygKQKSSWSTkh6HYn6JfVK+hR8X0M91wTNQCbleNqsDC2wzN3PAGXALuAOsBgoBd4CTSGmIehqgjarbRpJd3w1UG1mj4HWdP96Z54e3GpmR4FtQAp4CVyAqcNhM9AA7AWKgBGgDbhNejisB44Aa4OkG2gGOt19YgowApcC+4HaqHkz9gNoB1rCvc6yvMAIPI/0GMtcrY+kr+XQdJoZgbOxv/8n9Q8CfwE7dg5XDmjPIwAAAABJRU5ErkJggg==", + "rpi.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii4xMzgiPjxwYXRoIGQ9Ik0yMC4yMSAyMC45OGMyLjA5Ni0uMDIzIDQuNjk0IDEuNTYyIDQuNjgzIDMuMDU4LS4wMSAxLjMyLTEuODI0IDIuMzktNC42NjcgMi4zNy0yLjc4NC0uMDM0LTQuNjU2LTEuMzQ0LTQuNjUtMi42MjMuMDA1LTEuMDUzIDIuMjcxLTIuODY2IDQuNjM0LTIuODA1ek0xMy4wNyAyMS44N2MuNDY5LS4wMDkuOTU0LjAyOCAxLjQ0OS4xMTEgMS40NTguMjQ1LTYuOTkgNy42MjMtNy4xMiA1Ljk3Ny0uMTE2LTMuNzU2IDIuMzktNi4wMjcgNS42NzEtNi4wODh6TTI2LjkxIDIxLjk5YzMuMjguMDYxIDUuNzg3IDIuMzMgNS42NyA2LjA4Ni0uMTMgMS42NDUtOC41NzctNS43My03LjExOS01Ljk3NWE3LjgzIDcuODMgMCAwIDEgMS40NDktLjExMXpNMjUuNzYgMjYuNTljMS41Ni4xNDMgMy4xNDMgMS4wOCA0LjE3NSAyLjY0MyAxLjY1MiAyLjUgMS4yNyA1LjY1Ni0uODU1IDcuMDQ4LTIuMTI1IDEuMzkyLTUuMTg1LjQ5Mi02LjgzNy0yLjAwOC0xLjY1Mi0yLjUtMS4yNjktNS42NTYuODU1LTcuMDQ4Ljc5Ny0uNTIyIDEuNzI1LS43MiAyLjY2Mi0uNjM1ek0xNC43IDI2Ljg0Yy45MzctLjA4NiAxLjg2NS4xMTMgMi42NjEuNjM1IDIuMTI1IDEuMzkyIDIuNTA4IDQuNTQ4Ljg1NiA3LjA0OC0xLjY1MiAyLjUtNC43MTIgMy4zOTctNi44MzcgMi4wMDUtMi4xMjQtMS4zOTItMi41MDctNC41NDUtLjg1NS03LjA0NSAxLjAzMi0xLjU2MyAyLjYxNC0yLjUgNC4xNzUtMi42NDN6TTMzLjA1IDI5LjZhLjcyOC43MjggMCAwIDEgLjIwNC4wMjZjMy44MDYgMi4xNzMgMy4xNDUgNy4wMSAxLjA5MiA4LjY2LTEuODA4LjgwNC0zLjI5LTguNjUzLTEuMjk2LTguNjg2ek02Ljk1IDI5LjczYzEuOTk0LjAzMy41MTIgOS40OS0xLjI5NiA4LjY4Ny0yLjA1My0xLjY1MS0yLjcxNC02LjQ4NiAxLjA5Mi04LjY2YS43MzguNzM4IDAgMCAxIC4yMDQtLjAyN3pNMjAuMyAzNi4yM2MyLjgzMi0uMDE0IDUuMTQxIDIuMDkzIDUuMTU2IDQuNzA0di4wNDljLjAxNSAyLjYxLTIuMjY5IDQuNzM4LTUuMSA0Ljc1Mi0yLjgzMi4wMTQtNS4xNDEtMi4wOS01LjE1Ni00LjcwMWEyLjk5NiAyLjk5NiAwIDAgMSAwLS4wNTFjLS4wMTUtMi42MTEgMi4yNjgtNC43NCA1LjEtNC43NTN6TTMxLjY2IDM4LjAyYy40LS4wMTEuNzc3LjEwMiAxLjExNS4zNjQuOTEuOTA3IDEuNDQzIDQuMzItLjE1IDYuMzY2LTIuMTk1IDMuMDQ1LTUuMTY1IDMuMTY0LTYuMjcyIDIuMzE2LTEuMTU3LTEuMDkyLS4yNzQtNC40ODIgMS4zMTMtNi4zNCAxLjM2MS0xLjUzOCAyLjc5My0yLjY3NSAzLjk5NC0yLjcwNnpNOC42NSAzOC43NGMxLjI5LjA1NSAyLjgzNiAxLjA3NiA0LjA5OSAyLjU0IDEuNDY2IDEuNzY4IDIuMTM1IDQuODcyLjkxIDUuNzg4LTEuMTU3LjY5OC0zLjk2OC40MDktNS45NjctMi40NjMtMS4zNDctMi40MDktMS4xNzUtNC44Ni0uMjI5LTUuNThhMi4wNyAyLjA3IDAgMCAxIDEuMTg3LS4yODV6TTIwLjM1IDQ3LjIxYzIuMDYtLjA5IDQuODI0LjY2MyA0LjgzIDEuNjYyLjAzMy45Ny0yLjUwOCAzLjE2My00Ljk2NyAzLjEyLTIuNTQ3LjExLTUuMDQ1LTIuMDg1LTUuMDEyLTIuODQ2LS4wMzgtMS4xMTYgMy4xMDItMS45ODcgNS4xNDktMS45MzZ6TTM1LjEzIDExLjAzYy0uNTY5IDcuMzU2LTcuNDA5IDE0LjEyOC0xMS42MjkgNi45NzEgMS4zNjMtMS41MiAzLjg1My0zLjMwNiA4LjEzMy01LjUxMy0zLjMzIDEuMTMyLTYuMzM1IDIuNjQtOC44NSA0LjcxNi01LjgzOC00LjI5NiA0LjczNC05LjY3NSAxMi4zNDYtNi4xNzR6Ii8+PHBhdGggZD0iTTUuNDIgMTEuMDNjLjU2OSA3LjM1NiA3LjQwOSAxNC4xMjggMTEuNjI5IDYuOTcxLTEuMzYzLTEuNTItMy44NTMtMy4zMDYtOC4xMzMtNS41MTMgMy4zMyAxLjEzMiA2LjMzNSAyLjY0IDguODUgNC43MTYgNS44MzgtNC4yOTYtNC43MzQtOS42NzUtMTIuMzQ2LTYuMTc0eiIvPjwvZz48L3N2Zz4=", + "serial.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNC41IDQ3LjVoNGwuMDQtMzQuOTk1TDE5LjUgMTIuNXYzNWgxMXYtMzVoNSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiBzdHJva2Utd2lkdGg9IjUiLz48L3N2Zz4K", + "sort.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMjAuMDAxIDE5Ljk1NWwtNy41LTguMTc4LTcuNSA4LjE3OGg1djI4aDV2LTI4ek0zNS4wMDEgMzkuOTU1bC03LjUgOC4xNzctNy41LTguMTc3aDV2LTI4aDV2Mjh6IiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii41MzEiLz48L3N2Zz4K", + "split.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTYuMDAxIDM5Ljk5bC0uMDMyLTE5Ljk1Ny0xMS45NjguMDE3djE5Ljk4M2wxMi0uMDQ1TTM0LjAwMSAyOC4wMjdsLTQgLjAwNHYzLjk5N2w0LS4wMU00MC4wMDEgMjguMDI3bC00IC4wMDR2My45OTdsNC0uMDFNMjcuMDAxIDMwLjAyN2wtNy03Ljk4NnYxNS45ODZNMzQuMDAxIDIwLjAyN2wtNCAuMDA0djMuOTk3bDQtLjAxTTQwLjAwMSAyMC4wMjdsLTQgLjAwNHYzLjk5N2w0LS4wMU0zNC4wMDEgMzYuMDI3bC00IC4wMDR2My45OTdsNC0uMDFNNDAuMDAxIDM2LjAyN2wtNCAuMDA0djMuOTk3bDQtLjAxIiBmaWxsPSIjZmZmIiBzdHJva2Utd2lkdGg9Ii42MTIiLz48L3N2Zz4K", + "status.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCAzMGg5bDMuNS0xMCA1IDI1IDUuMTI1LTMwTDI3LjUgNDAgMzEgMzBoOSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmIiBzdHJva2UtbWl0ZXJsaW1pdD0iNi41IiBzdHJva2Utd2lkdGg9IjQiLz48L3N2Zz4K", + "subflow.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMjUgMjUuOTRoN2MuNTggMCAxLS40MiAxLTF2LTJjMC0uNTgtLjQyLTEtMS0xaC03Yy0uNTggMC0xIC40Mi0xIDF2MmMwIC41OC40MiAxIDEgMXptLTE3IDEyaDdjLjU4IDAgMS0uNDIgMS0xdi0yYzAtLjU4LS40Mi0xLTEtMUg4Yy0uNTggMC0xIC40Mi0xIDF2MmMwIC41OC40MiAxIDEgMXptLS40MTYgMTFDNS42MjQgNDguOTQgNCA0Ny4zMTUgNCA0NS4zNTZWMTQuNTIyYzAtMS45NiAxLjYyNS0zLjU4MiAzLjU4NC0zLjU4MmgyNC44MzJjMS45NiAwIDMuNTg0IDEuNjIzIDMuNTg0IDMuNTgydjMwLjgzNGMwIDEuOTYtMS42MjUgMy41ODQtMy41ODQgMy41ODR6TTMyIDM2Ljk0SDE5YzAgMi4xOS0xLjgxIDQtNCA0SDd2NC40MTZjMCAuMzUuMjM1LjU4NC41ODQuNTg0aDI0LjgzMmMuMzUgMCAuNTg0LS4yMzUuNTg0LS41ODR2LTguNDE3em0xLTJ2LTZoLThjLTIuMTkgMC00LTEuODEtNC00aC0xYy00LjMzMy0uMDAyLTguNjY3LjAwNC0xMyAwdjZoOGMyLjE5IDAgNCAxLjgxIDQgNGgxM3ptMC0xNnYtNC40MThjMC0uMzUtLjIzNS0uNTgyLS41ODQtLjU4Mkg3LjU4NGMtLjM1IDAtLjU4NC4yMzMtLjU4NC41ODJ2OC40MTdjNC4zMzMuMDAyIDguNjY3LjAwMSAxMyAuMDAxaDFjMC0yLjE5IDEuODEtNCA0LTRoOHoiIGNvbG9yPSIjMDAwIiBmaWxsPSIjZmZmIi8+PC9zdmc+Cg==", + "swap.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjZmZmIj48cGF0aCBkPSJNMTIuNzg3IDI2LjQzMkw5LjUgMTguMDAzaC00LjV2LTVoOGwyLjI4NiA2LjI4Nm01LjM1NyAxNC4yODZsMy4zNTcgOC40MjhoNHYtOGw3IDEwLjUtNyAxMC41di04aC03LjVsLTIuMzU3LTYuMjg2Ii8+PHBhdGggZD0iTTEzLjAwMSA0Ny4wMDNsMTAuODU3LTI5aDQuMTQzdjhsNy0xMC41LTctMTAuNXY4aC03LjVsLTExIDI5aC00LjV2NXoiLz48L2c+PC9zdmc+", + "switch.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNS4wMDEgMjcuMDA2djZsMTAuMTItLjAxNCAzLjAyMyA3LjcyOCAyLjM1NyA2LjI4Nmg3LjV2OGw3LTEwLjUtNy0xMC41djhoLTRsLTMuMzU3LTguNDI5Yy0uNDc1LTEuMjY3LS45My0yLjQzNS0xLjI5NS0zLjYwMWw0LjUxLTExLjk3SDI4djhsNy0xMC41LTctMTAuNXY4aC03LjVMMTUuMDk4IDI3eiIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSJub25lIi8+PC9zdmc+Cg==", + "template.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMzAuMDQxIDQ3LjkxdjMuNDg1aC0xLjVxLTYuMDI3IDAtOC4wODQtMS43OS0yLjAzMy0xLjc5Mi0yLjAzMy03LjE0VjM2LjY4cTAtMy42NTUtMS4zMDctNS4wNTgtMS4zMDYtMS40MDQtNC43NDMtMS40MDRoLTEuNDc2di0zLjQ2aDEuNDc2cTMuNDYgMCA0Ljc0My0xLjM4IDEuMzA3LTEuNDA0IDEuMzA3LTUuMDF2LTUuODA4cTAtNS4zNDkgMi4wMzMtNy4xMTYgMi4wNTctMS43OSA4LjA4My0xLjc5aDEuNTAxdjMuNDZoLTEuNjQ2cS0zLjQxMiAwLTQuNDUzIDEuMDY1LTEuMDQgMS4wNjUtMS4wNCA0LjQ3N3Y2LjAwMnEwIDMuOC0xLjExNCA1LjUxOC0xLjA4OSAxLjcxOS0zLjc1IDIuMzI0IDIuNjg1LjY1MyAzLjc3NSAyLjM3MSAxLjA4OSAxLjcxOSAxLjA4OSA1LjQ5NHY2LjAwMnEwIDMuNDEyIDEuMDQgNC40Nzd0NC40NTMgMS4wNjV6IiBmaWxsPSIjZmZmIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iLjcxOSIvPjwvc3ZnPgo=", + "timer.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBjb2xvcj0iIzAwMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU0MCAtOTg3LjM2KSI+PHBhdGggZD0iTTU2NS40MyAxMDAxLjljNi41NjIgMi4wODkgMTEuMzE2IDguMjMzIDExLjMxNiAxNS40ODggMCA4Ljk3NS03LjI3NSAxNi4yNS0xNi4yNSAxNi4yNXMtMTYuMjUtNy4yNzUtMTYuMjUtMTYuMjVjMC0yLjgwMi43MS01LjQzOCAxLjk1OC03Ljc0IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIzIiBzdHlsZT0iaXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsIi8+PGNpcmNsZSBjeD0iNTYwIiBjeT0iMTAwMS40IiByPSIxLjUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjMiIHN0eWxlPSJpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWwiLz48cGF0aCBkPSJNNTYwIDEwMTQuNGMtMS4yMDYgMC0xMS0xMC45OTktMTIuMzU0LTkuOTc1UzU1NyAxMDE2LjE0OCA1NTcgMTAxNy40czEuMzYgMyAzIDMgMy0xLjM2MSAzLTMtMS43OTQtMy0zLTN6IiBmaWxsPSIjZmZmIi8+PC9nPjwvc3ZnPgo=", + "trigger.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNC41IDQ3LjQ2aDRsLjA0LTM0Ljk5NSAxMC45Ni0uMDA1djM1aDE2IiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJzcXVhcmUiIHN0cm9rZS13aWR0aD0iNSIgZmlsbD0ibm9uZSIvPjwvc3ZnPgo=", + "watch.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzU1IC03MDQuMzYpIj48Y2lyY2xlIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00My4wOTEgLTQ0Ljc1Mikgc2NhbGUoLjgxODE4KSIgY3g9IjUwNS41IiBjeT0iOTQxLjg2IiByPSIxNC41IiBjb2xvcj0iIzAwMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjQiLz48cGF0aCBkPSJNMzc3LjYyIDczNy44Nmw4Ljg3NyAxNS41IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI2Ii8+PC9nPjwvc3ZnPgo=", + "white-globe.svg": + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMjAgMTJhMTggMTggMCAwIDAtMTQuMjQ2IDcuMDMzbDIuNTI3Ljg0NCAxLjk4My0xLjc5NyA0Ljg5LTMuNzE1Ljk5LjkzLTQuMDg1IDEuOTE4LS4wNjMgMi40MTYgMy4yMi0uODA1Yy45NS0uNjggMS44OTktMS4zNjQgMi44NDktMi4wNDVsLS4yNDktMi4yOWgxLjM2NGMxLjUwNi0uNTE3IDMuMDEzLTEuMDMyIDQuNTItMS41NDhsMS4zNDEgMS4zMjUtLjM1MSAxLjk1Ny0yLjA0My0uMTg2IDEuOTgyIDIuNjYyLTIuNDc3IDEuODU4di0xLjYxbC0yLjI5LjEyM2MtLjg2OC42Ni0xLjczNSAxLjMyMi0yLjYwMiAxLjk4M2wtLjM3MSAzLjM0My0zLjA5Ni40OTctMS4wNTMgMi40MTQuNDk0LjQ5NiAxLjE3OC0uMzEgMS4yMzgtMS40MjUgMi4xMDYuMzcxIDEuMTEzIDEuMjM5YzEuNTY5LjY5MSAzLjEzOSAxLjM4MiA0LjcwNyAyLjA3NEgxMS4wNjhsLTEuNjcyIDEuNDU1LS4zMSAyLjY2MiAxLjc5NyAyLjg1IDQuNTgyLjg2Ny45OSAyLjY2Mi0uMzcxIDMuMDk2IDIuMTA1IDEuNjEgMy4yODEuMzFMMjUgNDMuMTU4bC4zNy0xLjYxLjU2LTIuMDQ0Yy40OTUtLjQ5NS45ODgtLjk5MSAxLjQ4NC0xLjQ4NmwuMTI1LTEuNjctMi44NS0xLjY3Mi0xLjQ4NC0yLjE2OCAxLjU0Ny40OTYgMi40MTYgMi40MTQgMi4zNTEtMS4zLjE4Ni0yLjY2My0yLjQxNC0uMzcxLjEyMy0xLjMzMmg0LjY0NGwxLjQyNCAyLjJjLjU3OC4zMDkgMS4xNTcuNjE3IDEuNzM1LjkyN2wtLjI0OS0zLjEyN2gxLjIzOWwxLjMgMy40MzcuNDA1LTEuNDJBMTggMTggMCAwIDAgMzggMzBhMTggMTggMCAwIDAtMTgtMTh6TTIuOTU3IDMzLjgwOWwtLjUxOC4wNDNhMTggMTggMCAwIDAgMi42NzYgNi4yMzhjLjIxLS42MjguNDE4LTEuMjU2LjYyNy0xLjg4NXYtMi4yOUw1IDM0LjI0MmwtMi4wNDMtLjQzNHptMjUuNTI3IDEyLjA0OWwtNS40OTYgMS44ODlhMTggMTggMCAwIDAgNS40OTYtMS44ODl6IiBjb2xvcj0iIzAwMCIgZmlsbD0iI2ZmZiIgc3R5bGU9Imlzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbCIvPjwvc3ZnPg==", + "parser-markdown.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAoCAYAAADpE0oSAAAABmJLR0QA/wD/AP+gvaeTAAAB7UlEQVRYw+2VPWhUQRSFv/NcloTFxCRCsBItlNiksrQxtUIKC7W2tFOwEIIoapFCtFFsokmRQmzSJ4WxVgsVF1kkEUkwKqgxPyQem1kYhk3eIiEozIHHm3vveffOvDl3BjIyMjIy/nWoObB9EOiJYuuS3qQf2O4CDgEF4OBuSPoe4gKOAh1RjSVJ87RIVtget70QPXXbZxJep+37Ib4Y3nO2z0ecHtuzSa7xtGYlGu8F+iO7H7hi+4Wk92ElF4CzQFfEWwGqkV0AfVEuA7W0cFGyFYPAiO0acAK4mBT9a1RK4nuAYeA1cBI4vFPiqrTBqQGXw0qL3SwM0FtGsN0dFNwZd0tT2bb3Bf+KpNXtCv8Moqkm/i9AdzJpAbeBA8HuS2IDwBjwG5iyPbbdr/sETAdyPJnHwHq6YKAODAGngP1J/EjwDwIfJLkoOVxuAo1gbwBPgtDUgj8BzGwRE7AK3JU0U9pOkp4BN4AFYBa4lfyBmPsZGAHetQhvAk+Bh+32McAk8AC4Kqlewn0J3AO+Jf63wKikX20XlrQGXJf0vA2ugUdhSzaC+ytwTdKrrdrpB7CYqLeZcDO+PIClSO1rsdgkLdu+AxwHjgUxTu3k7aRo/xqSlhPeOeA0cEnSx127b21Xw6GSkZGRkfGf4g8tS8n281i76AAAAABJRU5ErkJggg==", + "ui_button.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAG7AAABuwBHnU4NQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADNSURBVEiJ7ZQxCsJAEEX/hhSeQhux9gSSe3gBwcIDeDGx9CYWNvYRi8CzMAlr3M0uWYsI+d3A7Pt/ZmClSf8joABK3iqBIhXYQhp4KpC+2qcsyXV0QL7lPhawtC7aKsLAfSzgAhy6aWJT+0YZtM8usIE8JG2GAH0uRWeH26EJXQ1r4A7MfwKsm47AGTAhWCwwqy+/T05nNa9CH4ILGBwpZGyM+WDkoQeSbpIqqz4ZY3Y+wxhgJWlh1bO+5hhgLulq1U9fOilxh939TRqpXsa932DLVhSzAAAAAElFTkSuQmCC", + "ui_chart.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAG7AAABuwBHnU4NQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADVSURBVEiJ7dQva0JhFAdg2bJYZGUywzQNs7DkBxismvwkC8Mug0XrwG6xmtYWjWZZUIMG94ftMWi4iPd6r/c2/cUD5+Ec3sOby51zIkExa1BW1kWKIe5CN0s6IfIY4z0xiKs9tTf84j4RiCI+UQ/UWjZ5ilohDOxsmycoo4IFhrhMBKKEFQaYY4QPTHEdikWAXXzhBg184x+Pkdg+EFX84CVQa+L1IBYC9rDcfWHEu9sgiBr+0I7VHAPsY4ZCVuAtHo7GdsG0OfpzOAhKl+esBzvnpLIGJQw3hKYULUMAAAAASUVORK5CYII=", + "ui_colour_picker.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AwQFgsvH/cw7AAAAhdJREFUSMftlU1LlFEYhq/zopVgMuEipA8IAyGKIpOQIDAiamO0ahFUq/oDBf2Cdi2CCIQg6C9ELVr0SQW5iAxs00bQrEgwGct0Zq42z9jrNOI70Sq6V+frvs9znvN8wH/kobbMSQVEEyBASqk1QZWUEmoHcAIYBHYAs8Bb4BkwllKq1M+u+Tz1gPpUrfo7vqg31Z2FXKIOqJNBrqn31RtquUF4Sj20lliX+ipHeqxuVFGvxQU1dTb2Z9SjjTpZEACGgf7c3hwwH36aDH8/SCmVgJNACbiubmtm3Tr1Sdz8Ta2o8+oF9ZT6Pvauxvn16lysjTQT7Ak/vVOPqGdD8If6PeeGCfWgelFdzD29t1Fwr7qkXqnHnvrS4rgcHLLQ7AIyYEvMS0BHCwkyDLSllGiLhSWgCpxXNwFbgd0tCPaFUTN1Cz8BFaATOANsB8aAWkHBTqBDbcsLfo3xa2AIOAw8LCiYRVgtCy4Ad2M8nlKaSCmVgdHV8gC4DdyLeTleU83/9L5c6PSrfeqLVX51Ud2jHo/5m8i0rDF8RuLAR3U6Uq0ZFtRBtVt9rl6KMrey0tRqtR51vEDcVdWh4Har7XlnLte1LMumgXPAhwIfsSu4MxF2vwRXVNyURoHTwOc1CnM1xylUaHvVW7mczaOsbi7cU3KtoB3YDxwDBoANwBRwB3jUzLJUsPvlXZOllCp/tZX+SXv9h/ET4N13p8IOyEcAAAAASUVORK5CYII=", + "ui_date_picker.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAABmJLR0QA/wD/AP+gvaeTAAAATklEQVRIx2NgGAUjFPz///8/uWoYSTEEH2BkZGTEaSOpLsSqnhIXIutloZahNHMhE7VTCBO5gU/QR0PLy8R4cwR6eegmbNrl5VEwCogHAB0Cc6jSgYOVAAAAAElFTkSuQmCC", + "ui_dropdown.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAG7AAABuwBHnU4NQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABpSURBVEiJ7ZS7CoAwEARnRfxrK//awrU6CRYhkLNQM9UVy9wjEBh8HwHY3lNk0jJliErShXO2OIQHsHW61qvKeJRwPHbDspMBJCnqGpJUFZaBe7iFsXI/f17Z9loLthIT9n4MWY7BKzgBTP0qup60jeAAAAAASUVORK5CYII=", + "ui_form.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNpiYBgFgw4w/v//vwFI/6KSeWwgA/8DGdVUMrCVAWogVQDILBYoo4FahjJRPVao7WVwpDACAbrXgUINxAYFSC3MQEJerifCvHqivUxMcCCrIcbLcDm84YbQ/5++sTzqZaK8zIIm2YAlsTZQMy83EmFGI03zMqz4qhq0VcBorToIAUCAAQDBm54wNDH87wAAAABJRU5ErkJggg==", + "ui_gauge.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAG7AAABuwBHnU4NQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAF4SURBVEiJ7ZTPK0RRHMXPnUSywGgshpXxLxgW2LBTytLKgoUiRcmOLJSyY6dEyX8wmq2FhYU1hfzYSGpmYzTNLHws5jtczzM/rOfU69s953vO/d7Xu09qoIG64SqJQJekIUlxo54lXTjnMnXtAiSBUyAPFANPHkgBA1UnBCKStiStmFaQdC7p3lr6JA1LapGEpB1J6865j78mO7ApcsAG0B7S0wFsAu/Wu/9X2II1ZICRGl7LKJA1z3xQjAKvJk5WC/N8U+Z5ATp9YcmEVK1hnjdt3kVJihg/YfWo3kBJh4EMCXiyXeLhnh8TDQLT3rrHvI9+U87I5hoCr4B+b91i3jfp+8hZq9EqYXOS2pxzdx5d9mT9wFuroV+/hbVKWpZ0FpCSVm/8wLTVmQoDbqt0U44DfNmT/mKAbvtIC8BYyHS9wANwDTR5/Lh3GWJB05qJl0DwjqcoIeVxznqLwOqv8wARYA9IhGgx4ASYDfAJYNd+Kg008F98AoTJY9ZKCu6sAAAAAElFTkSuQmCC", + "ui_numeric.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAG7AAABuwBHnU4NQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEUSURBVEiJ7dK9LgRhFIfxsz4SttgaEZ1CJEoNCYVoRUeLRqfYGxCJULoFoZNIFLqtRKFQuQFBrbIivn4K7zKZ3UVCoZinOjln/s97ZuaNKCgoaAa96Go3HMAtNjO9ZVzjAWcYTf0KjvCMe6zlZfO49M5m6g2mwC5mcYVamlXxiDns4QVDWeELdnLCPqw0HkQNF6nuwXCq1/GE/qxwGJ1ZYe4NZlJoI9ffTZlqq2/YUogp1HGKcm42ntlw+lshJnCHE1Qy/RFMprqcclutf/dnqBIRBxHRHRGHEbGAeqlU2o+I5YhYxWJEjKXI+ZcbYkkzN43DcIzXdKW2UfpqwR/h/WJ3/1rUjo8V4S+EHX8hKSj4b7wBmFxhytCBdoQAAAAASUVORK5CYII=", + "ui_slider.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAG7AAABuwBHnU4NQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABVSURBVEiJ7dNBCgAgCARA7f9/tlOQIiJpJOEcQ0oXA2j/Q+2QiIgVIap1mhHtSGIvy87cl2wT3O1wKZVhOvcoAL4oem1sTzJMZ4588mN6bbgSGba4CZuaJByfIWmXAAAAAElFTkSuQmCC", + "ui_switch.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAG7AAABuwBHnU4NQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEJSURBVEiJ7ZNNSsNQFEbPc9AKLkAHgh35M3QLLYK0W7HqetyK0q7BUn8GohRxasBWhE6Og6byDHlpx5oDGeTm3pOb5AvU1PwH1E31Qh2rM3WeOGZ5z7naXM6HgmwXuAG2ga2S+30CE2CYn7eBI+AZ6IQQ3oqbPapfiY3e1dOSJ+qqH+pDvCnqpZolZFmZrCCdq/0QFcfAfmLmLoRwnBLm8yMgbES1VkX/sOLakgHQioWuMbSSWDip6Guv4WoDL7HwikUsythTuymT2gMOc8dPsbkiNlmZVO3lsblXG2XBvgZ2SAf7lcUHAOgAB8ATcPIr2JG0ofbVkTqt+PWm6q16pjZSr6Om5k/wDYhUJfwAsEtnAAAAAElFTkSuQmCC", + "ui_template.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAG7AAABuwBHnU4NQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEaSURBVEiJ7dE/L4NRGAXw90W6EKMahEGMoh2wqUVC7d3EZjdZjGb1GXwIk6WpiVHMJEQwNUHjT+JncCXN9bZCGomkZ7r3nPOce3OeJOmhh38I7GC4W2GDeMLkb4b7MrgV3CBt5/lCBONEkiQnKEfSUpIkh2maCtoxxr/7WQl3eMRMpJ1iPZwLaAbvQruwDbzgErORNoo3jLVwBZzjFVtxWNUHahjJeGwNZxl8HvUwW20VGrhvt0HsY6+NNoUHNFrJSujkFqVoIMU1VjPCFkOPTVRisYCLuBNM4xlDkf+z8yvMZf0+7mQ5cJuoRb5y8NSRzwxrMefCkorhfoDtyFPELnIdwzLC+8Ky5n802CFwAEfo70pgDz38Ad4Br8tc7FtGcAwAAAAASUVORK5CYII=", + "ui_text.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAG7AAABuwBHnU4NQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEWSURBVEiJ7ZMhS0RBFEbPyDMYhGXB5poFm2GNJpHFplXQ32AVYYO4xSIGQTAqGhQ0mGwmDQYRZJPYXGQRMYnwjsFZGQyy4YUN75SB716Gc+8wUFJSUgBqU/3qt3+oaIHfC9W62vaHN3UlbVTX1Xv1SB2L2ZR6oT6qp2otNVwGOsAi0Aa2kloG1IAW0AB21BHgEqgAm8A0sJ8aDKtz6rb6pOZqiDvM4wWoB+qLOhOnacS8qmap4TGwBzwD1wAhBJN6iGfvgbI/eQUYTw3f1TN1Ur1V85g3o8muOq921BN1VH1Vr9SFuMeb1HADmAXOgTsgqBNJ/RM4BB6AtRDCB7AEVON0XWCVgae3UFT/a+yXwn9KSckg8A2LRsxzeZWjFAAAAABJRU5ErkJggg==", + "ui_toast.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAG7AAABuwBHnU4NQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADeSURBVEiJ7ZKxCQJBFERnRQ5BUCzAxEB7sAB7EGzB6EJzE0OLsAGbMDW0AROTM9E70GcyyiknihiI3MDn/52dP8vuX6lEiT9EkCQg+4pZCFHFdfoFv1SSroYdSRNJW69PbxicnXeSZpK6tx0gBlpABAyBFZABB+d8XLmVtZF747xhBiTAHOiZ6wMLG6SOg7m+NT33JHdzyJ1+dOMSGAABaANTR9vcwJrUPdkzw8drbYAxUAdqwAhYP3sO6fW3wZq966aHUSkShxCi6otJBudGjis0e2vzE/y+YYkSf4kLDcYTu4mDJeQAAAAASUVORK5CYII=", + "plc-read.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAYAAAAe2bNZAAABXUlEQVR4AeyUTa7CMAyEX3kCASs4A2vufxDWnAGxAQSCMiPhKolqNy6hAqlVRnEcO/7q/kz+vugaYbSHMXZm7IzWAc3vfmfquq60w971RzAo1DlQ8NEVhJheI4LpdULBpN+AqZQLjVi1bcFvDj5aMwCb7s4A5Ii8XqMLyA3TiyIzKQuGd0TJmbQpWXtmKy8LxlMsjGVhUeoP12KrMHIIZwmGHf3wsG6GxOTOTExjVZg0kGu8vDXnUkqBVBgUboZWvAmAocVYfqRFnVZhrENy91hMlObQn/qyYJhISTJtStbeWcvNgvEWs+I1EOYMCmOBmDB80z3iYZa6QJg7aGdY0NJXw0zYzndl3b21F3UGEEX/sFbhtr0Ipi1gSN8LplxJfIEVNIWW0ByiTf3DXkBraANtoVlYuTgMHzV0g07QBaJN3WGfoQO0h3bQ9aMw4eFeu3hnvABh/AgTdiO0nwAAAP//+PePKAAAAAZJREFUAwCtHPpHGrQtpgAAAABJRU5ErkJggg==", + "plc-write.png": + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAYAAAAe2bNZAAABY0lEQVR4AeyU3U7DMAyF2yEQcAXPwDXv/yBc8wyIG0BMW3eONHdOZadx20zb1CpHcRzH/ur+bJoLulYY72GsnVk743XA81d9Z7qua73Cln8yDAqNDhTcjwUhph+TYfoMCxrXAcP2lt5061w4/2JtwW+ObGciQFZ2gHxbfs+XhfEO1fKPwkS7w3hKgGlTss7NCQwPifQh+vS6lp3A5IrkgLgnkhxYJz88rPshMcO5GIYHmY1zifDydiVxOiYEgwLJ3Uoi+kXiG86yz3m4J+sEhoEiCZCZfrFrzQmMVyQCwlhKctGmZJ2bR2FKE+WKlO5lYc4JQmAXJgLCrywiFrbkwljBtX03A7Pho5wr3e3JnQFE+A+rC1v2ZBgr2VzfEWZumtN5fFUtdA89Q48QbeoO9hP0Cr1B79DD6WTTLA7DxwdtoR/oD6JN7WD/Ql/QJ/QB/VeF0cmj9uKdiQLo+BVGd0PbBwAAAP//lELFSQAAAAZJREFUAwBkHfpHEDPmHQAAAABJRU5ErkJggg==", + "ff-logo.svg": + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5MCIgaGVpZ2h0PSIxMzUiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDkwIDEzNSI+PHNjcmlwdCB4bWxucz0iIi8+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjAwNzggMCAwIDEuMDA3OCAtNjcuMDA3IC02NS45MTQpIj4KICA8cGF0aCBkPSJtNzcuNzcgOTIuN2MtMy40OTcgMC02LjMxMSAyLjgxNi02LjMxMSA2LjMxMy0wLjAwNTIgMTEuNTUtMC4wMTMxNiAyMy4xMS0wLjAxNDk5IDM0LjY2IDcuNSAwLjA0NDQgMTUuMDEgMC4yMTcgMjIuNDktMC4zMTgzIDEwLjQzLTAuOTUxMSAxOS42MS02LjU1MiAyOS4yMi0xMC4yMyA4Ljc0Mi0zLjY5NyAxOC4xMy01Ljk0MSAyNy42Ni01Ljc0MWwtMWUtMyAtMTguMzhjNGUtMyAtMy40OTgtMi44MTUtNi4zMTMtNi4zMTEtNi4zMTN6bTczLjA1IDM3LjE5Yy0xLjA1NSAwLjAxNjktMi4xMTEgMC4wNDU3LTMuMTY2IDAuMDg4OS0xMS42NC0wLjA0NDgtMjEuOTYgNS45NzQtMzIuNDYgMTAuMTkgOC4xMTUgMy4yODMgMTUuOTUgNy40NTQgMjQuNTUgOS4zODkgMy42NzUgMC41NTc2IDcuMzcyIDAuODI5MiAxMS4wOCAwLjkwODV6bS03MS4xMyAxNi41N2MtMi43NDcgNmUtMyAtNS40OTQgMC4wMzQ2LTguMjM5IDAuMDQ4NiAwLjAwMjQgNi40MTYgMC4wMDcyIDEyLjgzIDAuMDE3NTcgMTkuMjUgMC4wMDM3IDMuNDk4IDIuODE1IDYuMzEzIDYuMzExIDYuMzEzaDY2LjczYzMuNDk3IDAgNi4zMTEtMi44MTYgNi4zMTEtNi4zMTN2LTIuNzc4Yy04LjIwMy0wLjA1MzctMTYuNC0xLjMwNC0yNC4wNC00LjM3NC0xMS44Mi00LjEyNC0yMi44NS0xMS40NS0zNS42OC0xMS45NC0zLjc5OC0wLjE3OTQtNy42MDItMC4yMTQ3LTExLjQxLTAuMjA2MnoiIGZpbGw9IiNmZmYiLz4KIDwvZz4KPHNjcmlwdCB4bWxucz0iIi8+PC9zdmc+", + "ff-logo-red.svg": + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5MCIgaGVpZ2h0PSIxMzUiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDkwIDEzNSI+CiA8ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjAwNzggMCAwIDEuMDA3OCAtNjcuMDA3IC02NS45MTQpIj4KICA8cGF0aCBkPSJtNzcuNzcgOTIuN2MtMy40OTcgMC02LjMxMSAyLjgxNi02LjMxMSA2LjMxMy0wLjAwNTIgMTEuNTUtMC4wMTMxNiAyMy4xMS0wLjAxNDk5IDM0LjY2IDcuNSAwLjA0NDQgMTUuMDEgMC4yMTcgMjIuNDktMC4zMTgzIDEwLjQzLTAuOTUxMSAxOS42MS02LjU1MiAyOS4yMi0xMC4yMyA4Ljc0Mi0zLjY5NyAxOC4xMy01Ljk0MSAyNy42Ni01Ljc0MWwtMWUtMyAtMTguMzhjNGUtMyAtMy40OTgtMi44MTUtNi4zMTMtNi4zMTEtNi4zMTN6bTczLjA1IDM3LjE5Yy0xLjA1NSAwLjAxNjktMi4xMTEgMC4wNDU3LTMuMTY2IDAuMDg4OS0xMS42NC0wLjA0NDgtMjEuOTYgNS45NzQtMzIuNDYgMTAuMTkgOC4xMTUgMy4yODMgMTUuOTUgNy40NTQgMjQuNTUgOS4zODkgMy42NzUgMC41NTc2IDcuMzcyIDAuODI5MiAxMS4wOCAwLjkwODV6bS03MS4xMyAxNi41N2MtMi43NDcgNmUtMyAtNS40OTQgMC4wMzQ2LTguMjM5IDAuMDQ4NiAwLjAwMjQgNi40MTYgMC4wMDcyIDEyLjgzIDAuMDE3NTcgMTkuMjUgMC4wMDM3IDMuNDk4IDIuODE1IDYuMzEzIDYuMzExIDYuMzEzaDY2LjczYzMuNDk3IDAgNi4zMTEtMi44MTYgNi4zMTEtNi4zMTN2LTIuNzc4Yy04LjIwMy0wLjA1MzctMTYuNC0xLjMwNC0yNC4wNC00LjM3NC0xMS44Mi00LjEyNC0yMi44NS0xMS40NS0zNS42OC0xMS45NC0zLjc5OC0wLjE3OTQtNy42MDItMC4yMTQ3LTExLjQxLTAuMjA2MnoiIGZpbGw9IiNEQTNEMEIiLz4KIDwvZz4KPHNjcmlwdCB4bWxucz0iIi8+PC9zdmc+", + "advanced-ai-node.svg": + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIiB3aWR0aD0iMjAiPgogICAgPHBhdGggZmlsbD0id2hpdGUiIGQ9Im0xNzYtMTIwLTU2LTU2IDMwMS0zMDItMTgxLTQ1IDE5OC0xMjMtMTctMjM0IDE3OSAxNTEgMjE2LTg4LTg3IDIxNyAxNTEgMTc4LTIzNC0xNi0xMjQgMTk4LTQ1LTE4MS0zMDEgMzAxWm0yNC01MjAtODAtODAgODAtODAgODAgODAtODAgODBabTM1NSAxOTcgNDgtNzkgOTMgNy02MC03MSAzNS04Ni04NiAzNS03MS01OSA3IDkyLTc5IDQ5IDkwIDIyIDIzIDkwWm0xNjUgMzIzLTgwLTgwIDgwLTgwIDgwIDgwLTgwIDgwWk01NjktNTcwWiIvPgo8c2NyaXB0IHhtbG5zPSIiLz48L3N2Zz4=", + "classification-node.svg": + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIiB3aWR0aD0iMjAiPgogICAgPHBhdGggZmlsbD0id2hpdGUiIGQ9Ik0yMTYtNzkydjYyNC02MjQgMTY4LTE2OFptMCA2OTZxLTI5LjcgMC01MC44NS0yMS4xNVExNDQtMTM4LjMgMTQ0LTE2OHYtNjI0cTAtMjkuNyAyMS4xNS01MC44NVExODYuMy04NjQgMjE2LTg2NGgzMTJsMTkyIDE5MnYxNDlxLTE4LTQtMzYtNXQtMzYgMXYtOTdINDgwdi0xNjhIMjE2djYyNGgyNDhxMTIgMjEgMjggMzkuNVQ1MjgtOTZIMjE2Wm00NTUuNzctOTZRNzEyLTE5MiA3NDAtMjE5Ljc3cTI4LTI3Ljc4IDI4LTY4UTc2OC0zMjggNzQwLjE2LTM1NnEtMjcuODQtMjgtNjguMTYtMjgtMzIgMC02NCAyNHQtMzIgNzJxMCA0MC4zMiAyNy43NyA2OC4xNiAyNy43OCAyNy44NCA2OCAyNy44NFpNODYxLTQ4bC05OC05OXEtMjAgMTMtNDMuMDMgMjB0LTQ3LjQ3IDdRNjAyLTEyMCA1NTMtMTY5dC00OS0xMTlxMC03MCA0OS0xMTl0MTE5LTQ5cTcwIDAgMTE5IDQ5dDQ5IDExOXEwIDI0LjYxLTcgNDcuODFRODI2LTIxNyA4MTMtMTk3bDk5IDk4LTUxIDUxWiIvPgo8c2NyaXB0IHhtbG5zPSIiLz48L3N2Zz4=", + "depth-estimation-node.svg": + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIiB3aWR0aD0iMjAiPgogICAgPHBhdGggZmlsbD0id2hpdGUiIGQ9Ik00ODAtMTE4IDEyMC0zOThsNjYtNTAgMjk0IDIyOCAyOTQtMjI4IDY2IDUwLTM2MCAyODBabTAtMjAyTDEyMC02MDBsMzYwLTI4MCAzNjAgMjgwLTM2MCAyODBabTAtMjgwWm0wIDE3OCAyMzAtMTc4LTIzMC0xNzgtMjMwIDE3OCAyMzAgMTc4WiIvPgo8c2NyaXB0IHhtbG5zPSIiLz48L3N2Zz4=", + "object-detection-node.svg": + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAtOTYwIDk2MCA5NjAiIHdpZHRoPSIyNHB4Ij4KICAgIDxwYXRoIGZpbGw9IndoaXRlIiBkPSJtMjYwLTUyMCAyMjAtMzYwIDIyMCAzNjBIMjYwWk03MDAtODBxLTc1IDAtMTI3LjUtNTIuNVQ1MjAtMjYwcTAtNzUgNTIuNS0xMjcuNVQ3MDAtNDQwcTc1IDAgMTI3LjUgNTIuNVQ4ODAtMjYwcTAgNzUtNTIuNSAxMjcuNVQ3MDAtODBabS01ODAtMjB2LTMyMGgzMjB2MzIwSDEyMFptNTgwLTYwcTQyIDAgNzEtMjl0MjktNzFxMC00Mi0yOS03MXQtNzEtMjlxLTQyIDAtNzEgMjl0LTI5IDcxcTAgNDIgMjkgNzF0NzEgMjlabS01MDAtMjBoMTYwdi0xNjBIMjAwdjE2MFptMjAyLTQyMGgxNTZsLTc4LTEyNi03OCAxMjZabTc4IDBaTTM2MC0zNDBabTM0MCA4MFoiLz4KPHNjcmlwdCB4bWxucz0iIi8+PC9zdmc+", + }, + u = + "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBMaWNlbnNlOiBQRC4gTWFkZSBieSBtb25vLWNvbXBhbnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9tb25vLWNvbXBhbnkvbW9uby1pY29ucyAtLT4KPHN2ZyB3aWR0aD0iODAwcHgiIGhlaWdodD0iODAwcHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTAgNGE2IDYgMCAxIDAgMCAxMiA2IDYgMCAwIDAgMC0xMnptLTggNmE4IDggMCAxIDEgMTQuMzIgNC45MDZsNS4zODcgNS4zODdhMSAxIDAgMCAxLTEuNDE0IDEuNDE0bC01LjM4Ny01LjM4N0E4IDggMCAwIDEgMiAxMHoiIGZpbGw9IiMwRDBEMEQiLz48L3N2Zz4=", + l = + "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBMaWNlbnNlOiBQRC4gTWFkZSBieSBtb25vLWNvbXBhbnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9tb25vLWNvbXBhbnkvbW9uby1pY29ucyAtLT4KPHN2ZyB3aWR0aD0iODAwcHgiIGhlaWdodD0iODAwcHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNOCAzYTEgMSAwIDAgMSAxLTFoNmExIDEgMCAwIDEgMSAxaDJhMiAyIDAgMCAxIDIgMnYxNWEyIDIgMCAwIDEtMiAySDZhMiAyIDAgMCAxLTItMlY1YTIgMiAwIDAgMSAyLTJoMnptMCAySDZ2MTVoMTJWNWgtMnYxYTEgMSAwIDAgMS0xIDFIOWExIDEgMCAwIDEtMS0xVjV6bTYtMWgtNHYxaDRWNHoiIGZpbGw9IiMwRDBEMEQiLz48L3N2Zz4=", + c = + "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBMaWNlbnNlOiBQRC4gTWFkZSBieSBtb25vLWNvbXBhbnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9tb25vLWNvbXBhbnkvbW9uby1pY29ucyAtLT4KPHN2ZyB3aWR0aD0iODAwcHgiIGhlaWdodD0iODAwcHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTIgMmExIDEgMCAwIDEgMSAxdjEwLjU4NmwyLjI5My0yLjI5M2ExIDEgMCAwIDEgMS40MTQgMS40MTRsLTQgNGExIDEgMCAwIDEtMS40MTQgMGwtNC00YTEgMSAwIDEgMSAxLjQxNC0xLjQxNEwxMSAxMy41ODZWM2ExIDEgMCAwIDEgMS0xek01IDE3YTEgMSAwIDAgMSAxIDF2MmgxMnYtMmExIDEgMCAxIDEgMiAwdjJhMiAyIDAgMCAxLTIgMkg2YTIgMiAwIDAgMS0yLTJ2LTJhMSAxIDAgMCAxIDEtMXoiIGZpbGw9IiMwRDBEMEQiLz48L3N2Zz4=", + I = + "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBMaWNlbnNlOiBNSVQuIE1hZGUgYnkgaGFsZm1hZ2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9oYWxmbWFnZS9tYWplc3RpY29ucyAtLT4KPHN2ZyB3aWR0aD0iODAwcHgiIGhlaWdodD0iODAwcHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBmaWxsPSJub25lIj48cGF0aCBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBkPSJNOS41IDVIOWEyIDIgMCAwIDAtMiAydjJjMCAxLS42IDMtMyAzIDEgMCAzIC42IDMgM3YyYTIgMiAwIDAgMCAyIDJoLjVtNS0xNGguNWEyIDIgMCAwIDEgMiAydjJjMCAxIC42IDMgMyAzLTEgMC0zIC42LTMgM3YyYTIgMiAwIDAgMS0yIDJoLS41Ii8+PC9zdmc+", + N = { + base64: y("#DEBD5C"), + batch: y("#E2D96E"), + catch: y("#e49191"), + change: y("#E2D96E"), + rbe: y("#E2D96E"), + complete: y("#C0EDC0"), + comment: y(), + csv: y("#DEBD5C"), + debug: y("#87a980"), + delay: y("#E6E0F8"), + exec: y("darksalmon"), + feedparse: y("#C0DEED"), + file: y("BurlyWood"), + "file in": y("BurlyWood"), + function: y("#fdd0a2"), + html: y("#DEBD5C"), + "http response": y("rgb(231, 231, 174)"), + "http in": y("rgb(231, 231, 174)"), + "http request": y("rgb(231, 231, 174)"), + inject: y("#a6bbcf"), + join: y("#E2D96E"), + json: y("#DEBD5C"), + junction: y("rgb(217, 217, 217)"), + "link in": y("#ddd"), + "link out": y("#ddd"), + "link call": y("#ddd"), + "mqtt in": y("#d8bfd8"), + "mqtt out": y("#d8bfd8"), + "tcp in": y("silver"), + "tcp out": y("silver"), + "tcp request": y("silver"), + "udp in": y("silver"), + "udp out": y("silver"), + markdown: y("#DEBD5C"), + postgresql: y("#5b85a7"), + range: y("#E2D96E"), + sort: y("#E2D96E"), + split: y("#E2D96E"), + subflow: y("#ddd"), + switch: y("#E2D96E"), + trigger: y("#E6E0F8"), + template: y("rgb(243, 181, 103)"), + ui_button: y("rgb(176, 223, 227)"), + ui_list: y("rgb( 63, 173, 181)"), + ui_svg_graphics: y("rgb( 63, 173, 181)"), + ui_template: y("rgb( 63, 173, 181)"), + ui_toast: y("rgb(119, 198, 204)"), + ui_upload: y("rgb( 63, 173, 181)"), + ui_audio: y("rgb(119, 198, 204)"), + ui_chart: y("rgb(119, 198, 204)"), + ui_gauge: y("rgb(119, 198, 204)"), + ui_text: y("rgb(119, 198, 204)"), + ui_date_picker: y("rgb(176, 223, 227)"), + ui_dropdown: y("rgb(176, 223, 227)"), + ui_form: y("rgb(176, 223, 227)"), + ui_numeric: y("rgb(176, 223, 227)"), + ui_slider: y("rgb(176, 223, 227)"), + ui_switch: y("rgb(176, 223, 227)"), + ui_text_input: y("rgb(176, 223, 227)"), + ui_colour_picker: y("rgb(176, 223, 227)"), + "ui-button": y("rgb(160, 230, 236)"), + "ui-button-group": y("rgb(160, 230, 236)"), + "ui-chart": y("rgb(90, 210, 220)"), + "ui-control": y("rgb(32, 160, 170)"), + "ui-dropdown": y("rgb(160, 230, 236)"), + "ui-event": y("rgb(32, 160, 170)"), + "ui-form": y("rgb(160, 230, 236)"), + "ui-gauge": y("rgb(90, 210, 220)"), + "ui-markdown": y("rgb(39, 183, 195)"), + "ui-notification": y("rgb(90, 210, 220)"), + "ui-radio-group": y("rgb(160, 230, 236)"), + "ui-slider": y("rgb(160, 230, 236)"), + "ui-switch": y("rgb(160, 230, 236)"), + "ui-table": y("rgb(90, 210, 220)"), + "ui-template": y("rgb(39, 183, 195)"), + "ui-text": y("rgb(90, 210, 220)"), + "ui-text-input": y("rgb(160, 230, 236)"), + "websocket in": y("rgb(215, 215, 160)"), + "websocket out": y("rgb(215, 215, 160)"), + yaml: y("#DEBD5C"), + xml: y("#DEBD5C"), + BlogPages: y("#ddeeff"), + BlogDetails: y("#ddeeff"), + BlogPageInfo: y("#ddeeff"), + BlogChanges: y("#ddeeff"), + PubMedium: y("#ddee44"), + Topic: y("#d0c9f6"), + Observation: y("#f4adf3"), + Question: y("#e0a4f3"), + Thought: y("#cb9cf3"), + Idea: y("#88baff"), + Analogy: y("#86bfff"), + Aphorism: y("#84c3ff"), + Poesie: y("#83c7ff"), + Humour: y("#81ccff"), + Treasure: y("#7fd0ff"), + Consequence: y("#f6c1cc"), + Advantage: y("#efacbf"), + Disadvantage: y("#e796b1"), + Text: y("#c8ffb5"), + "Blog-Post": y("#d0fdc2"), + Comment: y("#d9fcce"), + "Code-Base": y("#e1fbda"), + Sketch: y("#e1fbda"), + Inspiration: y("#dfdfb6"), + Quote: y("#e5e5c0"), + Definition: y("#eaebca"), + Book: y("#f0f0d4"), + Author: y("#f5f6de"), + "nnb-input-node": y("#ffefef"), + "nnb-layer-node": y("#ffffef"), + "nnb-output-node": y("#efefef"), + "nnb-backprop": y("#e3edef"), + "nnb-trainer": y("#e5e4ef"), + Seeker: y("#e5e4ef"), + Sink: y("#e5e4ef"), + Screenshot: y("#e5e4ef"), + Orphans: y("#e5e4ef"), + IsMobile: y("#e5e4ef"), + Navigator: y("#e5e4ef"), + DrawSVG: y("#e5e4ef"), + GetFlows: y("#e5e4ef"), + SendFlow: y("#e5e4ef"), + TriggerImport: y("#e5e4ef"), + cronplus: y("#a6bbcf"), + "i2c scan": y("rgb(227, 82, 83)"), + "i2c in": y("rgb(227, 82, 83)"), + "i2c out": y("rgb(227, 82, 83)"), + "jimp-image": y("#ffaaaa"), + "image viewer": y("#ffaaaa"), + "annotate-image": y("#f1c2f0"), + "buffer-maker": y("#0090d4"), + "buffer-parser": y("#0090d4"), + "FINS Read": y("#0090d4"), + "FINS Write": y("#0090d4"), + "FINS Read Multiple": y("#0090d4"), + "FINS Transfer": y("#0090d4"), + "FINS Fill": y("#0090d4"), + "FINS Control": y("#0090d4"), + "s7comm read": y("#009999"), + "s7comm write": y("#009999"), + "MC Read": y("#0090d4"), + "MC Write": y("#0090d4"), + "modbus-response": y("#E9967A"), + "modbus-read": y("#E9967A"), + "modbus-getter": y("#E9967A"), + "modbus-write": y("#E9967A"), + "modbus-flex-getter": y("#E9967A"), + "modbus-flex-write": y("#E9967A"), + "modbus-flex-server": y("#E9967A"), + "modbus-flex-connector": y("#E9967A"), + "modbus-response-filter": y("#E9967A"), + "modbus-flex-sequencer": y("#E9967A"), + "modbus-flex-fc": y("#E9967A"), + "OpcUa-Item": y("#3FADB5"), + "OpcUa-Client": y("#3FADB5"), + "OpcUa-Browser": y("#3FADB5"), + "OpcUa-Server": y("#3FADB5"), + "OpcUa-Event": y("#3FADB5"), + "OpcUa-Method": y("#3FADB5"), + "OpcUa-Rights": y("#3FADB5"), + "OpcUa-Discovery": y("#3FADB5"), + "s7 in": y("#3FADB5"), + "s7 out": y("#3FADB5"), + "s7 control": y("#3FADB5"), + "project link out": y("#87D8CF"), + "project link in": y("#87D8CF"), + "project link call": y("#87D8CF"), + "ff-mqtt-in": y("#d8bfd8"), + "ff-mqtt-out": y("#d8bfd8"), + "tables-query": y("#ffffff"), + "mcp-tool": y("#87ceeb"), + "mcp-resource": y("#98fb98"), + "mcp-prompt": y("#ffd700"), + "mcp-response": y("#ffa500"), + "advanced-ai": y("#f69e00"), + "image-classification": y("#f69e00"), + "image-depth": y("#f69e00"), + "object-detection": y("#f69e00"), + _default: y(), + }; + function j(t, e) { + return null != t && Object.prototype.hasOwnProperty.call(t, e); + } + function L(t) { + let e = N[(t = t || "_default")]; + return ( + e || + (t.startsWith("subflow:") + ? (e = N.subflow) + : t.startsWith("ui-") + ? (e = N["ui-template"]) + : t.startsWith("ui_") && (e = N.ui_template)), + e || N._default + ); + } + function D(t) { + let e = s[t.type] || s._default; + return "junction" !== t.type && (!1 === t.l ? (e = s._default_no_label) : !0 === t.l && (e = s._default)), e; + } + function y(t, e) { + return { fill: t || "#ffffff", stroke: e || "rgb(153, 153, 153)" }; + } + function b() { + if ("undefined" != typeof document) return document; + if (void 0 !== globalThis.__document) return globalThis.__document; + const t = Array.prototype.slice.call(arguments) || [this]; + for (const e of t) { + const t = e && e.constructor && e.constructor.name; + if ("HTMLDocument" === t) return e; + if ("HTMLDivElement" === t || "HTMLBodyElement" === t || "HTMLHtmlElement" === t || "HTMLElement" === t) + return e.ownerDocument; + if ("SVGElement" === t || "SVGSVGElement" === t) return e.ownerDocument; + } + return "undefined" != typeof window ? window.document : null; + } + function w(t, e, i, n) { + return "number" == typeof t && !isNaN(t) ? Math.min(Math.max(t, e), i) : n || e; + } + function p(t) { + return { + hasHorizontalScrollbar: t.scrollWidth > t.clientWidth, + hasVerticalScrollbar: t.scrollHeight > t.clientHeight, + }; + } + function m(t, e) { + let i = 1; + const n = t.getAttribute("transform"); + if (n) { + const t = n.match(/scale\(([^,]+)\)/); + t && (i = w(parseFloat(t[1] || 1), 0.25, 3, 1)); + } + const M = t.querySelector("g.outerContainer"); + x(M, i, !0), + (e.onwheel = function (t) { + if (t.ctrlKey || t.metaKey) { + t.preventDefault(); + let e = C(M); + (e -= 0.075 * Math.sign(t.deltaY)), (e = w(e, 0.2, 3, 1)), x(M, e); + } + }); + const o = (function (t) { + const e = b(t, this); + if (!e) return null; + let i = t.querySelector(".toolbar"); + i || (i = v(t)); + let n = i.querySelector(".zoom-controls"); + if (n) + return { + zoomIn: i.querySelector(".zoom-in"), + zoomOut: i.querySelector(".zoom-out"), + zoomReset: i.querySelector(".zoom-reset"), + }; + (n = e.createElement("div")), n.classList.add("zoom-controls"), n.classList.add("button-group"); + const M = e.createElement("button"); + M.classList.add("red-ui-footer-button", "icon-button-bg", "zoom-in"), + (M.innerHTML = "+"), + (M.title = "Zoom In (Ctrl + Mouse Wheel Up)"); + const o = e.createElement("button"); + o.classList.add("red-ui-footer-button", "icon-button-bg", "zoom-reset"), (o.title = "Zoom & Scroll Reset"); + const A = e.createElement("button"); + A.classList.add("red-ui-footer-button", "icon-button-bg", "zoom-out"), + (A.innerHTML = "-"), + (A.title = "Zoom Out (Ctrl + Mouse Wheel Down)"), + n.appendChild(A), + n.appendChild(o), + n.appendChild(M), + i && i.appendChild(n); + return { zoomIn: M, zoomOut: A, zoomReset: o }; + })(e); + (o.zoomIn.onclick = function () { + const t = w(C(M) + 0.1, 0.2, 3, 1); + x(M, t); + }), + (o.zoomOut.onclick = function () { + const t = w(C(M) - 0.1, 0.2, 3, 1); + x(M, t); + }), + (o.zoomReset.onclick = function () { + !(function (t) { + const e = t.getAttribute("_scale_original") || 1; + x(t, e); + })(M), + (function (t) { + (t.scrollLeft = t.getAttribute("_scroll_x") || 0), (t.scrollTop = t.getAttribute("_scroll_y") || 0); + })(e.querySelector(".red-ui-workspace-chart")); + }); + } + function C(t) { + return parseFloat(t.getAttribute("_scale_current") || 1); + } + function x(t, e, M = !1) { + t.setAttribute("transform", `scale(${e})`); + const o = t.ownerSVGElement || t; + (o.style.width = i * e + "px"), + (o.style.height = n * e + "px"), + t.setAttribute("_scale_current", e), + M && t.setAttribute("_scale_original", e); + } + function T(t, e, i, n = !1) { + (t.scrollLeft = e), (t.scrollTop = i), n && (t.setAttribute("_scroll_x", e), t.setAttribute("_scroll_y", i)); + } + function S(t, e, M) { + const o = + M.autoZoom || M.autoScroll + ? (function (t, e) { + const M = 0.2, + o = 1, + A = e.container.querySelector(".red-ui-workspace-chart"), + a = A.getBoundingClientRect(), + g = a.width - 25, + s = a.height - 25; + let r = i, + d = n, + u = 0, + l = 0; + const c = e.flowId, + I = t.filter((t) => "tab" !== t.type && "subflow" !== t.type && t.z === c); + if (0 === I.length) return { scale: 1, scrollX: 0, scrollY: 0 }; + for (const t of I) { + if ("tab" === t.type || "subflow" === t.type || "junction" === t.type) continue; + const e = t.x || 0, + i = t.y || 0, + n = D(t), + M = (n.width || 100) / 2, + o = (n.height || 30) / 2, + A = e - M, + a = i - o, + g = e + M, + s = i + o; + (r = Math.min(r, A)), (d = Math.min(d, a)), (u = Math.max(u, g)), (l = Math.max(l, s)); + } + let N = 1; + const j = u - r, + L = l - d, + y = g / j, + b = s / L; + (j > g || L > s) && ((N = Math.min(y, b)), (N *= 0.95)); + N = w(N, M, o, 1); + let p = r, + m = d; + p < 50 && (p = 0); + m < 40 && (m = 0); + p > 0 && (p -= 50); + m > 0 && (m -= 40); + return ( + (p = w(p * N, 0, A.scrollWidth)), + (m = w(m * N, 0, A.scrollHeight)), + { scale: N, scrollX: p, scrollY: m, minX: r, minY: d, maxX: u, maxY: l } + ); + })(e, M) + : null; + if (((t = t.ownerSVGElement || t), M.zoom && o && M.autoZoom)) { + x(t.querySelector("g.outerContainer"), o.scale, !0); + } + return o && M.autoScroll && T(t.parentElement, o.scrollX, o.scrollY, !0), o; + } + function z(t, e, i) { + const n = t.parentElement, + M = t.querySelector("g.outerContainer"), + o = n.scrollLeft, + A = n.scrollTop, + a = C(M), + g = i || e.flowId || "global"; + n.setAttribute(`data-tab-${g}-x`, o), + n.setAttribute(`data-tab-${g}-y`, A), + n.setAttribute(`data-tab-${g}-scale`, a); + } + function h(t, e, i) { + const n = t.parentElement, + M = t.querySelector("g.outerContainer"), + o = i || e.flowId || "global", + A = n.getAttribute(`data-tab-${o}-x`), + a = n.getAttribute(`data-tab-${o}-y`), + g = n.getAttribute(`data-tab-${o}-scale`); + "string" == typeof A && "string" == typeof a && T(n, A, a), "string" == typeof g && x(M, g); + } + function f(t) { + const e = t.parentElement, + i = t.querySelector("g.outerContainer"); + for (const t in i.dataset) /^tab-\w+-.*/.test(t) && e.removeAttribute(t); + } + function E(t) { + const e = b(t, this).createElement("div"); + return e.classList.add("red-ui-workspace-chart"), t ? (t.appendChild(e), e) : e; + } + function v(t) { + const e = b(t, this); + if (!e) return null; + let i = t.querySelector(".toolbar"); + return i || ((i = e.createElement("div")), i.classList.add("toolbar"), t && t.appendChild(i), i); + } + function O(t, { addDefaultLayer: e = !0, layer: M = 0 } = {}) { + const o = b(t, this), + A = o.createElementNS("http://www.w3.org/2000/svg", "svg"); + A.setAttribute("style", `width:${i}px; height:${n}px;`), t.appendChild(A); + const a = o.createElementNS("http://www.w3.org/2000/svg", "defs"); + A.appendChild(a); + a.innerHTML = + '\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n '; + const g = k("g", { class: "outerContainer" }); + return A.appendChild(g), e && Z(A, { layer: M }), A; + } + function k(t, e, i) { + const n = b(i, this).createElementNS("http://www.w3.org/2000/svg", t); + if ("object" == typeof e) for (const t in e) n.setAttribute(t, e[t]); + return i && i.appendChild(n), n; + } + function Z(t, { layer: e = 0, opacity: i = 1 } = {}) { + let n = t.querySelector("g.outerContainer"); + n || (n = k("g", { class: "outerContainer" }, t)), + n.querySelector("g.flow_grid") || k("g", { class: "flow_grid" }, n); + let M = n.querySelector(`g.flow-layer-${e}`); + for (M || (M = k("g", { class: `flow-layer-${e || 0}` }, n)); M.firstChild; ) M.removeChild(M.firstChild); + return ( + M.setAttribute("opacity", i), + k("g", "flow_group_elements", M), + k("g", "flow_group_select", M), + k("g", "flow_wires", M), + k("g", "flow_nodes", M), + M + ); + } + function B(t) { + if (t.childNodes.length > 0) return; + k("rect", { width: `${i}px`, height: `${n}px`, fill: "url(#grid)" }, t).style.transform = "translate(-1px, -1px)"; + } + function Y(t, e, i, n, M) { + const o = b(M, this).createElement(t); + if ("object" == typeof e) for (const t in e) o.setAttribute(t, e[t]); + return ( + i && "string" == typeof i ? o.classList.add(...i.split(" ")) : Array.isArray(i) && o.classList.add(...i), + "string" == typeof n && (o.textContent = n), + M && M.appendChild(o), + o + ); + } + function U(t) { + const e = [], + i = {}, + n = new Set([ + ...Object.keys(t.changed), + ...Object.keys(t.added), + ...Object.keys(t.deleted), + ...Object.keys(t.moved), + ...Object.keys(t.positionChanged), + ]), + M = t.currentConfig, + o = t.newConfig; + function A(e, i, n, M, o, A) { + const a = { tab: e, item: i, diffType: n, prop: M, value1: o, value2: A, toString: () => "" }, + g = (t) => (t ? `'${t}'` : "''"), + s = (t) => + t + ? g( + (function (t, e, i) { + const n = $[t.type] || $._default, + M = (e && e[t.type]) || {}; + return n(t, M, i); + })(t), + ) + : "'n/a'", + r = t.currentConfig.all[e] || t.newConfig.all[e], + d = s(r), + u = t.currentConfig.all[i] || t.newConfig.all[i], + l = "tab" === i ? r : t.currentConfig.all[i], + c = "tab" === i ? r : t.newConfig.all[i], + I = "tab" === i ? "tab" : "node", + N = /wires\[\d+\]/.test(M); + let j = ""; + N && + (a.value1 && !a.value2 + ? (j = `had wire removed from ${s(l)}`) + : !a.value1 && a.value2 && (j = `was wired up to ${s(c)}`)); + const L = o && ("z" === M || /wires\[\d+\]/.test(M)) ? t.currentConfig.all[o] : null, + D = A && ("z" === M || /wires\[\d+\]/.test(M)) ? t.newConfig.all[A] : null; + return ( + (a.toString = function () { + const t = []; + switch (n) { + case "deleted": + t.push("deleted", I, s(u)); + break; + case "added": + t.push("added", I, s(u)); + break; + case "moved": + t.push(s(u), "moved from ", s(L), "to", s(D)); + break; + case "changed": + "g" === M + ? o && !A + ? t.push(d, s(u), "was removed from group", g(s(o))) + : !o && A + ? t.push(d, s(u), "was added to group", g(s(A))) + : t.push(d, s(u), "moved group from", g(o), "to", g(A)) + : N + ? t.push(d, s(u), j) + : "tab" === i + ? t.push("tab", d, "property", g(a.prop), "was", g(a.value1 || "") + ", now", g(a.value2 || "")) + : t.push(s(u), "property", g(a.prop), "was", g(a.value1 || ""), "now", g(a.value2 || "")); + break; + case "positionChanged": + t.push(s(u), "moved from", a.value1, "to", a.value2); + break; + default: + t.push(d, s(u), g(a.prop), "was", g(a.value1 || ""), "now", g(a.value2 || "")); + } + return t.join(" "); + }), + a + ); + } + function a(t, e) { + const i = t.currentConfig.all, + M = t.newConfig.all, + o = []; + if (!e.v1 || !e.v2) + return ( + e.v1 && o.push(A(e.id, e.id, "tab", "deleted", e.v1, null)), + e.v2 && o.push(A(e.id, e.id, "tab", "added", null, e.v2)), + o + ); + const a = e.v1?.tab ? { ...e.v1.tab.n } : {}; + a.order = e.v1?.order; + const s = e.v2?.tab ? { ...e.v2.tab.n } : {}; + s.order = e.v2?.order; + const r = e.v1?.tab?.nodes || [], + d = e.v2?.tab?.nodes || []; + o.push(...g(e.id, "tab", "", "changed", a, s)); + const u = r.map((t) => t.id), + l = d.map((t) => t.id), + c = new Set([...u, ...l].filter((t) => n.has(t))), + I = (t) => ("number" != typeof t ? null : t), + N = (t, e) => { + const i = { ...e }; + for (const e of t) delete i[e]; + return i; + }; + for (const n of c) { + const A = i[n], + a = M[n], + s = !(!A || !a); + if (t.deleted[n]) o.push(...g(e.id, n, "", "deleted", A, a)); + else if (t.added[n]) o.push(...g(e.id, n, "", "added", A, a)); + else if (s) { + let i = !0; + if ((t.moved[n] && o.push(...g(e.id, n, "", "moved", { z: A.z }, { z: a.z })), t.positionChanged[n])) { + i = !1; + const t = { x: I(A.x), y: I(A.y) }, + M = { x: I(a.x), y: I(a.y) }, + s = JSON.stringify(t), + r = JSON.stringify(M); + o.push(...g(e.id, n, "position", "positionChanged", s, r)); + } + if (i) { + const t = N(["x", "y", "z", "w", "h"], A), + i = N(["x", "y", "z", "w", "h"], a); + o.push(...g(e.id, n, "", "changed", t, i)); + } + } + } + return o; + } + function g(t, e, i, n, M, o) { + const a = []; + if ("deleted" === n) a.push(A(t, e, n, i, M ? "" : "deleted", o ? "" : "deleted")); + else if ("added" === n) a.push(A(t, e, n, i, M ? "added" : "", o ? "added" : "")); + else if (typeof M != typeof o) a.push(A(t, e, "changed", i, M || "", o || "")); + else if (Array.isArray(M)) + for (let A = 0; A < M.length; A++) { + const s = i ? `${i}[${A}]` : `[${A}]`, + r = M[A], + d = o[A]; + a.push(...g(t, e, s, n || "changed", r, d)); + } + else if (M && o && "object" == typeof M && "object" == typeof o) { + const A = Object.keys(M); + for (const s of A) { + const A = /[^a-zA-Z0-9_$]/.test(s), + r = i ? (A ? `${i}["${s}"]` : `${i}.${s}`) : A ? `["${s}"]` : s, + d = M[s], + u = o[s]; + a.push(...g(t, e, r, n || "changed", d, u)); + } + } else M !== o && a.push(A(t, e, n, i, M, o)); + return a; + } + return ( + e.push( + ...(function () { + const e = []; + if (0 === n.size) return e; + i.global = { id: "global", v1: { tab: { nodes: M.globals } }, v2: { tab: { nodes: o.globals } } }; + for (const t of [...M.tabOrder, ...o.tabOrder]) { + const e = M.tabs[t], + n = o.tabs[t], + A = M.tabOrder.indexOf(t), + a = o.tabOrder.indexOf(t); + i[t] = { id: t, v1: { order: A, tab: e }, v2: { order: a, tab: n } }; + } + const A = Object.keys(M.subflows), + g = Object.keys(o.subflows); + for (const t of [...A, ...g]) { + if (i[t]) continue; + const e = M.subflows[t], + n = o.subflows[t]; + i[t] = { id: t, v1: { tab: e }, v2: { tab: n } }; + } + for (const n of Object.keys(i)) e.push(...a(t, i[n])); + const s = new Set(); + return e.filter((t) => { + const e = `${"z" === t.prop && "moved" === t.diffType ? "*" : t.tab}-${t.item}-${t.diffType}-${t.prop}-${ + t.value1 + }-${t.value2}`; + return !s.has(e) && (s.add(e), !0); + }); + })(), + ), + { + get changes() { + return e; + }, + get diff() { + return t; + }, + get tabs() { + return i; + }, + getNodeInfo: (t) => ({ + propertiesChanged: e.filter((e) => e.itemId === t && e.tab !== t), + v1: M.all[t], + v2: o.all[t], + }), + getTabInfo: (t) => ({ + propertiesChanged: e.filter((e) => e.tab === t && "tab" === e.itemId), + nodesChanged: e.filter((e) => e.tab === t && "tab" !== e.itemId), + v1: i[t], + v2: i[t], + }), + } + ); + } + function Q(t) { + t && t.length && "string" != typeof t && "string" == typeof t[0] && (t = [...t].join(" ")); + return `\n :root {\n --red-ui-view-grid-color: #eee;\n --red-ui-view-border: 1px solid #bbbbbb;\n --red-ui-node-border: #999;\n --red-ui-node-port-background: #d9d9d9;\n --red-ui-workspace-button-color: #333;\n --red-ui-workspace-button-background: #f3f3f3;\n\n --red-ui-primary-font: Helvetica Neue, Arial, Helvetica, sans-serif;\n --red-ui-primary-font-size: 14px;\n --red-ui-monospace-font: Menlo, Consolas, DejaVu Sans Mono, Courier, monospace;\n --red-ui-primary-background: #f3f3f3;\n\n --red-ui-form-background: #fff;\n --red-ui-form-placeholder-color: #aaa;\n --red-ui-form-text-color: #555;\n --red-ui-form-text-color-disabled: #bbb;\n --red-ui-form-input-focus-color: rgba(85, 150, 230, 0.8);\n --red-ui-form-input-border-color: #ccc;\n --red-ui-form-input-border-selected-color: #aaa;\n --red-ui-form-input-border-error-color: rgb(214, 97, 95);\n --red-ui-form-input-background: #fff;\n --red-ui-form-input-background-disabled: #f9f9f9;\n --red-ui-form-button-background: #efefef;\n\n --red-ui-diff-state-color: #555;\n --red-ui-diff-state-prefix-color: #888;\n --red-ui-diff-state-added: #009900;\n --red-ui-diff-state-deleted: #f80000;\n --red-ui-diff-state-changed: #f89406;\n --red-ui-diff-state-moved: #3f81b3;\n }\n ${(t = + (t = t || ".flow-renderer") + .split(" ") + .map((t) => `.${t}`) + .join(" ") + .trim())} .diff-table {\n width: 100%;\n font-size: var(--red-ui-primary-font-size);\n font-family: var(--red-ui-primary-font);\n }\n ${t} .diff-table thead tr {\n font-weight: bold;\n padding: 2px 4px;\n /* bottom border only */\n border-bottom: 3px solid #ddd;\n }\n ${t} .diff-table td {\n padding: 2px 4px;\n border-bottom: 1px solid #ddd;\n }\n ${t} .diff-table .diff-info {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n ${t} .diff-value button {\n height: 20px;\n width: 20px;\n padding: 1px;\n }\n ${t} .diff-value span {\n margin-left: 4px;\n margin-top: 2px;\n }\n ${t} .diff-type {\n height: 14px;\n width: 14px;\n margin: 2px;\n }\n ${t} .diff-type-text {\n flex-grow: 1;\n }\n ${t} .diff-type-moved {\n background-color: var(--red-ui-diff-state-moved);\n }\n ${t} .diff-type-added {\n background-color: var(--red-ui-diff-state-added);\n }\n ${t} .diff-type-deleted {\n background-color: var(--red-ui-diff-state-deleted);\n }\n ${t} .diff-type-changed {\n background-color: var(--red-ui-diff-state-changed);\n }\n ${t} .diff-type-positionChanged {\n background-color: var(--red-ui-diff-state-changed);\n }\n\n .red-ui-editor {\n font-size: var(--red-ui-primary-font-size);\n font-family: var(--red-ui-primary-font);\n padding: 0;\n margin: 0;\n background: var(--red-ui-primary-background);\n color: var(--red-ui-primary-text-color);\n line-height: 20px\n }\n ${t} {\n position: relative;\n }\n /* Source view */\n ${t} pre.red-ui-workspace-source {\n height: 100%;\n overflow: auto;\n width: 100%;\n font-family: var(--red-ui-monospace-font);\n background-color: #f7f7f7;\n }\n /* Chart view */\n ${t} .red-ui-workspace-chart {\n box-sizing: border-box;\n border: var(--red-ui-view-border);\n overflow: scroll;\n height: 100%;\n width: 100%;\n }\n ${t} div.red-ui-footer {\n height: 20px\n }\n ${t}.has-tabs div.red-ui-workspace-chart {\n height: calc(100% - 34px);\n }\n ${t} svg {\n position: relative;\n width: 100%;\n height: 100%;\n min-height: 250px;\n margin: auto;\n display: block;\n border-radius: 2px;\n }\n ${t} svg {\n cursor: default;\n }\n ${t} svg .group-text-label {\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 14px;\n }\n ${t} svg .node-text-label {\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 14px;\n dominant-baseline: middle;\n }\n ${t} svg .subflow-node-text-label {\n color: rgb(85, 85, 85);\n dominant-baseline: middle;\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 10px;\n line-height: 20px;\n pointer-events: none;\n text-anchor: middle;\n user-select: none\n }\n ${t} svg .subflow-node-text-label-number {\n color: rgb(85, 85, 85);\n dominant-baseline: middle;\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 16px;\n line-height: 20px;\n pointer-events: none;\n text-anchor: middle;\n user-select: none\n }\n\n ${t} svg .node {\n fill-opacity: 1;\n stroke-width: 1px;\n }\n ${t} svg .link {\n stroke: #999;\n stroke-width: 3;\n fill: none;\n }\n ${t} svg .link-highlight, .node-highlight {\n stroke: rgb(255, 127, 14);\n }\n ${t} svg .node-highlight {\n stroke-width: 3px;\n }\n ${t} .tab-glow {\n border-radius: 2px;\n animation: tab-glow-animation 1s infinite;\n }\n @keyframes tab-glow-animation {\n 0% {\n box-shadow: 0 0 0px 0px #7d26cddd;\n }\n 50% {\n box-shadow: 0 0 10px 5px #7d26cddd;\n }\n 100% {\n box-shadow: 0 0 0px 0px #7d26cddd;\n }\n }\n\n ${t} svg .node-disabled {\n stroke-dasharray: 8,3;\n fill-opacity: 0.5;\n }\n ${t} svg .group-highlight {\n stroke: rgb(255, 127, 14);\n stroke-width: 4px;\n fill: rgb(255, 127, 14);\n fill-opacity: 0.2;\n }\n ${t} svg .link-disabled {\n stroke-dasharray: 10,8 !important;\n stroke-width: 2 !important;\n stroke: rgb(204, 204, 204);\n }\n ${t} svg .grid-line {\n shape-rendering: geometricprecision;\n stroke: rgb(238, 238, 238);\n stroke-width: 1px;\n fill: none;\n }\n ${t} svg .red-ui-flow-port {\n stroke-width: 1px;\n stroke-miterlimit: 4;\n fill: var(--red-ui-node-port-background);\n }\n ${t} svg .red-ui-flow-port-input {\n stroke-width: 1px;\n stroke-miterlimit: 4;\n fill: var(--red-ui-node-port-background);\n }\n ${t} svg .flow-render-error {\n background-color: rgb(54, 52, 52); \n color: rgb(196, 59, 59); \n width: 100%;\n }\n ${t} svg text {\n user-select: none;\n }\n ${t} .red-ui-tabs {\n display: flex;\n }\n ${t} .red-ui-tab {\n padding: 6px 12px;\n box-sizing: border-box;\n display: block;\n border: 1px solid #bbbbbb;\n border-right: none;\n background-color: #f0f0f0;\n max-width: 200px;\n max-height: 34px; /* for calculating svg height */\n height: 34px; /* for calculating svg height */\n width: 14%;\n overflow: hidden;\n white-space: nowrap;\n position: relative;\n margin-top: -1px;\n transition: 0.2s background-color;\n user-select: none;\n position: relative;\n z-index: 1;\n top: 1px;\n }\n ${t} .red-ui-tab div.red-ui-tab-label {\n position: absolute;\n top: 7px;\n left: 10px;\n }\n ${t} .red-ui-tab-subflow-icon {\n mask-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMjUgMjUuOTRoN2MuNTggMCAxLS40MiAxLTF2LTJjMC0uNTgtLjQyLTEtMS0xaC03Yy0uNTggMC0xIC40Mi0xIDF2MmMwIC41OC40MiAxIDEgMXptLTE3IDEyaDdjLjU4IDAgMS0uNDIgMS0xdi0yYzAtLjU4LS40Mi0xLTEtMUg4Yy0uNTggMC0xIC40Mi0xIDF2MmMwIC41OC40MiAxIDEgMXptLS40MTYgMTFDNS42MjQgNDguOTQgNCA0Ny4zMTUgNCA0NS4zNTZWMTQuNTIyYzAtMS45NiAxLjYyNS0zLjU4MiAzLjU4NC0zLjU4MmgyNC44MzJjMS45NiAwIDMuNTg0IDEuNjIzIDMuNTg0IDMuNTgydjMwLjgzNGMwIDEuOTYtMS42MjUgMy41ODQtMy41ODQgMy41ODR6TTMyIDM2Ljk0SDE5YzAgMi4xOS0xLjgxIDQtNCA0SDd2NC40MTZjMCAuMzUuMjM1LjU4NC41ODQuNTg0aDI0LjgzMmMuMzUgMCAuNTg0LS4yMzUuNTg0LS41ODR2LTguNDE3em0xLTJ2LTZoLThjLTIuMTkgMC00LTEuODEtNC00aC0xYy00LjMzMy0uMDAyLTguNjY3LjAwNC0xMyAwdjZoOGMyLjE5IDAgNCAxLjgxIDQgNGgxM3ptMC0xNnYtNC40MThjMC0uMzUtLjIzNS0uNTgyLS41ODQtLjU4Mkg3LjU4NGMtLjM1IDAtLjU4NC4yMzMtLjU4NC41ODJ2OC40MTdjNC4zMzMuMDAyIDguNjY3LjAwMSAxMyAuMDAxaDFjMC0yLjE5IDEuODEtNCA0LTRoOHoiIGNvbG9yPSIjMDAwIiBmaWxsPSIjZmZmIi8+PC9zdmc+Cg==);\n display: inline-block;\n background-color: grey;\n margin-left: -8px;\n margin-right: 3px;\n margin-top: -1px;\n margin-bottom: 1px;\n opacity: 1;\n width: 16px;\n height: 18px;\n vertical-align: middle;\n mask-size: contain;\n mask-position: center;\n mask-repeat: no-repeat;\n }\n ${t} .red-ui-tab-disabled-icon {\n mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='0 0 1536 1792' style='&%2310;'%3E%3Cscript xmlns=''/%3E%3Cpath d='M1312 893q0-161-87-295l-754 753q137 89 297 89 111 0 211.5-43.5t173.5-116.5 116-174.5 43-212.5zM313 1192l755-754q-135-91-300-91-148 0-273 73t-198 199-73 274q0 162 89 299zM1536 893q0 157-61 300t-163.5 246-245 164-298.5 61-298.5-61-245-164-163.5-246-61-300 61-299.5 163.5-245.5 245-164 298.5-61 298.5 61 245 164 163.5 245.5 61 299.5z' fill='currentColor'/%3E%3Cscript xmlns=''/%3E%3C/svg%3E");\n display: inline-block;\n background-color: grey;\n margin-left: -8px;\n margin-right: 3px;\n margin-top: 0px;\n margin-bottom: 0px;\n opacity: 1;\n width: 16px;\n height: 16px;\n vertical-align: middle;\n mask-size: contain;\n mask-position: center;\n mask-repeat: no-repeat;\n transform: translateY(-2px);\n }\n ${t} .red-ui-tab span {\n font-size: 0.875rem;\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n }\n ${t} .red-ui-tab.active {\n background-color: white;\n border-bottom-color: white;\n font-weight: bold;\n }\n ${t} .red-ui-tab.disabled {\n border-top-style: dashed;\n border-left-style: dashed;\n font-style: italic;\n }\n ${t} .red-ui-tab:last-child {\n border-right: 1px solid #bbbbbb;\n }\n ${t} .red-ui-tab:last-child.disabled {\n border-right-style: dashed;\n }\n ${t} .red-ui-tab:hover {\n cursor: pointer;\n background-color: white;\n }\n /* positioning of toolbar */\n ${t} .toolbar {\n display: flex;\n flex-direction: row;\n position: absolute;\n bottom: 5px;\n right: 5px;\n opacity: 0.6;\n }\n ${t} .toolbar:hover {\n opacity: 1;\n }\n ${t}.has-scrollbars .toolbar {\n bottom: 24px;\n right: 24px;\n }\n\n ${t} .hidden {\n display: none !important;\n }\n ${t} .toolbar .button-group.hidden {\n display: none !important;\n }\n ${t} .toolbar .icon-button-bg.view-source {\n background-image: url("${I}");\n }\n ${t} .toolbar .icon-button-bg.download-flow {\n background-image: url("${c}");\n }\n ${t} .toolbar .icon-button-bg.copy-flow {\n background-image: url("${l}");\n }\n ${t} .toolbar .icon-button-bg.zoom-reset {\n background-image: url("${u}");\n }\n ${t} .toolbar .icon-button-bg {\n background-repeat: no-repeat;\n background-position: center;\n background-size: 16px 16px; /* Size of the background SVG */\n background-color: transparent;\n padding: 4px;\n cursor: pointer;\n width: 24px;\n height: 24px;\n font-size: 0; /* Hide any default button text if present */\n line-height: 0; /* Hide any default button text if present */\n }\n\n ${t} .toolbar .icon-button-bg:hover {\n background-color: #f0f0f0;\n }\n\n /* styles for button groups and buttons */\n ${t} .button-group {\n display: flex;\n flex-direction: row;\n }\n ${t} .button-group button {\n user-select: none;\n box-sizing: border-box;\n display: inline-block;\n text-align: center;\n cursor: pointer;\n line-height: 22px;\n height: 24px;\n color: var(--red-ui-workspace-button-color) !important;\n background: var(--red-ui-workspace-button-background);\n text-decoration: none;\n border: 1px solid var(--red-ui-form-input-border-color);\n margin: 0px;\n padding: 0px;\n }\n ${t} .button-group button:not(:first-child) {\n border-top-left-radius: 0px;\n border-bottom-left-radius: 0px;\n border-left: none;\n }\n\n /* zoom controls */\n ${t} .zoom-controls.button-group button {\n font-size: 22px;\n width: 24px;\n }\n\n /* copy controls */\n ${t} .copy-controls.button-group {\n margin-right: 8px;\n }\n ${t} .copy-controls.button-group button {\n padding: 0px 4px;\n }\n\n /* source controls */\n ${t} .source-controls.button-group {\n margin-right: 8px;\n }\n ${t} .source-controls.button-group button {\n padding: 0px 4px;\n }\n\n /* compare controls */\n ${t} .compare-controls.button-group {\n margin-right: 24px;\n }\n ${t} .compare-controls input[type='range'].flow-compare-slider {\n width: 100%;\n -webkit-appearance: none;\n }\n ${t} input[type='range'].flow-compare-slider::-webkit-slider-runnable-track {\n height: 16px;\n background: var(--red-ui-workspace-button-background);\n border-radius: 16px;\n }\n /* Track: Mozilla Firefox */\n ${t} input[type='range'].flow-compare-slider::-moz-range-track {\n height: 16px;\n background: var(--red-ui-workspace-button-background);\n border-radius: 16px;\n }\n `; + } + function G(t, e) { + const i = "flow-renderer-css" + (e ? "--" + e.toString() : "").replace(/[^a-z0-9]/gi, "-").toLowerCase(); + let n = t.getElementById(i); + n || ((n = t.createElement("style")), (n.id = i), (n.innerHTML = Q(e)), t.head.appendChild(n)); + } + function H(t, e) { + if (t) { + const i = t.querySelector(`.flow-layer-${e || 0}`); + ["flow_group_elements", "flow_group_select", "flow_wires", "flow_nodes"].forEach((t) => { + const e = i.querySelector(`.${t}`) || k("g", { class: t }, i); + for (; e.firstChild; ) e.removeChild(e.firstChild); + }); + } + } + function W(t) { + const e = [], + i = {}, + n = {}, + M = [], + o = {}; + return ( + t.forEach(function (t) { + (o[t.id] = t), + "tab" === t.type + ? (e.push(t.id), (i[t.id] = { n: t, nodes: [] })) + : "subflow" === t.type && (n[t.id] = { n: t, nodes: [] }); + }), + t.forEach(function (t) { + "tab" !== t.type && + "subflow" !== t.type && + (i[t.z] ? i[t.z].nodes.push(t) : n[t.z] ? n[t.z].nodes.push(t) : M.push(t)); + }), + { all: o, tabOrder: e, tabs: i, subflows: n, globals: M } + ); + } + function P(t, i, n, M, o, A = !1) { + const a = M - i, + g = n - t, + s = Math.sqrt(a * a + g * g); + let r = 0.75; + if ( + (g * o > 0 + ? s < e && (r = 0.75 - ((e - s) / e) * 0.75) + : (r = 0.4 - 0.2 * Math.max(0, (e - Math.min(Math.abs(g), Math.abs(a))) / e)), + g * o > 0) + ) { + const A = [ + [t + o * (e * r), i + 0], + [n - o * r * e, M - 0], + ]; + return `M ${t} ${i} C ${A[0][0]} ${A[0][1]} ${A[1][0]} ${A[1][1]} ${n} ${M}`; + } + { + let s, d, u, l, c; + const I = Math.floor(n - g / 2), + N = Math.floor(M - a / 2); + if (Math.abs(a) < 10) { + l = Math.max(i, M) + (A ? 35 : 25); + const e = l - i; + return ( + (c = [ + [t + 15 * o, i], + [t + 25 * o, i + 5], + [t + 25 * o, i + e / 2], + [t + 25 * o, i + e - 5], + [t + 15 * o, i + e], + [t, i + e], + [n - 15 * o, i + e], + [n - 25 * o, i + e - 5], + [n - 25 * o, M + (l - M) / 2], + [n - 25 * o, M + 5], + [n - 15 * o, M], + [n, M], + ]), + "M " + + t + + " " + + i + + " C " + + c[0][0] + + " " + + c[0][1] + + " " + + c[1][0] + + " " + + c[1][1] + + " " + + c[2][0] + + " " + + c[2][1] + + " C " + + c[3][0] + + " " + + c[3][1] + + " " + + c[4][0] + + " " + + c[4][1] + + " " + + c[5][0] + + " " + + c[5][1] + + " h " + + g + + " C " + + c[6][0] + + " " + + c[6][1] + + " " + + c[7][0] + + " " + + c[7][1] + + " " + + c[8][0] + + " " + + c[8][1] + + " C " + + c[9][0] + + " " + + c[9][1] + + " " + + c[10][0] + + " " + + c[10][1] + + " " + + c[11][0] + + " " + + c[11][1] + + " " + ); + } + { + const A = 15, + g = (M + N) / 2; + (s = t + o * e * r), + (d = a > 0 ? Math.min(g - a / 2, i + A) : Math.max(g - a / 2, i - A)), + (u = n - o * e * r), + (l = a > 0 ? Math.max(g, M - A) : Math.min(g, M + A)); + const j = (t + s) / 2, + L = a > 0 ? 1 : -1; + return ( + (c = [ + [j, i], + [s, a > 0 ? Math.max(i, d - A) : Math.min(i, d + A)], + [j, a > 0 ? Math.min(N, d + A) : Math.max(N, d - A)], + [u, a > 0 ? Math.max(N, l - A) : Math.min(N, l + A)], + [(n + u) / 2, M], + ]), + c[2][1] === d + L * A && + (Math.abs(a) < 10 * A && ((c[1][1] = d - (L * A) / 2), (c[3][1] = l - (L * A) / 2)), (c[2][0] = s)), + "M " + + t + + " " + + i + + " C " + + c[0][0] + + " " + + c[0][1] + + " " + + c[1][0] + + " " + + c[1][1] + + " " + + s + + " " + + d + + " S " + + c[2][0] + + " " + + c[2][1] + + " " + + I + + " " + + N + + " S " + + c[3][0] + + " " + + c[3][1] + + " " + + u + + " " + + l + + " S " + + c[4][0] + + " " + + c[4][1] + + " " + + n + + " " + + M + ); + } + } + } + function R(t, e) { + const i = (function (t) { + let e = []; + const i = t.split(/\\n /); + if (i.length > 1) { + let t = 0; + for (t = 0; t < i.length - 1; t++) /\\$/.test(i[t]) ? (e.push(i[t] + "\\n " + i[t + 1]), t++) : e.push(i[t]); + t === i.length - 1 && e.push(i[i.length - 1]); + } else e = i; + return ( + (e = e.map(function (t) { + return t.replace(/\\\\n /g, "\\n ").trim(); + })), + e + ); + })(t); + let n = 0; + for (let t = 0; t < i.length; t++) { + const M = V(i[t], e)[0]; + n < M && (n = M); + } + return { lines: i, width: n }; + } + const J = {}, + F = {}; + function V(t, e) { + const i = b(this), + n = "!" + t; + if (J[e]) { + if (F[e][n]) return F[e][n]; + } else + (J[e] = i.createElement("span")), + (J[e].className = e), + (J[e].style.position = "absolute"), + (J[e].style.top = "-1000px"), + i.querySelector("body").appendChild(J[e]), + (F[e] = {}); + J[e].textContent = t || ""; + const M = J[e].offsetWidth, + o = J[e].offsetHeight; + return (F[e][n] = [M, o]), F[e][n]; + } + const X = (t) => { + switch (t) { + case "str": + return "string"; + case "num": + return "number"; + case "bool": + return "boolean"; + case "json": + return "json"; + case "date": + return "timestamp"; + case "bin": + return "binary"; + case "env": + return "environment"; + case "flow": + return "flow"; + case "global": + return "global"; + default: + return t; + } + }, + q = [ + "inject", + "change", + "switch", + "function", + "template", + "delay", + "trigger", + "link in", + "link out", + "link call", + "watch", + "complete", + "catch", + "status", + "comment", + "debug", + "subflow", + "range", + "filter", + "rbe", + "mqtt in", + "mqtt out", + "http in", + "http response", + "http request", + "websocket in", + "websocket out", + "tcp in", + "tcp out", + "udp in", + "udp out", + "tcp request", + "split", + "join", + "sort", + "batch", + "csv", + "json", + "xml", + "yaml", + "html", + "file in", + "file", + "exec", + ], + K = (t, e, i) => { + const n = t.name || e.name; + if (n) return n; + const M = t.label || t.info || t.text || ""; + let o = "", + A = "", + a = "", + g = ""; + switch (t.type) { + case "file": + a = "write file"; + case "file in": + return ( + (a = a || "read file"), + (A = t.filename), + "str" !== t.filenameType && "env" !== t.filenameType && (A = ""), + "env" === t.filenameType && (A = "env." + A), + "write file" === a && "delete" === t.overwriteFile ? t.name || "delete " + A : t.name || A || a + ); + case "html": + o = t.tag; + break; + case "tcp in": + case "tcp out": + case "tcp request": + a = "tcp:"; + case "udp in": + case "udp out": + return (a = a || "udp:"), (A = t.host || t.addr || t.server || ""), a + (A ? A + ":" : "") + (t.port || ""); + case "debug": + return ( + (!0 !== t.console && "true" !== t.console) || (g = "\t⇲"), + "jsonata" === t.targetType + ? (t.name || "JSONata") + g + : !0 === t.complete || "true" === t.complete + ? (t.name || "msg") + g + : (t.name || "msg." + (t.complete && "false" !== t.complete ? this.complete : "payload")) + g + ); + } + return ( + t.type && t.type.startsWith("ui-") + ? (o = t.type.replace(/^ui-/, "")) + : t.type && t.type.startsWith("ui_") && (o = t.type.replace(/^ui_/, "")), + o && o.length <= 32 ? o : M || (t.topic && t.topic.length <= 32 && q.includes(t.type) ? t.topic : t.type) + ); + }, + _ = (t, e, i) => + (t.name || t.label || t.info || t.text || "").replace(/(.{40,60})([ \n\t])/g, "$1\\n$2") + + (t.sumPass ? " ⭄" : "") + + (t.sumPassPrio && 0 != parseInt(t.sumPassPrio) ? " (" + t.sumPassPrio + ")" : ""), + $ = { + base64: void 0, + batch: void 0, + catch: (t, e, i) => { + let n = ""; + return ( + t.uncaught && (n = ": uncaught"), + t.scope && (n = ": " + t.scope.length), + t.scope || t.uncaught || (n = ": all"), + t.name || t.type + n + ); + }, + change: (t) => { + function e(t, e) { + return t + "." + o.utils.parseContextKey(e).key; + } + return t.name + ? t.name + : ((t._ = + t._ || + function (t, e) { + let i = t; + switch (t) { + case "change.label.set": + i = "set {{property}}"; + break; + case "change.label.change": + i = "change {{property}}"; + break; + case "change.label.move": + i = "move {{property}}"; + break; + case "change.label.delete": + i = "delete {{property}}"; + break; + case "change.label.changeCount": + i = "change {{count}} properties"; + } + for (const n in e) t = i.replace(new RegExp("\\{\\{" + n + "\\}\\}", "g"), e[n]); + return t; + }), + t.rules + ? 1 === t.rules.length + ? "set" === t.rules[0].t + ? t._("change.label.set", { property: e(t.rules[0].pt || "msg", t.rules[0].p) }) + : "change" === t.rules[0].t + ? t._("change.label.change", { property: e(t.rules[0].pt || "msg", t.rules[0].p) }) + : "move" === t.rules[0].t + ? t._("change.label.move", { property: e(t.rules[0].pt || "msg", t.rules[0].p) }) + : t._("change.label.delete", { property: e(t.rules[0].pt || "msg", t.rules[0].p) }) + : t._("change.label.changeCount", { count: t.rules.length }) + : "replace" === t.action + ? t._("change.label.set", { property: "msg." + t.property }) + : "change" === t.action + ? t._("change.label.change", { property: "msg." + t.property }) + : "move" === t.action + ? t._("change.label.move", { property: "msg." + t.property }) + : t._("change.label.delete", { property: "msg." + t.property })); + }, + comment: void 0, + csv: void 0, + debug: void 0, + exec: void 0, + file: void 0, + "file in": void 0, + function: void 0, + html: void 0, + "http response": (t, e, i) => t.name || "http" + (t.statusCode ? " (" + t.statusCode + ")" : ""), + "http in": (t, e, i) => t.name || "[" + t.method + "] " + t.url, + "http request": void 0, + inject: (t) => { + let e = ""; + if ((t.once && (e = " ¹"), ((t.repeat && 0 != t.repeat) || t.crontab) && (e = "\t↻"), t.name)) + return t.name + e; + let i = "", + n = "str", + M = ""; + const A = t.props; + if (A) + for (let e = 0; e < A.length; e++) + "payload" === A[e].p && + ((i = (A[e].vt && "str" !== A[e].vt ? A[e].v : t.payload) || ""), + (n = A[e].vt || t.payloadType || "str")); + else (i = t.payload || ""), (n = t.payloadType || "str"); + if (((M = t.topic || ""), "string" === n || "str" === n || "num" === n || "bool" === n || "json" === n)) + return "" !== M && M.length + i.length <= 32 + ? M + ":" + i + e + : i.length > 0 && i.length < 24 + ? i + e + : "inject" + e; + if ("date" === n || "bin" === n || "env" === n) + return "" !== M && M.length <= 16 ? M + ":" + X(n) + e : X(n) + e; + if ("flow" === n || "global" === n) { + return n + "." + o.utils.parseContextKey(i).key + e; + } + return "inject" + e; + }, + join: void 0, + json: void 0, + junction: void 0, + "link in": void 0, + "link out": void 0, + "link call": (t, e, i) => { + if (!t.links || 0 === t.links.length) return t.name || t.type; + let n; + return ( + i.forEach(function (M) { + n || (M.id === t.links[0] && (n = ($[M.type] || K)(M, e, i))); + }), + t.name || n || t.type + ); + }, + markdown: void 0, + postgresql: void 0, + range: void 0, + sort: void 0, + split: void 0, + switch: void 0, + yaml: void 0, + xml: void 0, + BlogPages: void 0, + BlogDetails: void 0, + BlogPageInfo: (t, e, i) => { + if (t.name) return t.name; + let n; + return ( + i.forEach(function (e) { + n || + ("link in" === e.type && + e.name.startsWith("[blog] ") && + (e.wires[0] || []).indexOf(t.id) > -1 && + (n = e.name.substring(7))); + }), + n || t.type + ); + }, + PubMedium: void 0, + Topic: _, + Observation: _, + Question: _, + Thought: _, + Idea: _, + Analogy: _, + Aphorism: _, + Poesie: _, + Humour: _, + Treasure: _, + Consequence: _, + Advantage: _, + Disadvantage: _, + Text: _, + "Blog-Post": _, + Comment: _, + Codebase: _, + Sketch: _, + Inspiration: _, + Quote: _, + Definition: _, + Book: _, + Author: _, + "nnb-input-node": void 0, + "nnb-layer-node": (t, e, i) => t.name || t.actfunct + ": " + t.bias + ", " + t.threshold, + "nnb-output-node": void 0, + "nnb-backprop": void 0, + "nnb-trainer": void 0, + Seeker: void 0, + Sink: void 0, + Screenshot: void 0, + Orphans: void 0, + IsMobile: void 0, + Navigator: void 0, + DrawSVG: void 0, + GetFlows: void 0, + _default: K, + }; + function tt(t) { + const e = {}; + let i = 1e4, + n = 0; + for (const M of t) + "subflow" === M.type + ? (e[M.id] = { id: M.id, label: M.name, type: "subflow", disabled: M.disabled, order: i++ }) + : "tab" !== M.type && + M.z && + (e[M.z] || (e[M.z] = { id: M.z, label: "Flow " + (n + 1), type: "tab", disabled: !1, order: n++ })); + const M = t.filter((t) => "tab" === t.type); + let o = 0; + for (const t of M) + e[t.id] && ((e[t.id].label = t.label || e[t.id].label), (e[t.id].disabled = !!t.disabled), (e[t.id].order = o++)); + const A = Object.keys(e).map((t) => e[t]); + return A.sort((t, e) => t.order - e.order), A; + } + function et(t) { + Array.isArray(t) || (t = []); + const e = [...t]; + for (let t = 0; t < e.length; t++) + (e[t] = JSON.parse(JSON.stringify(e[t]))), + (e[t].id && "string" == typeof e[t].id) || (e[t].id = Math.random().toString(36).substring(2, 14)); + return e; + } + function it(t) { + const e = [A]; + if (t) { + if ( + (t.scope || + (t.scope = (function (t) { + const e = t?.container, + i = new Set(), + n = t?.scope || ""; + return ( + n && "string" == typeof n + ? i.add(n) + : (Array.isArray(n) || n instanceof DOMTokenList) && n.length > 0 + ? i.add(...n) + : e?.classList?.length && i.add(...e.classList), + 0 === i.size && i.add("flow-renderer"), + [...i] + ); + })(t)), + t.container) + ) { + const i = {}; + [ + "scope", + "gridLines", + "arrows", + "zoom", + "images", + "linkLines", + "labels", + "autoZoom", + "autoScroll", + "flowId", + ].forEach(function (e) { + if ("string" == typeof t.container.dataset[e]) { + const n = t.container.dataset[e] || "true"; + i[e.replace(/-/g, "")] = "true" === n; + } + }), + e.push(i); + } + e.push(t); + } + return Object.assign({}, ...e); + } + function nt(e, i) { + e = et(e); + const n = b((i = it(i)).document, t.document, i.container, this), + M = i.container; + for (; M.firstChild; ) M.removeChild(M.firstChild); + const o = n.createElement("div"); + o.classList.add("red-ui-tabs"), M.appendChild(o); + const A = E(M); + !(function (t, e, i = !0) { + const n = b(t, this), + M = n.createElement("pre"); + M.classList.add("red-ui-workspace-source"), + i && M.classList.add("hidden"), + M.setAttribute("data-code-wrap", "json"); + const o = n.createElement("code"); + o.classList.add("lang-json", "hljs", "language-json"), + (o.textContent = + "object" == typeof e ? JSON.stringify(e, null, 2) : "string" == typeof e ? e : "// No content available"), + M.appendChild(o), + t && t.appendChild(M); + })(M, e); + const a = (function (t) { + const e = b(t, this); + if (!e) return null; + let i = t.querySelector(".toolbar"); + i || (i = v(t)); + let n = i.querySelector(".source-controls"); + if (n) return { viewSource: i.querySelector(".view-source") }; + (n = e.createElement("div")), n.classList.add("source-controls"), n.classList.add("button-group"); + const M = e.createElement("button"); + return ( + M.classList.add("red-ui-footer-button", "icon-button-bg", "view-source"), + (M.title = "Toggle Flows / Source"), + n.appendChild(M), + i.appendChild(n), + { viewSource: M } + ); + })(M); + a.viewSource.onclick = function (t) { + !(function (t) { + t.preventDefault(), t.stopPropagation(); + const e = t.target.parentElement.parentElement.parentElement.querySelector(".red-ui-workspace-chart"); + if (!e) return void console.warn("No container found for source view toggle"); + const i = e.parentElement, + n = i.querySelector(".red-ui-tabs"), + M = i.querySelector(".red-ui-workspace-source"), + o = i.querySelector(".zoom-controls"); + M && M.classList.contains("hidden") + ? (M.classList.remove("hidden"), + e.classList.add("hidden"), + n.classList.add("hidden"), + o?.classList.add("hidden")) + : (M.classList.add("hidden"), + e.classList.remove("hidden"), + n.classList.remove("hidden"), + o?.classList.remove("hidden")); + })(t); + }; + const g = (function (t) { + const e = b(t, this); + if (!e) return null; + let i = t.querySelector(".toolbar"); + i || (i = v(t)); + let n = i.querySelector(".copy-controls"); + if (n) return { copy: i.querySelector(".copy-flow"), download: i.querySelector(".download-flow") }; + (n = e.createElement("div")), n.classList.add("copy-controls"), n.classList.add("button-group"); + const M = e.createElement("button"); + M.classList.add("red-ui-footer-button", "icon-button-bg", "copy-flow"), (M.title = "Copy Flow to Clipboard"); + const o = e.createElement("button"); + return ( + o.classList.add("red-ui-footer-button", "icon-button-bg", "download-flow"), + (o.title = "Download Flows"), + n.appendChild(M), + n.appendChild(o), + i && i.appendChild(n), + { copy: M, download: o } + ); + })(M); + (g.copy.onclick = function (t) { + !(function (t, e, i) { + i = i || function () {}; + let n = e || []; + "object" == typeof n ? (n = JSON.stringify(n, null, 0)) : "string" != typeof n && (n = n.toString()); + const M = b(t && t.target && t.target.ownerDocument, this); + if ("undefined" != typeof navigator && navigator.clipboard) + return void navigator.clipboard + .writeText(n) + .then(function () { + i(null, !0); + }) + .catch(function (t) { + i(t, !1); + }); + const o = M.createElement("textarea"); + (o.value = n), (o.style.position = "fixed"), (o.style.top = "0"), (o.style.left = "0"); + try { + M.body.appendChild(o), o.focus(), o.select(); + const t = M.execCommand("copy"); + i(null, t), console.info("failed to copy", t); + } catch (t) { + console.error("failed to copy", t); + } finally { + M.body.removeChild(o); + } + })(t, e); + }), + (g.download.onclick = function (t) { + !(function (t, e, i, n, M) { + M = M || function () {}; + let o = e || []; + "object" == typeof o ? (o = JSON.stringify(o, null, 2)) : "string" != typeof o && (o = o.toString()); + const A = b(t && t.target && t.target.ownerDocument, this), + a = new Blob([o], { type: i }), + g = URL.createObjectURL(a), + s = A.createElement("a"); + (s.style.display = "none"), + (s.href = g), + (s.download = n), + (s.style.position = "fixed"), + (s.style.top = "0"), + (s.style.left = "0"); + try { + A.body.appendChild(s), s.focus(), s.click(t), URL.revokeObjectURL(g), M(null, !0); + } catch (t) { + M(t, !1), console.error("failed to download", t); + } finally { + A.body.removeChild(s); + } + })(t, e, "application/json", "flows.json"); + }); + const s = O(A); + H(s), f(s), M.classList.add(i.scope); + const r = function (t) { + o.querySelectorAll(".red-ui-tab").forEach((t) => t.classList.remove("active")); + return o.querySelector(`[data-flow-id="${t}"]`).classList.add("active"), (i.flowId = t), Mt(e, i); + }; + G(n, i.scope); + const d = M.querySelectorAll(".red-ui-tab"); + d && d.forEach((t) => t.remove()); + const u = tt(e); + if ( + (u.forEach((e, n) => { + !(function (e, i, n, M, o) { + const A = `red-ui-tab-${n}`, + a = M.container, + g = M.svg || a.querySelector("svg"), + s = b(M.document, t.document, a, this), + r = i.label; + let d = a.querySelector(`.${A}`); + if ( + (d || + ((d = s.createElement("div")), + e.appendChild(d), + d.classList.add("red-ui-tab"), + d.classList.add("red-ui-tab-" + i.type), + d.setAttribute("data-flow-id", i.id)), + i.disabled) + ) { + d.classList.add("disabled"); + const t = s.createElement("i"); + t.classList.add("red-ui-tab-disabled-icon"), d.appendChild(t); + } else if ("subflow" === i.type) { + const t = s.createElement("i"); + t.classList.add("red-ui-tab-subflow-icon"), d.appendChild(t); + } + d.title = r; + const u = s.createElement("span"); + (u.textContent = r), + d.appendChild(u), + (d.onclick = function (t) { + z(g, M, M.flowId), o(i.id), h(g, M, i.id); + }); + })(o, e, n, i, r); + }), + u.length ? M.classList.add("has-tabs") : M.classList.remove("has-tabs"), + !i.flowId) + ) { + const t = u.find((t) => "tab" === t.type), + e = u.find((t) => "subflow" === t.type); + i.flowId = t ? t.id : e ? e.id : null; + } + let l = null; + return ( + (l = u.length ? r(i.flowId) : Mt(e, i)), + z(s, i, i.flowId), + (l = l || {}), + (l.tabs = u), + (l.flowId = i.flowId), + (l.css = l.css || Q(i.scope)), + l + ); + } + function Mt(t, i) { + t = et(t); + const n = (i = it(i)).container, + A = {}, + s = {}, + u = {}, + l = {}, + c = {}, + I = (i = i || {}).flowId, + N = L("junction"); + let j = !1; + const y = tt(t).find((t) => t.id === I); + y && "tab" === y.type && (j = y.disabled); + let b = n && n.querySelector("svg"); + (b = b || O(n)), H(b, i.layer); + const w = (i.svgLayer || b).querySelector(".flow_grid"); + i.gridLines && w && B(w), + t.forEach(function (t) { + if ("subflow" === t.type) { + s["subflow:" + t.id] = t; + for (let e = 0; e < t.in.length; e++) + for (let i = 0; i < t.in[e].wires.length; i++) c[t.in[e].wires[i].id] = !0; + } + t.wires && + t.wires.length > 0 && + t.wires.forEach(function (t) { + t.forEach(function (t) { + c[t] = !0; + }); + }); + }); + const C = (i.svgLayer || b).querySelector(".flow_nodes"); + t.forEach(function (n) { + if (n.z === I || n.id === I) { + const I = D(n), + y = (function (t) { + let e = !0; + return ( + ("link out" !== t.type && "link in" !== t.type) || (e = !1), + "junction" === t.type || + "tab" === t.type || + "subflow" === t.type || + (!1 === t.l ? (e = !1) : !0 === t.l && (e = !0)), + e + ); + })(n), + b = !i.labels, + w = L(n.type); + switch (n.type) { + case "tab": + case "ui_spacer": + case "ui-spacer": + break; + case "group": + u[n.id] = n; + break; + case "subflow": + l[n.id] = { ...n }; + for (let t = 0; t < l[n.id].in.length; t++) { + const e = l[n.id].in[t], + i = k("g", { class: "in-connector" }); + C.appendChild(i), + i.appendChild( + k("rect", { ...w, ...I, rx: 8, ry: 8, x: -I.width / 2, y: -I.height / 2, "stroke-width": 1 }), + ), + i.setAttribute("transform", `translate(${e.x}, ${e.y})`), + (e.bbox = i.getBBox()), + (e.bbox.x = e.x - I.width / 2), + (e.bbox.y = e.y - I.height / 2), + i.appendChild( + k("rect", { ...w, ...a, ...g, class: "red-ui-flow-port", transform: "translate(15, -5)" }), + ); + const M = k("text", { y: 0, x: -2, class: "subflow-node-text-label" }); + (M.textContent = "input"), i.appendChild(M); + } + for (let t = 0; t < l[n.id].out.length; t++) { + const e = l[n.id].out[t], + i = k("g", { class: "out-connector" }); + C.appendChild(i), + i.appendChild( + k("rect", { ...w, ...I, rx: 8, ry: 8, x: -I.width / 2, y: -I.height / 2, "stroke-width": 1 }), + ), + i.setAttribute("transform", `translate(${e.x}, ${e.y})`), + (e.bbox = i.getBBox()), + (e.bbox.x = e.x - I.width / 2), + (e.bbox.y = e.y - I.height / 2), + i.appendChild( + k("rect", { ...w, ...a, ...g, class: "red-ui-flow-port-input", transform: "translate(-25, -5)" }), + ); + const M = k("text", { y: -10, x: 0, class: "subflow-node-text-label" }); + (M.textContent = "output"), i.appendChild(M); + const o = k("text", { y: 8, x: 0, class: "subflow-node-text-label-number" }); + (o.textContent = "" + (t + 1)), i.appendChild(o); + } + if (l[n.id].status) { + const t = l[n.id].status, + e = k("g", { class: "status-connector" }); + C.appendChild(e), + e.appendChild( + k("rect", { ...w, ...I, rx: 8, ry: 8, x: -I.width / 2, y: -I.height / 2, "stroke-width": 1 }), + ), + e.setAttribute("transform", `translate(${t.x}, ${t.y})`), + (t.bbox = e.getBBox()), + (t.bbox.x = t.x - I.width / 2), + (t.bbox.y = t.y - I.height / 2), + e.appendChild( + k("path", { ...w, ...a, ...g, class: "red-ui-flow-port-input", transform: "translate(-25, -5)" }), + ); + const i = k("text", { y: 0, x: 2, class: "subflow-node-text-label" }); + (i.textContent = "status"), e.appendChild(i); + } + break; + case "junction": { + const t = k("g", { "data-node-id": n.id, class: "junction" }); + C.appendChild(t), + t.appendChild(k("rect", { ...w, ...I, rx: 3, ry: 3, x: -5, y: -5, "stroke-width": 1 })), + t.setAttribute("transform", `translate(${n.x}, ${n.y})`), + (n.bbox = t.getBBox()), + (n.bbox.x = n.x), + (n.bbox.y = n.y), + (n.bbox.width = 0), + (n.bbox.height = 0); + break; + } + default: { + const A = $[n.type] || $._default, + u = s[n.type] || {}, + l = R(A(n, u, t), "node-text-label"); + let L; + if (y) { + L = k("g", { transform: "translate(38," + (l.lines.length > 1 ? 18 : 16) + ")" }); + let t = 0; + l.lines.forEach(function (e) { + const i = k("text", { y: t, class: "node-text-label" }); + (i.textContent = e), L.appendChild(i), (t += 20); + }); + } + const D = k("g", { "data-node-id": n.id, class: "node" }); + C.appendChild(D), y && L && D.appendChild(L); + const p = y ? L?.getBBox() : { width: 0, height: 0 }, + m = p.width, + x = p.height + 13.5, + T = y ? (I.width > m ? I.width : m) : I.width, + S = y ? (I.height > x ? I.height : x) : I.height, + z = { x: n.x, y: n.y, w: T, h: S, outputs: (n.wires || []).length }, + h = !!c[n.id]; + try { + y + ? ((z.w = Math.max(e, 20 * Math.ceil((l.width + 48 + (h ? 7 : 0)) / 20))), + (z.h = Math.max(6 + 24 * l.lines.length, 15 * (z.outputs || 0), 30))) + : ((z.w = 30), (z.h = Math.max(30, 15 * (z.outputs || 0)))); + } catch (t) {} + if (z.outputs > 2 && y && L && z.h > x) { + const t = (z.h - x) / 2; + L.setAttributeNS(null, "transform", "translate(38," + ((l.lines.length > 1 ? 16 : 14) + t) + ")"); + } + b && L && (L.style.display = "none"), + D.prepend( + k("rect", { + ...w, + rx: 5, + ry: 5, + fill: u.color || w.fill, + width: z.w, + height: z.h, + class: "node node-" + n.id, + }), + ), + D.appendChild( + k("path", { + d: "M5 0 h25 v" + z.h + " h-25 a 5 5 0 0 1 -5 -5 v-" + (z.h - 10) + " a 5 5 0 0 1 5 -5", + fill: "rgb(0,0,0)", + "fill-opacity": 0.05, + stroke: "none", + }), + ), + y && + D.appendChild( + k("path", { + d: "M 29.5 0.5 l 0 " + (z.h - 1), + fill: "none", + stroke: "rgb(0,0,0)", + "stroke-opacity": 0.1, + "stroke-width": "1px", + }), + ); + const f = o.view.tools.calculateGridSnapOffsets(z), + E = n.x - z.w / 2 - f.x, + v = n.y - z.h / 2 - f.y; + if ( + (D.setAttribute("transform", `translate(${E}, ${v})`), + (n.bbox = D.getBBox()), + (n.bbox.x = E), + (n.bbox.y = v), + i.images) + ) { + const t = { x: 0, y: Math.max(z.h / 2 - 15, 0), width: 30, height: 30 }, + e = (function (t) { + let e = r[t]; + return ( + e || + (t.startsWith("subflow:") + ? (e = r.subflow) + : t.startsWith("ui-") + ? (e = r["ui-template"]) + : t.startsWith("ui_") && (e = r.ui_template)), + (e && d[e]) || "" + ); + })(n.type); + if (e) D.appendChild(k("image", { href: e, ...t })); + else if (n.type.startsWith("subflow:")) { + const e = (u.icon && d[u.icon]) || d["subflow.svg"]; + D.appendChild(k("image", { href: e, ...t })); + } + } + ((u.in && u.in.length > 0) || c[n.id]) && + (i.arrows + ? D.appendChild( + k("path", { + ...N, + transform: "translate(-3," + (n.bbox.height / 2 - 5) + ")", + d: i.arrows ? "M 0,10 9,5 0,0 Z" : "M -1,9.5 8,9.5 8,0.5 -1,0.5 Z", + class: "red-ui-flow-port-input input-arrows", + "stroke-linecap": "round", + "stroke-linejoin": "round", + }), + ) + : D.appendChild( + k("rect", { + ...N, + transform: "translate(-5," + (n.bbox.height / 2 - 5) + ")", + ...a, + ...g, + class: "red-ui-flow-port-input", + }), + )); + const O = { ...N, ...a, ...g, class: "red-ui-flow-port" }; + if (n.wires && Array.isArray(n.wires)) { + const t = 1 === n.wires.length ? n.bbox.height / 2 - 5 : n.wires.length % 2 == 0 ? 3.5 : 4.5; + for (let e = 0; e < n.wires.length; e++) + D.appendChild( + k("rect", { transform: "translate(" + (n.bbox.width - 4) + "," + (t + M * e) + ")", ...O }), + ); + } + (n.d || j) && D.setAttribute("class", "node-disabled"); + break; + } + } + A[n.id] = n; + } + }); + const x = (i.svgLayer || b).querySelector(".flow_group_select"), + T = [], + z = []; + let h = 50; + for (const t in u) z.push(t); + for (; T.length !== z.length && h > 0; ) { + h -= 1; + for (const t in u) { + if (T.indexOf(t) > -1) continue; + const e = u[t]; + let i = 0, + n = 0, + M = !1; + if ( + (e.nodes.forEach(function (t) { + const o = (A[t] || {}).bbox; + o ? ((i = Math.max(i, o.x - e.x + o.width)), (n = Math.max(n, o.y - e.y + o.height))) : (M = !0); + }), + M) + ) + continue; + const o = k("g", { "data-node-id": t }); + o.setAttribute("transform", `translate(${e.x}, ${e.y})`), + o.appendChild( + k("rect", { + rx: 5, + ry: 5, + width: e.w, + height: e.h, + fill: "none", + "fill-opacity": 0, + "stroke-width": 2, + stroke: "grey", + class: "group-" + e.id, + ...e.style, + }), + ), + x.prepend(o); + const a = A[t]; + (a.bbox = o.getBBox()), (a.bbox.x = e.x), (a.bbox.y = e.y); + const g = k("g", {}); + if ((o.appendChild(g), e.style.label && e.name)) { + const t = e.style["label-position"] || "nw", + i = R(e.name, "group-text-label"); + let n = 0, + M = 0, + o = "start"; + if ( + ((M = "n" === t[0] ? 15 : a.bbox.height - 5 - 16 * (i.lines.length - 1)), + "w" === t[1] + ? ((n = 5), (o = "start")) + : "e" === t[1] + ? ((n = a.bbox.width - 5), (o = "end")) + : ((n = a.bbox.width / 2), (o = "middle")), + g.setAttribute("transform", `translate(${n}, ${M})`), + g.setAttribute("text-anchor", o), + i) + ) { + let t = 0; + i.lines.forEach(function (i) { + const n = k("text", { class: "group-text-label", x: 0, y: t, fill: e.style.color || "grey" }); + (n.textContent = i), g.appendChild(n), (t += 16); + }); + } + } + T.push(t); + } + } + const f = (i.svgLayer || b).querySelector(".flow_wires"), + E = [], + v = Object.keys(l); + for (let t = 0; t < v.length; t++) { + const e = l[v[t]]; + for (let t = 0; t < e.in.length; t++) { + const i = e.in[t]; + for (let t = 0; t < i.wires.length; t++) { + const n = A[i.wires[t].id]; + if (!n) continue; + const M = i.bbox.x + i.bbox.width, + o = i.bbox.y + i.bbox.height / 2, + a = n.bbox.x, + g = n.bbox.y + n.bbox.height / 2; + f.appendChild( + k("path", { + d: P(M, o, a, g, 1), + class: "link " + (n.d || j ? "link-disabled" : "") + " link-from-" + e.id + "-to-" + n.id, + }), + ); + } + } + e.status && e.out.push(e.status); + for (let t = 0; t < e.out.length; t++) { + const i = e.out[t]; + for (let t = 0; t < i.wires.length; t++) { + const n = A[i.wires[t].id]; + if (!n) continue; + const o = 1 === n.wires.length ? n.bbox.height / 2 : 5 + (n.wires.length % 2 == 0 ? 3.5 : 4.5), + a = n.bbox.x + n.bbox.width, + g = n.bbox.y + (o + M * i.wires[t].port), + s = i.bbox.x, + r = i.bbox.y + i.bbox.height / 2; + f.appendChild( + k("path", { + d: P(a, g, s, r, 1), + class: "link " + (n.d || j ? "link-disabled" : "") + " link-from-" + e.id + "-to-" + n.id, + }), + ); + } + } + } + for (const t in A) { + const e = A[t]; + if (("link out" === e.type && E.push(e), 0 === (e.wires || []).length)) continue; + const i = 1 === e.wires.length ? e.bbox.height / 2 : 5 + (e.wires.length % 2 == 0 ? 3.5 : 4.5); + let n = 0; + e.wires.forEach(function (t) { + t.forEach(function (t) { + const o = A[t]; + if (o) { + const t = e.bbox.x + e.bbox.width, + A = e.bbox.y + (i + M * n), + a = o.bbox.x, + g = o.bbox.y + o.bbox.height / 2; + f.appendChild( + k("path", { + d: P(t, A, a, g, 1), + class: "link " + (o.d || e.d || j ? "link-disabled" : "") + " link-from-" + e.id + "-to-" + o.id, + }), + ); + } + }), + n++; + }); + } + i.linkLines && + E.forEach(function (t) { + t.links.forEach(function (e) { + const i = A[e]; + if (i) { + const e = t.bbox.x + t.bbox.width, + n = t.bbox.y + t.bbox.height / 2, + M = i.bbox.x, + o = i.bbox.y + i.bbox.height / 2; + f.appendChild( + k("path", { + d: P(e, n, M, o, 1), + "stroke-dasharray": "25,4", + class: "link " + (i.d || t.d || j ? "link-disabled" : "") + " link-from-" + t.id + "-to-" + i.id, + }), + ), + f.appendChild( + k("circle", { + cy: n, + cx: e + 6.5, + r: 5, + stroke: "rgb(170, 170, 170)", + "stroke-width": 1, + fill: "rgb(238, 238, 238)", + class: (i.d || t.d || j ? "link-disabled" : "") + " link-from-" + t.id + "-to-" + i.id, + }), + ), + f.appendChild( + k("circle", { + cy: o, + cx: M - 6.5, + r: 5, + stroke: "rgb(170, 170, 170)", + "stroke-width": 1, + fill: "rgb(238, 238, 238)", + class: (i.d || t.d || j ? "link-disabled" : "") + " link-from-" + t.id + "-to-" + i.id, + }), + ); + } + }); + }), + C.querySelectorAll(".node").forEach(function (t) { + const e = t.getAttribute("data-node-id"), + i = A[e]; + if (i) { + const e = i.type, + n = (s[e] || {}).label || e, + M = k("title"); + (M.textContent = n), t.appendChild(M); + } + }), + t.forEach(function (t) { + delete t.bbox; + }); + const Z = p(b.parentElement); + Z.hasHorizontalScrollbar || Z.hasVerticalScrollbar + ? n.classList.add("has-scrollbars") + : n.classList.remove("has-scrollbars"), + i.zoom && m(b, i.container); + const Y = S(b, t, i); + return { svg: b.innerHTML, flowId: i.flowId, css: Q(i.scope), autoScaleAndScroll: Y }; + } + return { + compare: function (e, i) { + if (!e || e.length < 2) return nt(e, i); + e.length > 2 && e.splice(2); + const n = new Map(), + M = U( + (function (t, e) { + const i = W(t), + n = W(e), + M = {}, + o = {}, + A = {}, + a = {}, + g = {}; + return ( + Object.keys(i.all).forEach(function (t) { + if (!j(n.all, t)) return void (o[t] = !0); + const e = JSON.stringify(i.all[t]), + M = JSON.stringify(n.all[t]); + if (e !== M) + if (((A[t] = !0), i.all[t].z !== n.all[t].z)) g[t] = !0; + else if ( + i.all[t].x !== n.all[t].x || + i.all[t].y !== n.all[t].y || + i.all[t].w !== n.all[t].w || + i.all[t].h !== n.all[t].h + ) { + const i = JSON.parse(e), + n = JSON.parse(M); + delete i.x, + delete i.y, + delete i.w, + delete i.h, + delete n.x, + delete n.y, + delete n.w, + delete n.h, + JSON.stringify(i) === JSON.stringify(n) && (a[t] = !0); + } + }), + Object.keys(n.all).forEach(function (t) { + j(i.all, t) || (M[t] = !0); + }), + { currentConfig: i, newConfig: n, added: M, deleted: o, changed: A, positionChanged: a, moved: g } + ); + })(e[0], e[1]), + ); + M.changes.forEach((t) => { + t.highlight = (e) => + (function (t = -1, e) { + clearTimeout(N), clearTimeout(L); + s.querySelectorAll(".red-ui-tab").forEach((t) => t.classList.remove("tab-glow")); + d.querySelectorAll("g[data-node-id]").forEach((t) => { + t.style.filter = ""; + }); + const i = s.querySelector(".red-ui-tab.active").getAttribute("data-flow-id"); + let n = e.tab; + "moved" === e.diffType && (-1 === t ? (t = e.v1) : 0 === t ? (n = e.value1) : 1 === t && (n = e.value2)); + "added" === e.diffType && -1 === t + ? (t = 1) + : (("deleted" === e.diffType && -1 === t) || -1 === t) && (t = 0); + const M = s.querySelector(`.red-ui-tab[data-flow-id="${n}"]`); + (("tab" === e.item && "changed" === e.diffType) || n !== i) && + M && + (M.click(), + M.classList.add("tab-glow"), + (L = setTimeout(() => { + M.classList.remove("tab-glow"); + }, 1e4))); + if (parseInt(l.value) < 10 || parseInt(l.value) > 90) { + const e = 0 === t ? 10 : 90; + !(async function () { + let t = parseInt(l.value); + const i = e > t ? 1 : -1; + for (; t !== e; ) { + (t += i), (l.value = t); + const e = new Event("input", { bubbles: !0 }); + l.dispatchEvent(e), await new Promise((t) => setTimeout(t, 10)); + } + })(); + } + const o = [e.item, e.tab][0], + A = d.querySelector(`g.flow-layer-0 g[data-node-id="${o}"]`), + a = d.querySelector(`g.flow-layer-1 g[data-node-id="${o}"]`); + if (!A && !a) return; + (A || a).scrollIntoView({ behavior: "smooth", block: "center", inline: "center" }), + A && (A.style.filter = "url(#node-glow)"); + a && (a.style.filter = "url(#node-glow)"); + N = setTimeout(() => { + try { + A && (A.style.filter = ""), a && (a.style.filter = ""); + } catch (t) {} + }, 1e4); + })(e, t); + }), + (M.tabMap = n); + const o = b((i = it(i)).document, t.document, i.container, this), + A = i.container; + G(o, i.scope); + const a = i.zoom, + g = i.gridLines; + for (i.zoom = !1, i.gridLines = !1; A.firstChild; ) A.removeChild(A.firstChild); + const s = Y("div", null, "red-ui-tabs", null, A), + r = E(A), + d = O(r, { addDefaultLayer: !1 }), + u = [...d.childNodes].find((t) => "g" === t.tagName && t.classList.contains("outerContainer")), + l = (function (t) { + if (!b(t, this)) return null; + let e = t.querySelector(".toolbar"); + e || (e = v(t)); + let i = e.querySelector(".compare-controls"); + if (i) return e.querySelector(".flow-compare-slider"); + i = Y("div", null, "button-group compare-controls", null, e); + const n = Y("input", null, "flow-compare-slider", null, i); + return (n.type = "range"), (n.min = "0"), (n.max = "100"), n; + })(A); + (l.type = "range"), + (l.min = 0), + (l.max = 100), + (l.value = 0), + (l.step = 5), + (l.style.width = "100%"), + l.classList.add("flow-compare-slider"); + const c = A, + I = r; + f(d); + for (let t = 0; t < e.length; t++) { + const M = t, + A = Z(d, { layer: M, opacity: 0 === t ? 1 : 0 }), + a = [...(tt(e[t]) || [])]; + for (const e of a) { + const a = e.order, + g = e.id, + s = { + renderOptions: { ...i, index: t, layer: M, svgLayer: A, order: a, document: o, container: c, flowId: g }, + index: t, + layer: M, + order: a, + svgLayer: A, + flowRenderer: c, + workspace: I, + tab: e, + }; + n.has(g) || n.set(g, {}), (n.get(g)[t] = s); + } + } + [...n.entries()].forEach((n) => { + const M = n[0], + o = n[1], + r = { ...i, flowId: M, container: null, layers: o }; + !(function (e, i, n) { + const M = b(i.document, t.document, A, this), + o = i.layers; + for (const t of Object.values(o)) { + const A = t.tab, + a = A.label, + g = `red-ui-tab-${t.index}`, + s = `red-ui-tab-${A.id}`; + let r = e.querySelector(`.${s}`); + r || + ((r = M.createElement("div")), + e.appendChild(r), + r.classList.add("red-ui-tab"), + r.classList.add(g), + r.classList.add(s), + r.classList.add("red-ui-tab-" + o.type), + r.setAttribute("data-flow-id", A.id)); + let u = r.querySelector(`.red-ui-tab-label-${t.index}`); + if ( + (u || ((u = M.createElement("div")), u.classList.add(`red-ui-tab-label-${t.index}`)), + u.classList.add("red-ui-tab-label"), + u.setAttribute("data-layer", t.index), + (u.style.opacity = 0), + r.appendChild(u), + A.disabled) + ) { + u.classList.add("disabled"); + const t = M.createElement("i"); + t.classList.add("red-ui-tab-disabled-icon"), u.appendChild(t); + } else if ("subflow" === A.type) { + const t = M.createElement("i"); + t.classList.add("red-ui-tab-subflow-icon"), u.appendChild(t); + } + u.title = a; + const l = M.createElement("span"); + (l.textContent = a), + u.appendChild(l), + (r.onclick = function (t) { + z(d, i, i.flowId), n(i), h(d, i, A.id); + }); + } + })(s, r, function (t) { + s.querySelectorAll(".red-ui-tab").forEach((t) => t.classList.remove("active")); + s.querySelector(`[data-flow-id="${t.flowId}"]`).classList.add("active"); + const n = Object.values(t.layers), + M = { 0: !0, 1: !0 }; + n.forEach((t) => { + t.svgLayer.setAttribute("opacity", 0); + const i = t.renderOptions; + Mt(e[i.index] || [], i), (M[i.index] = !1); + }); + const o = M[0] || M[1], + r = { ...i, flowId: t.flowId, container: o?.container || o?.flowRenderer || A }; + if ( + (M[0] && ((r.layer = 0), (r.svgLayer = d.querySelector("g.flow-layer-0")), Mt(e[0] || [], r)), + M[1] && ((r.layer = 1), (r.svgLayer = d.querySelector("g.flow-layer-1")), Mt(e[1] || [], r)), + a && m(d, A), + g) + ) { + let t = [...u.childNodes].find((t) => "g" === t.tagName && t.classList.contains("flow_grid")); + t || ((t = k("g", { class: "flow_grid" })), u.insertBefore(t, d.firstChild)), t && B(t); + } + D(); + }); + }), + l.addEventListener("input", function (t) { + D(); + }); + let N = null, + L = null; + function D() { + const t = parseInt(l.value), + i = [1 - t / 100, t / 100]; + i.forEach((t, e) => { + t = t > 0.05 ? w(t + 0.15, 0, 1) : t; + const i = (function (t, e) { + return t.querySelector(`g.flow-layer-${e || 0}`); + })(d, e); + i?.setAttribute("opacity", t); + }); + s.querySelectorAll(".red-ui-tab-label").forEach((t, n) => { + let M = parseInt(t.getAttribute("data-layer")); + (isNaN(M) || M < 0 || M >= e.length) && (M = 0), (t.style.opacity = i[M] || 0); + }); + } + const y = s.querySelector(".red-ui-tab"); + y && y.click(), n.size > 0 ? A.classList.add("has-tabs") : A.classList.remove("has-tabs"); + const C = p(d.parentElement); + return ( + C.hasHorizontalScrollbar || C.hasVerticalScrollbar + ? A.classList.add("has-scrollbars") + : A.classList.remove("has-scrollbars"), + M + ); + }, + renderFlows: nt, + renderFlow: Mt, + normaliseOptions: it, + getStyles: Q, + }; +}; +"object" == typeof module && module.exports + ? (module.exports = FlowRenderer) + : "object" == typeof window + ? (window.FlowRenderer = FlowRenderer) + : (global.FlowRenderer = FlowRenderer); +export default FlowRenderer; diff --git a/docs/examples/01-simple-launch-monitor.md b/docs/examples/01-simple-launch-monitor.md index 3c46eb9..83dac36 100644 --- a/docs/examples/01-simple-launch-monitor.md +++ b/docs/examples/01-simple-launch-monitor.md @@ -2,6 +2,11 @@ `examples/01 - Simple launch + monitor.json` + +
+ ![01 - Simple launch + monitor.json](../img/example_flow_01.png) This is the most basic example workflow that demonstrates the core _Launch workflow_ and _Monitor workflow_ nodes. diff --git a/docs/examples/02-launch-on-file-upload.md b/docs/examples/02-launch-on-file-upload.md index abefe03..fc37790 100644 --- a/docs/examples/02-launch-on-file-upload.md +++ b/docs/examples/02-launch-on-file-upload.md @@ -2,6 +2,11 @@ `examples/02 - Launch on file upload.json` + +
+ ![02 - Launch on file upload.json](../img/example_flow_02.png) This flow uses the _Poll files_ node to periodically check for the presence diff --git a/docs/examples/03-auto-resume-on-failure.md b/docs/examples/03-auto-resume-on-failure.md index 9043298..96c341b 100644 --- a/docs/examples/03-auto-resume-on-failure.md +++ b/docs/examples/03-auto-resume-on-failure.md @@ -2,7 +2,10 @@ `examples/03 - Auto-resume on workflow failure.json` -`examples/05 - Auto-resume on workflow failure.json` + +
This workflow demonstrates how to automatically resume a failed Nextflow workflow using the workflow ID from the failed run. This pattern is useful for recovering from transient errors without re-running successfully completed tasks. diff --git a/docs/examples/04-rnaseq-differential-abundance.md b/docs/examples/04-rnaseq-differential-abundance.md index 23e217b..ffad8f4 100644 --- a/docs/examples/04-rnaseq-differential-abundance.md +++ b/docs/examples/04-rnaseq-differential-abundance.md @@ -6,6 +6,11 @@ title: Pipeline chaining `examples/04 - RNA-seq to DifferentialAbundance.json` + +
+ ![04 - RNA-seq to DifferentialAbundance.json](../img/example_flow_04.png) This workflow demonstrates chaining nf-core/rnaseq and nf-core/differentialabundance pipelines together. diff --git a/docs/examples/05-studio-slack-webhook.md b/docs/examples/05-studio-slack-webhook.md index 8d8092a..4ebeec9 100644 --- a/docs/examples/05-studio-slack-webhook.md +++ b/docs/examples/05-studio-slack-webhook.md @@ -6,6 +6,11 @@ title: Studio + Slack webhook `examples/05 - Studio on run fail + Slack webhook.json` + +
+ ![03 - Studio on run fail + Slack webhook.json](../img/example_flow_03.png) This workflow has three parts to it: diff --git a/docs/overrides/main.html b/docs/overrides/main.html new file mode 100644 index 0000000..0c30fc0 --- /dev/null +++ b/docs/overrides/main.html @@ -0,0 +1,39 @@ +{% extends "base.html" %} {% block extrahead %} {{ super() }} + +{% endblock %} diff --git a/mkdocs.yml b/mkdocs.yml index 4f1b114..1288a6c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -31,6 +31,7 @@ nav: theme: name: material + custom_dir: docs/overrides logo: img/node-red-seqera.svg favicon: img/favicon.svg features: