[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\nend_of_line = lf\ninsert_final_newline = false\nindent_style = space\nindent_size = 2\n"
  },
  {
    "path": ".gitattributes",
    "content": "# From https://github.com/Danimoth/gitattributes/blob/master/Web.gitattributes\n\n# Handle line endings automatically for files detected as text\n# and leave all files detected as binary untouched.\n* text=auto\n\n#\n# The above will handle all files NOT found below\n#\n\n#\n## These files are text and should be normalized (Convert crlf => lf)\n#\n\n# source code\n*.php text\n*.css text\n*.sass text\n*.scss text\n*.less text\n*.styl text\n*.js text eol=lf\n*.coffee text\n*.json text\n*.htm text\n*.html text\n*.xml text\n*.svg text\n*.txt text\n*.ini text\n*.inc text\n*.pl text\n*.rb text\n*.py text\n*.scm text\n*.sql text\n*.sh text\n*.bat text\n\n# templates\n*.ejs text\n*.hbt text\n*.jade text\n*.haml text\n*.hbs text\n*.dot text\n*.tmpl text\n*.phtml text\n\n# git config\n.gitattributes text\n.gitignore text\n.gitconfig text\n\n# code analysis config\n.jshintrc text\n.jscsrc text\n.jshintignore text\n.csslintrc text\n\n# misc config\n*.yaml text\n*.yml text\n.editorconfig text\n\n# build config\n*.npmignore text\n*.bowerrc text\n\n# Heroku\nProcfile text\n.slugignore text\n\n# Documentation\n*.md text\nLICENSE text\nAUTHORS text\n\n\n#\n## These files are binary and should be left untouched\n#\n\n# (binary is a macro for -text -diff)\n*.png binary\n*.jpg binary\n*.jpeg binary\n*.gif binary\n*.ico binary\n*.mov binary\n*.mp4 binary\n*.mp3 binary\n*.flv binary\n*.fla binary\n*.swf binary\n*.gz binary\n*.zip binary\n*.7z binary\n*.ttf binary\n*.eot binary\n*.woff binary\n*.pyc binary\n*.pdf binary\n"
  },
  {
    "path": ".gitignore",
    "content": "# Don't check auto-generated stuff into git\ncoverage\nnode_modules\nstats.json\npackage-lock.json\n\n# Cruft\n.DS_Store\nnpm-debug.log\n.idea\n"
  },
  {
    "path": "README.md",
    "content": "# Strapi plugin Entity Relationship Chart\n\nPlugin displays Entity Relationship Diagram of all Strapi models, fields and relations.\n\n![Preview](https://raw.githubusercontent.com/node-vision/strapi-plugin-entity-relationship-chart/master/preview.png)\n\n## How to install:\n\n1. In a root folder of your strapi project run `npm install strapi-plugin-entity-relationship-chart --save`\n2. Rebuild admin UI `strapi build`\n3. Run strapi `strapi develop`\n\n## Exclude models from chart\n\nYou can exclude **contentTypes** or **components** from the chart by adding their ids to `exclude` plugin configuration property:\n\n```js\n// file: config/plugins.js\n\"use strict\";\n\nmodule.exports = () => ({\n  // ...\n  \"entity-relationship-chart\": {\n    enabled: true,\n    config: {\n      // By default all contentTypes and components are included.\n      // To exlclude strapi's internal models, use:\n      exclude: [\n        \"strapi::core-store\",\n        \"webhook\",\n        \"admin::permission\",\n        \"admin::user\",\n        \"admin::role\",\n        \"admin::api-token\",\n        \"plugin::upload.file\",\n        \"plugin::i18n.locale\",\n        \"plugin::users-permissions.permission\",\n        \"plugin::users-permissions.role\",\n      ],\n    },\n  },\n  // ...\n});\n```\n\n## Submitting issues:\nUse github issues on the repo: - https://github.com/node-vision/strapi-plugin-entity-relationship-chart/issues\n\n## Version Notes:\n\n- this plugin was tested with stable Strapi - 4.0.6\n"
  },
  {
    "path": "admin/src/components/Initializer/index.js",
    "content": "/**\n *\n * Initializer\n *\n */\n\nimport { useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport pluginId from '../../pluginId';\n\nconst Initializer = ({ setPlugin }) => {\n  const ref = useRef();\n  ref.current = setPlugin;\n\n  useEffect(() => {\n    ref.current(pluginId);\n  }, []);\n\n  return null;\n};\n\nInitializer.propTypes = {\n  setPlugin: PropTypes.func.isRequired,\n};\n\nexport default Initializer;\n"
  },
  {
    "path": "admin/src/components/PluginIcon/index.js",
    "content": "/**\n *\n * PluginIcon\n *\n */\n\nimport React from 'react';\nimport OneToMany from '@strapi/icons/OneToMany';\n\nconst PluginIcon = () => <OneToMany />;\n\nexport default PluginIcon;\n"
  },
  {
    "path": "admin/src/containers/App/index.js",
    "content": "/**\n *\n * This component is the skeleton around the actual pages, and should only\n * contain code that should be seen on all pages. (e.g. navigation bar)\n *\n */\n\nimport React from 'react';\nimport { Switch, Route } from 'react-router-dom';\nimport { NotFound } from '@strapi/helper-plugin';\nimport pluginId from '../../pluginId';\nimport HomePage from '../HomePage';\n\nconst App = () => {\n  return (\n    <div>\n      <Switch>\n        <Route path={`/plugins/${pluginId}`} component={HomePage} exact />\n        <Route component={NotFound} />\n      </Switch>\n    </div>\n  );\n};\n\nexport default App;\n"
  },
  {
    "path": "admin/src/containers/HomePage/index.js",
    "content": "/*\n *\n * HomePage\n *\n */\n\nimport React, { memo } from 'react';\n// import PropTypes from 'prop-types';\nimport pluginId from '../../pluginId';\n\nconst HomePage = () => {\n  return (\n    <div>\n      <h1>{pluginId}&apos;s HomePage</h1>\n      <p>Happy coding</p>\n    </div>\n  );\n};\n\nexport default memo(HomePage);\n"
  },
  {
    "path": "admin/src/containers/Initializer/index.js",
    "content": "/**\n *\n * Initializer\n *\n */\n\nimport { useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport pluginId from '../../pluginId';\n\nconst Initializer = ({ setPlugin }) => {\n  const ref = useRef();\n  ref.current = setPlugin;\n\n  useEffect(() => {\n    ref.current(pluginId);\n  }, []);\n\n  return null;\n};\n\nInitializer.propTypes = {\n  setPlugin: PropTypes.func.isRequired,\n};\n\nexport default Initializer;\n"
  },
  {
    "path": "admin/src/index.js",
    "content": "import { prefixPluginTranslations } from '@strapi/helper-plugin';\nimport pluginPkg from '../../package.json';\nimport pluginId from './pluginId';\nimport Initializer from './components/Initializer';\nimport PluginIcon from './components/PluginIcon';\n\nconst name = pluginPkg.strapi.name;\n\nexport default {\n  register(app) {\n    app.addMenuLink({\n      to: `/plugins/${pluginId}`,\n      icon: PluginIcon,\n      intlLabel: {\n        id: `${pluginId}.plugin.name`,\n        defaultMessage: 'ER Chart',\n      },\n      Component: async () => {\n        const component = await import(/* webpackChunkName: \"[request]\" */ './pages/App');\n\n        return component;\n      },\n      permissions: [\n        // Uncomment to set the permissions of the plugin here\n        // {\n        //   action: '', // the action name should be plugin::plugin-name.actionType\n        //   subject: null,\n        // },\n      ],\n    });\n    app.registerPlugin({\n      id: pluginId,\n      initializer: Initializer,\n      isReady: false,\n      name,\n    });\n  },\n\n  bootstrap(app) {},\n  async registerTrads({ locales }) {\n    const importedTrads = await Promise.all(\n      locales.map((locale) => {\n        return import(`./translations/${locale}.json`)\n          .then(({ default: data }) => {\n            return {\n              data: prefixPluginTranslations(data, pluginId),\n              locale,\n            };\n          })\n          .catch(() => {\n            return {\n              data: {},\n              locale,\n            };\n          });\n      })\n    );\n\n    return Promise.resolve(importedTrads);\n  },\n};\n"
  },
  {
    "path": "admin/src/pages/App/index.js",
    "content": "/**\n *\n * This component is the skeleton around the actual pages, and should only\n * contain code that should be seen on all pages. (e.g. navigation bar)\n *\n */\n\nimport React from 'react';\nimport { Switch, Route } from 'react-router-dom';\nimport { NotFound } from '@strapi/helper-plugin';\nimport pluginId from '../../pluginId';\nimport HomePage from '../HomePage';\n\nconst App = () => {\n  return (\n    <div>\n      <Switch>\n        <Route path={`/plugins/${pluginId}`} component={HomePage} exact />\n        <Route component={NotFound} />\n      </Switch>\n    </div>\n  );\n};\n\nexport default App;\n"
  },
  {
    "path": "admin/src/pages/HomePage/index.js",
    "content": "import React, { memo, useEffect, useState } from 'react';\nimport styled from 'styled-components'\nimport {\n  useParams\n} from \"react-router-dom\";\nimport { useIntl } from \"react-intl\";\nimport { ContentLayout, HeaderLayout } from \"@strapi/design-system/Layout\";\nimport { Box } from \"@strapi/design-system/Box\";\nimport { Button } from \"@strapi/design-system/Button\";\nimport getTrad from \"../../utils/getTrad\";\nimport { DiagramWidget } from '../../utils/storm-react-diagrams';\nimport { dagreLayout } from '../../utils/dagreLayout';\nimport { getTablesRelationData, getEntitiesRelationData } from '../../utils/requests';\nimport { drawEntityNodes } from '../../utils/erChart';\nimport { drawDatabaseNodes } from '../../utils/trChart';\nimport '../../utils/style.min.css';\nimport './main.css';\n\nconst Legend = styled.span`\n  width: 12px;\n  height: 3px;\n  vertical-align: middle;\n  display: inline-block;\n  margin: 0 8px 0 4px;\n  border-radius: 1px;\n\n  background-color: ${props => props.color ? props.color : \"#999\"};\n`;\n\nconst Icon = styled.span`\n  svg {\n    width: 1em;\n    height: 1em;\n    vertical-align: middle;\n\n    > g,\n    path {\n      fill: none\n    }\n  }\n`\nfunction FeatherDatabase(props) {\n  return <Icon>\n    <svg width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}><g fill=\"none\" stroke=\"#ffffff\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><ellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\"></ellipse><path d=\"M21 12c0 1.66-4 3-9 3s-9-1.34-9-3\"></path><path d=\"M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5\"></path></g></svg>\n  </Icon>\n}\n\nfunction FeatherBox(props) {\n  return <Icon>\n    <svg width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}><g fill=\"none\" stroke=\"#ffffff\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\"></path><path d=\"M3.27 6.96L12 12.01l8.73-5.05\"></path><path d=\"M12 22.08V12\"></path></g></svg>\n  </Icon>\n}\n\nfunction updateQuery(key, value) {\n  const url = new URL(window.location);\n  if (!value) {\n    url.searchParams.delete(key);\n  } else {\n    url.searchParams.set(key, value);\n  }\n  window.history.pushState({}, '', url);\n}\n\nconst HomePage = () => {\n  const url = new URL(window.location);\n  const [type, setType] = useState(url.searchParams.get('type'));\n  const [engine, setEngine] = useState();\n  const [erData, setERData] = useState();\n  const [trData, setTRData] = useState();\n  const [error, setError] = useState();\n  const [relations, setRelations] = useState(true);\n  const [components, setComponents] = useState(true);\n  const [dynamiczones, setDynamiczones] = useState(true);\n\n  const { formatMessage } = useIntl();\n  const title = formatMessage({\n    id: getTrad(\"name\"),\n    defaultMessage: \"Entity Relationship Chart\",\n  });\n  const subtitle = formatMessage({\n    id: getTrad(\"description\"),\n    defaultMessage: \"Displays Entity Relationship Diagram of all Strapi models, fields and relations.\",\n  });\n\n  useEffect(() => {\n    async function getData() {\n      try {\n        if (type === undefined && !erData) {\n          setERData(await getEntitiesRelationData());\n        } else if (type === 'database' && !trData) {\n          setTRData(await getTablesRelationData());\n        }\n      } catch (e) {\n        setError(e);\n      }\n    }\n    getData();\n  }, [type, setERData, setTRData, setError]);\n\n  useEffect(() => {\n    setEngine(null);\n    setTimeout(() => {\n      if (type === undefined && erData) {\n        const { engine, model } = drawEntityNodes(erData, { relations, components, dynamiczones });\n        setEngine(engine);\n        setTimeout(() => {\n          dagreLayout(model)\n          engine.repaintCanvas();\n        }, 0)\n      } else if (type === 'database' && trData) {\n        const { engine, model } = drawDatabaseNodes(trData, { relations, components, dynamiczones });\n        setEngine(engine);\n        setTimeout(() => {\n          dagreLayout(model);\n          engine.repaintCanvas();\n        }, 0);\n\n      }\n    }, 0)\n  }, [type, erData, trData, relations, components, dynamiczones]);\n\n  useEffect(() => {\n    updateQuery('type', type);\n  }, [type])\n\n  return (\n    <main>\n      <HeaderLayout\n        title={title}\n        subtitle={subtitle}\n        primaryAction={\n          type === undefined\n            ? <Button startIcon={<FeatherDatabase />} onClick={() => setType('database')}>Switch to Database view</Button> \n            : <Button startIcon={<FeatherBox />} onClick={() => setType()}>Switch to API view</Button>\n        }\n      />\n      <ContentLayout>\n        {error && (\n          <Box padding={7} background=\"neutral0\" hasRadius>\n            <h2>{error.toString()}</h2>\n            <pre><code>{error.stack}</code></pre>\n          </Box>\n        )}\n        {!error && (\n          <>\n            <Box padding={1}>\n              <label>\n                <input type=\"checkbox\" checked={relations} onChange={(e) => setRelations(e.target.checked)} /> relations\n                <Legend />\n              </label>\n              <label>\n                <input type=\"checkbox\" checked={components} onChange={(e) => setComponents(e.target.checked)} /> components\n                <Legend color=\"#ffc800\"/>\n              </label>\n              <label>\n                <input type=\"checkbox\" checked={dynamiczones} onChange={(e) => setDynamiczones(e.target.checked)} /> dynamiczones\n                <Legend color=\"#ff6400\" />\n              </label>\n            </Box>\n            <Box background=\"neutral0\" hasRadius style={{height: \"80vh\", width: \"100%\"}}>\n              {engine && <DiagramWidget diagramEngine={engine} />}\n            </Box>\n          </>\n        )}\n      </ContentLayout>\n    </main>\n  );\n};\n\nexport default memo(HomePage);\n"
  },
  {
    "path": "admin/src/pages/HomePage/main.css",
    "content": ".srd-diagram {\n  height: 80vh;\n  overflow: hidden;\n}\n\n/* .srd-default-link path {\n  stroke: #000;\n} */\n\n.erc-header-title p {\n  width: 100%;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  font-size: 1.3rem;\n  font-weight: 400;\n  line-height: normal;\n  color: rgb(120, 126, 143);\n  margin: 0px;\n  overflow: hidden;\n}\n\n.erc-header-title h1 {\n  position: relative;\n  width: -webkit-fit-content;\n  width: -moz-fit-content;\n  width: fit-content;\n  max-width: 100%;\n  margin-bottom: 0;\n  padding-right: 18px;\n  font-size: 2.4rem;\n  line-height: normal;\n  font-weight: 600;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n"
  },
  {
    "path": "admin/src/pluginId.js",
    "content": "const pluginPkg = require('../../package.json');\n\nconst pluginId = pluginPkg.name.replace(/^strapi-plugin-/i, '');\n\nmodule.exports = pluginId;\n"
  },
  {
    "path": "admin/src/translations/en.json",
    "content": "{}\n"
  },
  {
    "path": "admin/src/translations/fr.json",
    "content": "{}\n"
  },
  {
    "path": "admin/src/utils/dagreLayout.js",
    "content": "import dagre from '@dagrejs/dagre';\nimport { \n  PointModel,\n} from './storm-react-diagrams';\n\nexport function dagreLayout(model) {\n  // Create a new directed graph\n  const g = new dagre.graphlib.Graph({\n    multigraph: true,\n    compound: true,\n  });\n  g.setGraph({\n    align: 'DR',\n    rankdir: 'RL',\n    ranker: 'longest-path',\n    marginx: 25,\n    marginy: 25,\n  });\n  g.setDefaultEdgeLabel(function () {\n    return {};\n  });\n\n  // set nodes\n  _.forEach(model.getNodes(), (node) => {\n    g.setNode(node.getID(), {label: node.getID(), width: node.width, height: node.height });\n  });\n\n  _.forEach(model.getLinks(), (link) => {\n    // set edges\n    if (link.getSourcePort() && link.getTargetPort()) {\n      g.setEdge({\n        v: link.getSourcePort().getNode().getID(),\n        w: link.getTargetPort().getNode().getID(),\n        name: link.getID(),\n      });\n    }\n  });\n\n  // layout the graph\n  dagre.layout(g);\n\n  g.nodes().forEach((v) => {\n    const node = g.node(v);\n    model.getNode(v).setPosition(node.x - node.width / 2, node.y - node.height / 2);\n  });\n\n  g.edges().forEach((e) => {\n    const edge = g.edge(e);\n    const link = model.getLink(e.name);\n\n    const points = [link.getFirstPoint()];\n      for (let i = 1; i < edge.points.length - 1; i++) {\n        points.push(new PointModel(link, { x: edge.points[i].x, y: edge.points[i].y }));\n      }\n    link.setPoints(points.concat(link.getLastPoint()));\n  });\n}"
  },
  {
    "path": "admin/src/utils/erChart.js",
    "content": "\nimport _ from 'lodash';\nimport  { \n  DiagramEngine, \n  DiagramModel, \n  DefaultNodeModel,\n  DefaultNodeFactory, \n  DefaultLinkFactory, \n  DefaultPortFactory, \n  DefaultLabelFactory \n} from './storm-react-diagrams';\n\nexport function drawEntityNodes(data, options) {\n  const engine = new DiagramEngine();\n\n  // engine.installDefaultFactories();\n  engine.registerNodeFactory(new DefaultNodeFactory());\n  engine.registerLinkFactory(new DefaultLinkFactory());\n  engine.registerPortFactory(new DefaultPortFactory());\n  engine.registerLabelFactory(new DefaultLabelFactory());\n  \n  const model = new DiagramModel();\n  const nodes = [],\n    nodesMap = {},\n    links = [];\n\n  // build nodes and ports\n  for (const index in data) {\n    const model = data[index];\n    const color = model.modelType === 'component' ? 'rgb(255, 200, 0)' : model.kind === 'collectionType' ? 'rgb(0,126,255)' : 'rgb(85, 171, 0)'\n    const node = new DefaultNodeModel(model.key, color);\n    const ports = {};\n    const attributes = Object.keys(model.attributes)\n\n    ports.id = node.addInPort('id')\n\n    for (const attr of attributes) {\n      const fieldData = model.attributes[attr];\n      const relation = fieldData.type === 'relation';\n      const component = fieldData.type === 'component';\n      const dynamiczone = fieldData.type === 'dynamiczone';\n      \n      if (relation) {\n        ports[attr] = node.addOutPort(attr);\n      } else if (component) {\n        ports[attr] = node.addOutPort(attr);\n      } else if (dynamiczone) {\n        ports[attr] = node.addOutPort(attr);\n      } else {\n        //if scalar field\n        ports[attr] = node.addInPort(attr);\n      }\n    }\n    \n    node.setPosition(0, 0);\n    nodes.push(node);\n    nodesMap[model.key] = { node, ports };\n  }\n\n  // build links\n  for (const index in data) {\n    const model = data[index];\n    const { node, ports } = nodesMap[model.key]\n    const attributes = Object.keys(model.attributes)\n\n    for (const attr of attributes) {\n      const fieldData = model.attributes[attr];\n      const relation = fieldData.type === 'relation';\n      const component = fieldData.type === 'component' && fieldData?.component;\n      const dynamiczone = fieldData.type === 'dynamiczone' && fieldData?.components;\n      const relationTarget = fieldData?.target\n      // const relationField = fieldData.inversedBy || fieldData.morphBy || fieldData.mappedBy;\n      \n      if (relation && options.relations && relationTarget && nodesMap[relationTarget]) {\n        //if relation\n        const outPort = ports[attr]\n        const link = outPort.link(nodesMap[relationTarget].ports.id);\n        link.setColor('#999');\n        links.push(link);\n      } else if (component && nodesMap[component] && options.components) {\n        //if component\n        const outPort = ports[attr];\n        const link = outPort.link(nodesMap[component].ports.id);\n        link.setColor('#ffc800');\n        links.push(link);\n      } else if (dynamiczone && Array.isArray(dynamiczone) && options.dynamiczones) {\n        //if dynamiczone\n        for (const compId of dynamiczone) {\n          if (nodesMap[compId]) {\n            const outPort = ports[attr];\n            const link = outPort.link(nodesMap[compId].ports.id);\n            link.setColor('#ff6400');\n            links.push(link);\n          }\n        }\n      }\n    }\n    nodesMap[model.key] = { node, ports };\n  }\n\n  model.addAll(...nodes, ...links);\n  engine.setDiagramModel(model);\n  return { engine, model };\n}"
  },
  {
    "path": "admin/src/utils/getTrad.js",
    "content": "import pluginId from '../pluginId';\n\nconst getTrad = (id) => `${pluginId}.${id}`;\n\nexport default getTrad;\n"
  },
  {
    "path": "admin/src/utils/requests.js",
    "content": "\nimport { request } from '@strapi/helper-plugin';\nimport pluginId from '../pluginId';\n\nexport async function getEntitiesRelationData() {\n  return await request(`/${pluginId}/er-data`);\n}\nexport async function getTablesRelationData() {\n  return await request(`/${pluginId}/tr-data`);\n}"
  },
  {
    "path": "admin/src/utils/storm-react-diagrams.js",
    "content": "/**\n * This is a copy of storm-react-diagrams/dist/main.js with 2 replaces:\n * '\"_\"' replaced as 'lodash'\n * 'var _ = __webpack_require__(0);' replaced as 'var _ = require(\"lodash\")'\n * Cleaner solution is to use webpack alias: {resolve} in webpack config, but strapi plugin doesn't allow\n * to change webpack config on plugin level, so users of this plugin would need to manually update\n * src/admin/webpack.config.js in their project. This override makes it easier.\n */\n\n(function webpackUniversalModuleDefinition(root, factory) {\n  if (typeof exports === 'object' && typeof module === 'object') {\n    module.exports = factory(require('lodash'), require('react'));\n  } else if (typeof define === 'function' && define.amd) define(['lodash', 'react'], factory);\n  else if (typeof exports === 'object') exports['storm-react-diagrams'] = factory(require('lodash'), require('react'));\n  else root['storm-react-diagrams'] = factory(root['lodash'], root['React']);\n})(window, function (__WEBPACK_EXTERNAL_MODULE__0__, __WEBPACK_EXTERNAL_MODULE__1__) {\n  return (function (modules) {\n    var installedModules = {};\n\n    function __webpack_require__(moduleId) {\n      if (installedModules[moduleId]) {\n        return installedModules[moduleId].exports;\n      }\n      var module = (installedModules[moduleId] = { i: moduleId, l: false, exports: {} });\n      modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n      module.l = true;\n      return module.exports;\n    }\n\n    __webpack_require__.m = modules;\n    __webpack_require__.c = installedModules;\n    __webpack_require__.d = function (exports, name, getter) {\n      if (!__webpack_require__.o(exports, name)) {\n        Object.defineProperty(exports, name, { configurable: false, enumerable: true, get: getter });\n      }\n    };\n    __webpack_require__.r = function (exports) {\n      Object.defineProperty(exports, '__esModule', { value: true });\n    };\n    __webpack_require__.n = function (module) {\n      var getter =\n        module && module.__esModule\n          ? function getDefault() {\n              return module['default'];\n            }\n          : function getModuleExports() {\n              return module;\n            };\n      __webpack_require__.d(getter, 'a', getter);\n      return getter;\n    };\n    __webpack_require__.o = function (object, property) {\n      return Object.prototype.hasOwnProperty.call(object, property);\n    };\n    __webpack_require__.p = '';\n    return __webpack_require__((__webpack_require__.s = 45));\n  })([\n    function (module, exports) {\n      module.exports = __WEBPACK_EXTERNAL_MODULE__0__;\n    },\n    function (module, exports) {\n      module.exports = __WEBPACK_EXTERNAL_MODULE__1__;\n    },\n    function (module, exports) {\n      var DiagonalMovement = { Always: 1, Never: 2, IfAtMostOneObstacle: 3, OnlyWhenNoObstacles: 4 };\n      module.exports = DiagonalMovement;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      var __assign =\n        (this && this.__assign) ||\n        Object.assign ||\n        function (t) {\n          for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n          }\n          return t;\n        };\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var React = __webpack_require__(1);\n      var BaseWidget = (function (_super) {\n        __extends(BaseWidget, _super);\n\n        function BaseWidget(name, props) {\n          var _this = _super.call(this, props) || this;\n          _this.className = name;\n          return _this;\n        }\n\n        BaseWidget.prototype.bem = function (selector) {\n          return (this.props.baseClass || this.className) + selector + ' ';\n        };\n        BaseWidget.prototype.getClassName = function () {\n          return (this.props.baseClass || this.className) + ' ' + (this.props.className ? this.props.className + ' ' : '');\n        };\n        BaseWidget.prototype.getProps = function () {\n          return __assign({}, this.props.extraProps || {}, { className: this.getClassName() });\n        };\n        return BaseWidget;\n      })(React.Component);\n      exports.BaseWidget = BaseWidget;\n    },\n    function (module, exports) {\n      function backtrace(node) {\n        var path = [[node.x, node.y]];\n        while (node.parent) {\n          node = node.parent;\n          path.push([node.x, node.y]);\n        }\n        return path.reverse();\n      }\n\n      exports.backtrace = backtrace;\n\n      function biBacktrace(nodeA, nodeB) {\n        var pathA = backtrace(nodeA),\n          pathB = backtrace(nodeB);\n        return pathA.concat(pathB.reverse());\n      }\n\n      exports.biBacktrace = biBacktrace;\n\n      function pathLength(path) {\n        var i,\n          sum = 0,\n          a,\n          b,\n          dx,\n          dy;\n        for (i = 1; i < path.length; ++i) {\n          a = path[i - 1];\n          b = path[i];\n          dx = a[0] - b[0];\n          dy = a[1] - b[1];\n          sum += Math.sqrt(dx * dx + dy * dy);\n        }\n        return sum;\n      }\n\n      exports.pathLength = pathLength;\n\n      function interpolate(x0, y0, x1, y1) {\n        var abs = Math.abs,\n          line = [],\n          sx,\n          sy,\n          dx,\n          dy,\n          err,\n          e2;\n        dx = abs(x1 - x0);\n        dy = abs(y1 - y0);\n        sx = x0 < x1 ? 1 : -1;\n        sy = y0 < y1 ? 1 : -1;\n        err = dx - dy;\n        while (true) {\n          line.push([x0, y0]);\n          if (x0 === x1 && y0 === y1) {\n            break;\n          }\n          e2 = 2 * err;\n          if (e2 > -dy) {\n            err = err - dy;\n            x0 = x0 + sx;\n          }\n          if (e2 < dx) {\n            err = err + dx;\n            y0 = y0 + sy;\n          }\n        }\n        return line;\n      }\n\n      exports.interpolate = interpolate;\n\n      function expandPath(path) {\n        var expanded = [],\n          len = path.length,\n          coord0,\n          coord1,\n          interpolated,\n          interpolatedLen,\n          i,\n          j;\n        if (len < 2) {\n          return expanded;\n        }\n        for (i = 0; i < len - 1; ++i) {\n          coord0 = path[i];\n          coord1 = path[i + 1];\n          interpolated = interpolate(coord0[0], coord0[1], coord1[0], coord1[1]);\n          interpolatedLen = interpolated.length;\n          for (j = 0; j < interpolatedLen - 1; ++j) {\n            expanded.push(interpolated[j]);\n          }\n        }\n        expanded.push(path[len - 1]);\n        return expanded;\n      }\n\n      exports.expandPath = expandPath;\n\n      function smoothenPath(grid, path) {\n        var len = path.length,\n          x0 = path[0][0],\n          y0 = path[0][1],\n          x1 = path[len - 1][0],\n          y1 = path[len - 1][1],\n          sx,\n          sy,\n          ex,\n          ey,\n          newPath,\n          i,\n          j,\n          coord,\n          line,\n          testCoord,\n          blocked;\n        sx = x0;\n        sy = y0;\n        newPath = [[sx, sy]];\n        for (i = 2; i < len; ++i) {\n          coord = path[i];\n          ex = coord[0];\n          ey = coord[1];\n          line = interpolate(sx, sy, ex, ey);\n          blocked = false;\n          for (j = 1; j < line.length; ++j) {\n            testCoord = line[j];\n            if (!grid.isWalkableAt(testCoord[0], testCoord[1])) {\n              blocked = true;\n              break;\n            }\n          }\n          if (blocked) {\n            lastValidCoord = path[i - 1];\n            newPath.push(lastValidCoord);\n            sx = lastValidCoord[0];\n            sy = lastValidCoord[1];\n          }\n        }\n        newPath.push([x1, y1]);\n        return newPath;\n      }\n\n      exports.smoothenPath = smoothenPath;\n\n      function compressPath(path) {\n        if (path.length < 3) {\n          return path;\n        }\n        var compressed = [],\n          sx = path[0][0],\n          sy = path[0][1],\n          px = path[1][0],\n          py = path[1][1],\n          dx = px - sx,\n          dy = py - sy,\n          lx,\n          ly,\n          ldx,\n          ldy,\n          sq,\n          i;\n        sq = Math.sqrt(dx * dx + dy * dy);\n        dx /= sq;\n        dy /= sq;\n        compressed.push([sx, sy]);\n        for (i = 2; i < path.length; i++) {\n          lx = px;\n          ly = py;\n          ldx = dx;\n          ldy = dy;\n          px = path[i][0];\n          py = path[i][1];\n          dx = px - lx;\n          dy = py - ly;\n          sq = Math.sqrt(dx * dx + dy * dy);\n          dx /= sq;\n          dy /= sq;\n          if (dx !== ldx || dy !== ldy) {\n            compressed.push([lx, ly]);\n          }\n        }\n        compressed.push([px, py]);\n        return compressed;\n      }\n\n      exports.compressPath = compressPath;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var BaseModel_1 = __webpack_require__(6);\n\n      var PointModel = (function (_super) {\n        __extends(PointModel, _super);\n\n        function PointModel(link, points) {\n          var _this = _super.call(this) || this;\n          _this.x = points.x;\n          _this.y = points.y;\n          _this.parent = link;\n          return _this;\n        }\n\n        PointModel.prototype.getSelectedEntities = function () {\n          if (_super.prototype.isSelected.call(this) && !this.isConnectedToPort()) {\n            return [this];\n          }\n          return [];\n        };\n        PointModel.prototype.isConnectedToPort = function () {\n          return this.parent.getPortForPoint(this) !== null;\n        };\n        PointModel.prototype.getLink = function () {\n          return this.getParent();\n        };\n        PointModel.prototype.deSerialize = function (ob, engine) {\n          _super.prototype.deSerialize.call(this, ob, engine);\n          this.x = ob.x;\n          this.y = ob.y;\n        };\n        PointModel.prototype.serialize = function () {\n          return _.merge(_super.prototype.serialize.call(this), { x: this.x, y: this.y });\n        };\n        PointModel.prototype.remove = function () {\n          if (this.parent) {\n            this.parent.removePoint(this);\n          }\n          _super.prototype.remove.call(this);\n        };\n        PointModel.prototype.updateLocation = function (points) {\n          this.x = points.x;\n          this.y = points.y;\n        };\n        PointModel.prototype.getX = function () {\n          return this.x;\n        };\n        PointModel.prototype.getY = function () {\n          return this.y;\n        };\n        PointModel.prototype.isLocked = function () {\n          return _super.prototype.isLocked.call(this) || this.getParent().isLocked();\n        };\n        return PointModel;\n      })(BaseModel_1.BaseModel);\n      exports.PointModel = PointModel;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      var __assign =\n        (this && this.__assign) ||\n        Object.assign ||\n        function (t) {\n          for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n          }\n          return t;\n        };\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var BaseEntity_1 = __webpack_require__(13);\n      var _ = require('lodash');\n      var BaseModel = (function (_super) {\n        __extends(BaseModel, _super);\n\n        function BaseModel(type, id) {\n          var _this = _super.call(this, id) || this;\n          _this.type = type;\n          _this.selected = false;\n          return _this;\n        }\n\n        BaseModel.prototype.getParent = function () {\n          return this.parent;\n        };\n        BaseModel.prototype.setParent = function (parent) {\n          this.parent = parent;\n        };\n        BaseModel.prototype.getSelectedEntities = function () {\n          if (this.isSelected()) {\n            return [this];\n          }\n          return [];\n        };\n        BaseModel.prototype.deSerialize = function (ob, engine) {\n          _super.prototype.deSerialize.call(this, ob, engine);\n          this.type = ob.type;\n          this.selected = ob.selected;\n        };\n        BaseModel.prototype.serialize = function () {\n          return _.merge(_super.prototype.serialize.call(this), { type: this.type, selected: this.selected });\n        };\n        BaseModel.prototype.getType = function () {\n          return this.type;\n        };\n        BaseModel.prototype.getID = function () {\n          return this.id;\n        };\n        BaseModel.prototype.isSelected = function () {\n          return this.selected;\n        };\n        BaseModel.prototype.setSelected = function (selected) {\n          if (selected === void 0) {\n            selected = true;\n          }\n          this.selected = selected;\n          this.iterateListeners(function (listener, event) {\n            if (listener.selectionChanged) {\n              listener.selectionChanged(__assign({}, event, { isSelected: selected }));\n            }\n          });\n        };\n        BaseModel.prototype.remove = function () {\n          this.iterateListeners(function (listener, event) {\n            if (listener.entityRemoved) {\n              listener.entityRemoved(event);\n            }\n          });\n        };\n        return BaseModel;\n      })(BaseEntity_1.BaseEntity);\n      exports.BaseModel = BaseModel;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var closest = __webpack_require__(70);\n      var PathFinding_1 = __webpack_require__(16);\n      var Path = __webpack_require__(51);\n      var Toolkit = (function () {\n        function Toolkit() {}\n\n        Toolkit.UID = function () {\n          if (Toolkit.TESTING) {\n            Toolkit.TESTING_UID++;\n            return '' + Toolkit.TESTING_UID;\n          }\n          return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n            var r = (Math.random() * 16) | 0;\n            var v = c === 'x' ? r : (r & 3) | 8;\n            return v.toString(16);\n          });\n        };\n        Toolkit.closest = function (element, selector) {\n          if (document.body.closest) {\n            return element.closest(selector);\n          }\n          return closest(element, selector);\n        };\n        Toolkit.generateLinePath = function (firstPoint, lastPoint) {\n          return 'M' + firstPoint.x + ',' + firstPoint.y + ' L ' + lastPoint.x + ',' + lastPoint.y;\n        };\n        Toolkit.generateCurvePath = function (firstPoint, lastPoint, curvy) {\n          if (curvy === void 0) {\n            curvy = 0;\n          }\n          var isHorizontal = Math.abs(firstPoint.x - lastPoint.x) > Math.abs(firstPoint.y - lastPoint.y);\n          var curvyX = isHorizontal ? curvy : 0;\n          var curvyY = isHorizontal ? 0 : curvy;\n          return (\n            'M' +\n            firstPoint.x +\n            ',' +\n            firstPoint.y +\n            ' C ' +\n            (firstPoint.x + curvyX) +\n            ',' +\n            (firstPoint.y + curvyY) +\n            '\\n    ' +\n            (lastPoint.x - curvyX) +\n            ',' +\n            (lastPoint.y - curvyY) +\n            ' ' +\n            lastPoint.x +\n            ',' +\n            lastPoint.y\n          );\n        };\n        Toolkit.generateDynamicPath = function (pathCoords) {\n          var path = Path();\n          path = path.moveto(pathCoords[0][0] * PathFinding_1.ROUTING_SCALING_FACTOR, pathCoords[0][1] * PathFinding_1.ROUTING_SCALING_FACTOR);\n          pathCoords.slice(1).forEach(function (coords) {\n            path = path.lineto(coords[0] * PathFinding_1.ROUTING_SCALING_FACTOR, coords[1] * PathFinding_1.ROUTING_SCALING_FACTOR);\n          });\n          return path.print();\n        };\n        Toolkit.TESTING = false;\n        Toolkit.TESTING_UID = 0;\n        return Toolkit;\n      })();\n      exports.Toolkit = Toolkit;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var AbstractFactory = (function () {\n        function AbstractFactory(name) {\n          this.type = name;\n        }\n\n        AbstractFactory.prototype.getType = function () {\n          return this.type;\n        };\n        return AbstractFactory;\n      })();\n      exports.AbstractFactory = AbstractFactory;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var BaseModel_1 = __webpack_require__(6);\n      var _ = require('lodash');\n      var NodeModel = (function (_super) {\n        __extends(NodeModel, _super);\n\n        function NodeModel(nodeType, id) {\n          if (nodeType === void 0) {\n            nodeType = 'default';\n          }\n          var _this = _super.call(this, nodeType, id) || this;\n          _this.x = 0;\n          _this.y = 0;\n          _this.extras = {};\n          _this.ports = {};\n          return _this;\n        }\n\n        NodeModel.prototype.setPosition = function (x, y) {\n          var oldX = this.x;\n          var oldY = this.y;\n          _.forEach(this.ports, function (port) {\n            _.forEach(port.getLinks(), function (link) {\n              var point = link.getPointForPort(port);\n              point.x = point.x + x - oldX;\n              point.y = point.y + y - oldY;\n            });\n          });\n          this.x = x;\n          this.y = y;\n        };\n        NodeModel.prototype.getSelectedEntities = function () {\n          var entities = _super.prototype.getSelectedEntities.call(this);\n          if (this.isSelected()) {\n            _.forEach(this.ports, function (port) {\n              entities = entities.concat(\n                _.map(port.getLinks(), function (link) {\n                  return link.getPointForPort(port);\n                })\n              );\n            });\n          }\n          return entities;\n        };\n        NodeModel.prototype.deSerialize = function (ob, engine) {\n          var _this = this;\n          _super.prototype.deSerialize.call(this, ob, engine);\n          this.x = ob.x;\n          this.y = ob.y;\n          this.extras = ob.extras;\n          _.forEach(ob.ports, function (port) {\n            var portOb = engine.getPortFactory(port.type).getNewInstance();\n            portOb.deSerialize(port, engine);\n            _this.addPort(portOb);\n          });\n        };\n        NodeModel.prototype.serialize = function () {\n          return _.merge(_super.prototype.serialize.call(this), {\n            x: this.x,\n            y: this.y,\n            extras: this.extras,\n            ports: _.map(this.ports, function (port) {\n              return port.serialize();\n            }),\n          });\n        };\n        NodeModel.prototype.doClone = function (lookupTable, clone) {\n          if (lookupTable === void 0) {\n            lookupTable = {};\n          }\n          clone.ports = {};\n          _.forEach(this.ports, function (port) {\n            clone.addPort(port.clone(lookupTable));\n          });\n        };\n        NodeModel.prototype.remove = function () {\n          _super.prototype.remove.call(this);\n          _.forEach(this.ports, function (port) {\n            _.forEach(port.getLinks(), function (link) {\n              link.remove();\n            });\n          });\n        };\n        NodeModel.prototype.getPortFromID = function (id) {\n          for (var i in this.ports) {\n            if (this.ports[i].id === id) {\n              return this.ports[i];\n            }\n          }\n          return null;\n        };\n        NodeModel.prototype.getPort = function (name) {\n          return this.ports[name];\n        };\n        NodeModel.prototype.getPorts = function () {\n          return this.ports;\n        };\n        NodeModel.prototype.removePort = function (port) {\n          if (this.ports[port.name]) {\n            this.ports[port.name].setParent(null);\n            delete this.ports[port.name];\n          }\n        };\n        NodeModel.prototype.addPort = function (port) {\n          port.setParent(this);\n          this.ports[port.name] = port;\n          return port;\n        };\n        NodeModel.prototype.updateDimensions = function (_a) {\n          var width = _a.width,\n            height = _a.height;\n          this.width = width;\n          this.height = height;\n        };\n        return NodeModel;\n      })(BaseModel_1.BaseModel);\n      exports.NodeModel = NodeModel;\n    },\n    function (module, exports) {\n      module.exports = {\n        manhattan: function (dx, dy) {\n          return dx + dy;\n        },\n        euclidean: function (dx, dy) {\n          return Math.sqrt(dx * dx + dy * dy);\n        },\n        octile: function (dx, dy) {\n          var F = Math.SQRT2 - 1;\n          return dx < dy ? F * dx + dy : F * dy + dx;\n        },\n        chebyshev: function (dx, dy) {\n          return Math.max(dx, dy);\n        },\n      };\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var BaseAction = (function () {\n        function BaseAction(mouseX, mouseY) {\n          this.mouseX = mouseX;\n          this.mouseY = mouseY;\n          this.ms = new Date().getTime();\n        }\n\n        return BaseAction;\n      })();\n      exports.BaseAction = BaseAction;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var BaseModel_1 = __webpack_require__(6);\n      var _ = require('lodash');\n      var PortModel = (function (_super) {\n        __extends(PortModel, _super);\n\n        function PortModel(name, type, id, maximumLinks) {\n          var _this = _super.call(this, type, id) || this;\n          _this.name = name;\n          _this.links = {};\n          _this.maximumLinks = maximumLinks;\n          return _this;\n        }\n\n        PortModel.prototype.deSerialize = function (ob, engine) {\n          _super.prototype.deSerialize.call(this, ob, engine);\n          this.name = ob.name;\n          this.maximumLinks = ob.maximumLinks;\n        };\n        PortModel.prototype.serialize = function () {\n          return _.merge(_super.prototype.serialize.call(this), {\n            name: this.name,\n            parentNode: this.parent.id,\n            links: _.map(this.links, function (link) {\n              return link.id;\n            }),\n            maximumLinks: this.maximumLinks,\n          });\n        };\n        PortModel.prototype.doClone = function (lookupTable, clone) {\n          if (lookupTable === void 0) {\n            lookupTable = {};\n          }\n          clone.links = {};\n          clone.parentNode = this.getParent().clone(lookupTable);\n        };\n        PortModel.prototype.getNode = function () {\n          return this.getParent();\n        };\n        PortModel.prototype.getName = function () {\n          return this.name;\n        };\n        PortModel.prototype.getMaximumLinks = function () {\n          return this.maximumLinks;\n        };\n        PortModel.prototype.setMaximumLinks = function (maximumLinks) {\n          this.maximumLinks = maximumLinks;\n        };\n        PortModel.prototype.removeLink = function (link) {\n          delete this.links[link.getID()];\n        };\n        PortModel.prototype.addLink = function (link) {\n          this.links[link.getID()] = link;\n        };\n        PortModel.prototype.getLinks = function () {\n          return this.links;\n        };\n        PortModel.prototype.createLinkModel = function () {\n          if (_.isFinite(this.maximumLinks)) {\n            var numberOfLinks = _.size(this.links);\n            if (this.maximumLinks === 1 && numberOfLinks >= 1) {\n              return _.values(this.links)[0];\n            } else if (numberOfLinks >= this.maximumLinks) {\n              return null;\n            }\n          }\n          return null;\n        };\n        PortModel.prototype.updateCoords = function (_a) {\n          var x = _a.x,\n            y = _a.y,\n            width = _a.width,\n            height = _a.height;\n          this.x = x;\n          this.y = y;\n          this.width = width;\n          this.height = height;\n        };\n        PortModel.prototype.canLinkToPort = function (port) {\n          return true;\n        };\n        PortModel.prototype.isLocked = function () {\n          return _super.prototype.isLocked.call(this) || this.getParent().isLocked();\n        };\n        return PortModel;\n      })(BaseModel_1.BaseModel);\n      exports.PortModel = PortModel;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __assign =\n        (this && this.__assign) ||\n        Object.assign ||\n        function (t) {\n          for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n          }\n          return t;\n        };\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var Toolkit_1 = __webpack_require__(7);\n      var _ = require('lodash');\n      var BaseEntity = (function () {\n        function BaseEntity(id) {\n          this.listeners = {};\n          this.id = id || Toolkit_1.Toolkit.UID();\n          this.locked = false;\n        }\n\n        BaseEntity.prototype.getID = function () {\n          return this.id;\n        };\n        BaseEntity.prototype.doClone = function (lookupTable, clone) {\n          if (lookupTable === void 0) {\n            lookupTable = {};\n          }\n        };\n        BaseEntity.prototype.clone = function (lookupTable) {\n          if (lookupTable === void 0) {\n            lookupTable = {};\n          }\n          if (lookupTable[this.id]) {\n            return lookupTable[this.id];\n          }\n          var clone = _.clone(this);\n          clone.id = Toolkit_1.Toolkit.UID();\n          clone.clearListeners();\n          lookupTable[this.id] = clone;\n          this.doClone(lookupTable, clone);\n          return clone;\n        };\n        BaseEntity.prototype.clearListeners = function () {\n          this.listeners = {};\n        };\n        BaseEntity.prototype.deSerialize = function (data, engine) {\n          this.id = data.id;\n        };\n        BaseEntity.prototype.serialize = function () {\n          return { id: this.id };\n        };\n        BaseEntity.prototype.iterateListeners = function (cb) {\n          var event = {\n            id: Toolkit_1.Toolkit.UID(),\n            firing: true,\n            entity: this,\n            stopPropagation: function () {\n              event.firing = false;\n            },\n          };\n          for (var i in this.listeners) {\n            if (this.listeners.hasOwnProperty(i)) {\n              if (!event.firing) {\n                return;\n              }\n              cb(this.listeners[i], event);\n            }\n          }\n        };\n        BaseEntity.prototype.removeListener = function (listener) {\n          if (this.listeners[listener]) {\n            delete this.listeners[listener];\n            return true;\n          }\n          return false;\n        };\n        BaseEntity.prototype.addListener = function (listener) {\n          var uid = Toolkit_1.Toolkit.UID();\n          this.listeners[uid] = listener;\n          return uid;\n        };\n        BaseEntity.prototype.isLocked = function () {\n          return this.locked;\n        };\n        BaseEntity.prototype.setLocked = function (locked) {\n          if (locked === void 0) {\n            locked = true;\n          }\n          this.locked = locked;\n          this.iterateListeners(function (listener, event) {\n            if (listener.lockChanged) {\n              listener.lockChanged(__assign({}, event, { locked: locked }));\n            }\n          });\n        };\n        return BaseEntity;\n      })();\n      exports.BaseEntity = BaseEntity;\n    },\n    function (module, exports, __webpack_require__) {\n      var Heap = __webpack_require__(15);\n      var Util = __webpack_require__(4);\n      var Heuristic = __webpack_require__(10);\n      var DiagonalMovement = __webpack_require__(2);\n\n      function JumpPointFinderBase(opt) {\n        opt = opt || {};\n        this.heuristic = opt.heuristic || Heuristic.manhattan;\n        this.trackJumpRecursion = opt.trackJumpRecursion || false;\n      }\n\n      JumpPointFinderBase.prototype.findPath = function (startX, startY, endX, endY, grid) {\n        var openList = (this.openList = new Heap(function (nodeA, nodeB) {\n            return nodeA.f - nodeB.f;\n          })),\n          startNode = (this.startNode = grid.getNodeAt(startX, startY)),\n          endNode = (this.endNode = grid.getNodeAt(endX, endY)),\n          node;\n        this.grid = grid;\n        startNode.g = 0;\n        startNode.f = 0;\n        openList.push(startNode);\n        startNode.opened = true;\n        while (!openList.empty()) {\n          node = openList.pop();\n          node.closed = true;\n          if (node === endNode) {\n            return Util.expandPath(Util.backtrace(endNode));\n          }\n          this._identifySuccessors(node);\n        }\n        return [];\n      };\n      JumpPointFinderBase.prototype._identifySuccessors = function (node) {\n        var grid = this.grid,\n          heuristic = this.heuristic,\n          openList = this.openList,\n          endX = this.endNode.x,\n          endY = this.endNode.y,\n          neighbors,\n          neighbor,\n          jumpPoint,\n          i,\n          l,\n          x = node.x,\n          y = node.y,\n          jx,\n          jy,\n          dx,\n          dy,\n          d,\n          ng,\n          jumpNode,\n          abs = Math.abs,\n          max = Math.max;\n        neighbors = this._findNeighbors(node);\n        for (i = 0, l = neighbors.length; i < l; ++i) {\n          neighbor = neighbors[i];\n          jumpPoint = this._jump(neighbor[0], neighbor[1], x, y);\n          if (jumpPoint) {\n            jx = jumpPoint[0];\n            jy = jumpPoint[1];\n            jumpNode = grid.getNodeAt(jx, jy);\n            if (jumpNode.closed) {\n              continue;\n            }\n            d = Heuristic.octile(abs(jx - x), abs(jy - y));\n            ng = node.g + d;\n            if (!jumpNode.opened || ng < jumpNode.g) {\n              jumpNode.g = ng;\n              jumpNode.h = jumpNode.h || heuristic(abs(jx - endX), abs(jy - endY));\n              jumpNode.f = jumpNode.g + jumpNode.h;\n              jumpNode.parent = node;\n              if (!jumpNode.opened) {\n                openList.push(jumpNode);\n                jumpNode.opened = true;\n              } else {\n                openList.updateItem(jumpNode);\n              }\n            }\n          }\n        }\n      };\n      module.exports = JumpPointFinderBase;\n    },\n    function (module, exports, __webpack_require__) {\n      module.exports = __webpack_require__(66);\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var PF = __webpack_require__(68);\n      exports.ROUTING_SCALING_FACTOR = 5;\n      var pathFinderInstance = new PF.JumpPointFinder({\n        heuristic: PF.Heuristic.manhattan,\n        diagonalMovement: PF.DiagonalMovement.Never,\n      });\n      var PathFinding = (function () {\n        function PathFinding(diagramEngine) {\n          this.instance = pathFinderInstance;\n          this.diagramEngine = diagramEngine;\n        }\n\n        PathFinding.prototype.calculateDirectPath = function (from, to) {\n          var matrix = this.diagramEngine.getCanvasMatrix();\n          var grid = new PF.Grid(matrix);\n          return pathFinderInstance.findPath(\n            this.diagramEngine.translateRoutingX(Math.floor(from.x / exports.ROUTING_SCALING_FACTOR)),\n            this.diagramEngine.translateRoutingY(Math.floor(from.y / exports.ROUTING_SCALING_FACTOR)),\n            this.diagramEngine.translateRoutingX(Math.floor(to.x / exports.ROUTING_SCALING_FACTOR)),\n            this.diagramEngine.translateRoutingY(Math.floor(to.y / exports.ROUTING_SCALING_FACTOR)),\n            grid\n          );\n        };\n        PathFinding.prototype.calculateLinkStartEndCoords = function (matrix, path) {\n          var startIndex = path.findIndex(function (point) {\n            return matrix[point[1]][point[0]] === 0;\n          });\n          var endIndex =\n            path.length -\n            1 -\n            path\n              .slice()\n              .reverse()\n              .findIndex(function (point) {\n                return matrix[point[1]][point[0]] === 0;\n              });\n          if (startIndex === -1 || endIndex === -1) {\n            return undefined;\n          }\n          var pathToStart = path.slice(0, startIndex);\n          var pathToEnd = path.slice(endIndex);\n          return {\n            start: { x: path[startIndex][0], y: path[startIndex][1] },\n            end: { x: path[endIndex][0], y: path[endIndex][1] },\n            pathToStart: pathToStart,\n            pathToEnd: pathToEnd,\n          };\n        };\n        PathFinding.prototype.calculateDynamicPath = function (routingMatrix, start, end, pathToStart, pathToEnd) {\n          var _this = this;\n          var grid = new PF.Grid(routingMatrix);\n          var dynamicPath = pathFinderInstance.findPath(start.x, start.y, end.x, end.y, grid);\n          var pathCoords = pathToStart.concat(dynamicPath, pathToEnd).map(function (coords) {\n            return [_this.diagramEngine.translateRoutingX(coords[0], true), _this.diagramEngine.translateRoutingY(coords[1], true)];\n          });\n          return PF.Util.compressPath(pathCoords);\n        };\n        return PathFinding;\n      })();\n      exports.default = PathFinding;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var BaseModel_1 = __webpack_require__(6);\n      var _ = require('lodash');\n      var LabelModel = (function (_super) {\n        __extends(LabelModel, _super);\n\n        function LabelModel(type, id) {\n          var _this = _super.call(this, type, id) || this;\n          _this.offsetX = 0;\n          _this.offsetY = 0;\n          return _this;\n        }\n\n        LabelModel.prototype.deSerialize = function (ob, engine) {\n          _super.prototype.deSerialize.call(this, ob, engine);\n          this.offsetX = ob.offsetX;\n          this.offsetY = ob.offsetY;\n        };\n        LabelModel.prototype.serialize = function () {\n          return _.merge(_super.prototype.serialize.call(this), { offsetX: this.offsetX, offsetY: this.offsetY });\n        };\n        return LabelModel;\n      })(BaseModel_1.BaseModel);\n      exports.LabelModel = LabelModel;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var LabelModel_1 = __webpack_require__(17);\n      var _ = require('lodash');\n      var DefaultLabelModel = (function (_super) {\n        __extends(DefaultLabelModel, _super);\n\n        function DefaultLabelModel() {\n          var _this = _super.call(this, 'default') || this;\n          _this.offsetY = -23;\n          return _this;\n        }\n\n        DefaultLabelModel.prototype.setLabel = function (label) {\n          this.label = label;\n        };\n        DefaultLabelModel.prototype.deSerialize = function (ob, engine) {\n          _super.prototype.deSerialize.call(this, ob, engine);\n          this.label = ob.label;\n        };\n        DefaultLabelModel.prototype.serialize = function () {\n          return _.merge(_super.prototype.serialize.call(this), { label: this.label });\n        };\n        return DefaultLabelModel;\n      })(LabelModel_1.LabelModel);\n      exports.DefaultLabelModel = DefaultLabelModel;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      var __assign =\n        (this && this.__assign) ||\n        Object.assign ||\n        function (t) {\n          for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n          }\n          return t;\n        };\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var LinkModel_1 = __webpack_require__(21);\n      var _ = require('lodash');\n      var DefaultLabelModel_1 = __webpack_require__(18);\n      var LabelModel_1 = __webpack_require__(17);\n      var DefaultLinkModel = (function (_super) {\n        __extends(DefaultLinkModel, _super);\n\n        function DefaultLinkModel(type) {\n          if (type === void 0) {\n            type = 'default';\n          }\n          var _this = _super.call(this, type) || this;\n          _this.color = 'rgba(255,255,255,0.5)';\n          _this.width = 3;\n          _this.curvyness = 50;\n          return _this;\n        }\n\n        DefaultLinkModel.prototype.serialize = function () {\n          return _.merge(_super.prototype.serialize.call(this), {\n            width: this.width,\n            color: this.color,\n            curvyness: this.curvyness,\n          });\n        };\n        DefaultLinkModel.prototype.deSerialize = function (ob, engine) {\n          _super.prototype.deSerialize.call(this, ob, engine);\n          this.color = ob.color;\n          this.width = ob.width;\n          this.curvyness = ob.curvyness;\n        };\n        DefaultLinkModel.prototype.addLabel = function (label) {\n          if (label instanceof LabelModel_1.LabelModel) {\n            return _super.prototype.addLabel.call(this, label);\n          }\n          var labelOb = new DefaultLabelModel_1.DefaultLabelModel();\n          labelOb.setLabel(label);\n          return _super.prototype.addLabel.call(this, labelOb);\n        };\n        DefaultLinkModel.prototype.setWidth = function (width) {\n          this.width = width;\n          this.iterateListeners(function (listener, event) {\n            if (listener.widthChanged) {\n              listener.widthChanged(__assign({}, event, { width: width }));\n            }\n          });\n        };\n        DefaultLinkModel.prototype.setColor = function (color) {\n          this.color = color;\n          this.iterateListeners(function (listener, event) {\n            if (listener.colorChanged) {\n              listener.colorChanged(__assign({}, event, { color: color }));\n            }\n          });\n        };\n        return DefaultLinkModel;\n      })(LinkModel_1.LinkModel);\n      exports.DefaultLinkModel = DefaultLinkModel;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var _ = require('lodash');\n      var PortModel_1 = __webpack_require__(12);\n      var DefaultLinkModel_1 = __webpack_require__(19);\n      var DefaultPortModel = (function (_super) {\n        __extends(DefaultPortModel, _super);\n\n        function DefaultPortModel(isInput, name, label, id) {\n          if (label === void 0) {\n            label = null;\n          }\n          var _this = _super.call(this, name, 'default', id) || this;\n          _this.in = isInput;\n          _this.label = label || name;\n          return _this;\n        }\n\n        DefaultPortModel.prototype.deSerialize = function (object, engine) {\n          _super.prototype.deSerialize.call(this, object, engine);\n          this.in = object.in;\n          this.label = object.label;\n        };\n        DefaultPortModel.prototype.serialize = function () {\n          return _.merge(_super.prototype.serialize.call(this), { in: this.in, label: this.label });\n        };\n        DefaultPortModel.prototype.link = function (port) {\n          var link = this.createLinkModel();\n          link.setSourcePort(this);\n          link.setTargetPort(port);\n          return link;\n        };\n        DefaultPortModel.prototype.canLinkToPort = function (port) {\n          if (port instanceof DefaultPortModel) {\n            return this.in !== port.in;\n          }\n          return true;\n        };\n        DefaultPortModel.prototype.createLinkModel = function () {\n          var link = _super.prototype.createLinkModel.call(this);\n          return link || new DefaultLinkModel_1.DefaultLinkModel();\n        };\n        return DefaultPortModel;\n      })(PortModel_1.PortModel);\n      exports.DefaultPortModel = DefaultPortModel;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      var __assign =\n        (this && this.__assign) ||\n        Object.assign ||\n        function (t) {\n          for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n          }\n          return t;\n        };\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var BaseModel_1 = __webpack_require__(6);\n      var PointModel_1 = __webpack_require__(5);\n      var _ = require('lodash');\n      var LinkModel = (function (_super) {\n        __extends(LinkModel, _super);\n\n        function LinkModel(linkType, id) {\n          if (linkType === void 0) {\n            linkType = 'default';\n          }\n          var _this = _super.call(this, linkType, id) || this;\n          _this.points = [\n            new PointModel_1.PointModel(_this, { x: 0, y: 0 }),\n            new PointModel_1.PointModel(_this, {\n              x: 0,\n              y: 0,\n            }),\n          ];\n          _this.extras = {};\n          _this.sourcePort = null;\n          _this.targetPort = null;\n          _this.labels = [];\n          return _this;\n        }\n\n        LinkModel.prototype.deSerialize = function (ob, engine) {\n          var _this = this;\n          _super.prototype.deSerialize.call(this, ob, engine);\n          this.extras = ob.extras;\n          this.points = _.map(ob.points || [], function (point) {\n            var p = new PointModel_1.PointModel(_this, { x: point.x, y: point.y });\n            p.deSerialize(point, engine);\n            return p;\n          });\n          _.forEach(ob.labels || [], function (label) {\n            var labelOb = engine.getLabelFactory(label.type).getNewInstance();\n            labelOb.deSerialize(label, engine);\n            _this.addLabel(labelOb);\n          });\n          if (ob.target) {\n            this.setTargetPort(this.getParent().getNode(ob.target).getPortFromID(ob.targetPort));\n          }\n          if (ob.source) {\n            this.setSourcePort(this.getParent().getNode(ob.source).getPortFromID(ob.sourcePort));\n          }\n        };\n        LinkModel.prototype.serialize = function () {\n          return _.merge(_super.prototype.serialize.call(this), {\n            source: this.sourcePort ? this.sourcePort.getParent().id : null,\n            sourcePort: this.sourcePort ? this.sourcePort.id : null,\n            target: this.targetPort ? this.targetPort.getParent().id : null,\n            targetPort: this.targetPort ? this.targetPort.id : null,\n            points: _.map(this.points, function (point) {\n              return point.serialize();\n            }),\n            extras: this.extras,\n            labels: _.map(this.labels, function (label) {\n              return label.serialize();\n            }),\n          });\n        };\n        LinkModel.prototype.doClone = function (lookupTable, clone) {\n          if (lookupTable === void 0) {\n            lookupTable = {};\n          }\n          clone.setPoints(\n            _.map(this.getPoints(), function (point) {\n              return point.clone(lookupTable);\n            })\n          );\n          if (this.sourcePort) {\n            clone.setSourcePort(this.sourcePort.clone(lookupTable));\n          }\n          if (this.targetPort) {\n            clone.setTargetPort(this.targetPort.clone(lookupTable));\n          }\n        };\n        LinkModel.prototype.remove = function () {\n          if (this.sourcePort) {\n            this.sourcePort.removeLink(this);\n          }\n          if (this.targetPort) {\n            this.targetPort.removeLink(this);\n          }\n          _super.prototype.remove.call(this);\n        };\n        LinkModel.prototype.isLastPoint = function (point) {\n          var index = this.getPointIndex(point);\n          return index === this.points.length - 1;\n        };\n        LinkModel.prototype.getPointIndex = function (point) {\n          return this.points.indexOf(point);\n        };\n        LinkModel.prototype.getPointModel = function (id) {\n          for (var i = 0; i < this.points.length; i++) {\n            if (this.points[i].id === id) {\n              return this.points[i];\n            }\n          }\n          return null;\n        };\n        LinkModel.prototype.getPortForPoint = function (point) {\n          if (this.sourcePort !== null && this.getFirstPoint().getID() === point.getID()) {\n            return this.sourcePort;\n          }\n          if (this.targetPort !== null && this.getLastPoint().getID() === point.getID()) {\n            return this.targetPort;\n          }\n          return null;\n        };\n        LinkModel.prototype.getPointForPort = function (port) {\n          if (this.sourcePort !== null && this.sourcePort.getID() === port.getID()) {\n            return this.getFirstPoint();\n          }\n          if (this.targetPort !== null && this.targetPort.getID() === port.getID()) {\n            return this.getLastPoint();\n          }\n          return null;\n        };\n        LinkModel.prototype.getFirstPoint = function () {\n          return this.points[0];\n        };\n        LinkModel.prototype.getLastPoint = function () {\n          return this.points[this.points.length - 1];\n        };\n        LinkModel.prototype.setSourcePort = function (port) {\n          if (port !== null) {\n            port.addLink(this);\n          }\n          if (this.sourcePort !== null) {\n            this.sourcePort.removeLink(this);\n          }\n          this.sourcePort = port;\n          this.iterateListeners(function (listener, event) {\n            if (listener.sourcePortChanged) {\n              listener.sourcePortChanged(__assign({}, event, { port: port }));\n            }\n          });\n        };\n        LinkModel.prototype.getSourcePort = function () {\n          return this.sourcePort;\n        };\n        LinkModel.prototype.getTargetPort = function () {\n          return this.targetPort;\n        };\n        LinkModel.prototype.setTargetPort = function (port) {\n          if (port !== null) {\n            port.addLink(this);\n          }\n          if (this.targetPort !== null) {\n            this.targetPort.removeLink(this);\n          }\n          this.targetPort = port;\n          this.iterateListeners(function (listener, event) {\n            if (listener.targetPortChanged) {\n              listener.targetPortChanged(__assign({}, event, { port: port }));\n            }\n          });\n        };\n        LinkModel.prototype.point = function (x, y) {\n          return this.addPoint(this.generatePoint(x, y));\n        };\n        LinkModel.prototype.addLabel = function (label) {\n          label.setParent(this);\n          this.labels.push(label);\n        };\n        LinkModel.prototype.getPoints = function () {\n          return this.points;\n        };\n        LinkModel.prototype.setPoints = function (points) {\n          var _this = this;\n          _.forEach(points, function (point) {\n            point.setParent(_this);\n          });\n          this.points = points;\n        };\n        LinkModel.prototype.removePoint = function (pointModel) {\n          this.points.splice(this.getPointIndex(pointModel), 1);\n        };\n        LinkModel.prototype.removePointsBefore = function (pointModel) {\n          this.points.splice(0, this.getPointIndex(pointModel));\n        };\n        LinkModel.prototype.removePointsAfter = function (pointModel) {\n          this.points.splice(this.getPointIndex(pointModel) + 1);\n        };\n        LinkModel.prototype.removeMiddlePoints = function () {\n          if (this.points.length > 2) {\n            this.points.splice(0, this.points.length - 2);\n          }\n        };\n        LinkModel.prototype.addPoint = function (pointModel, index) {\n          if (index === void 0) {\n            index = 1;\n          }\n          pointModel.setParent(this);\n          this.points.splice(index, 0, pointModel);\n          return pointModel;\n        };\n        LinkModel.prototype.generatePoint = function (x, y) {\n          if (x === void 0) {\n            x = 0;\n          }\n          if (y === void 0) {\n            y = 0;\n          }\n          return new PointModel_1.PointModel(this, { x: x, y: y });\n        };\n        return LinkModel;\n      })(BaseModel_1.BaseModel);\n      exports.LinkModel = LinkModel;\n    },\n    function (module, exports, __webpack_require__) {\n      var Heap = __webpack_require__(15);\n      var Util = __webpack_require__(4);\n      var Heuristic = __webpack_require__(10);\n      var DiagonalMovement = __webpack_require__(2);\n\n      function BiAStarFinder(opt) {\n        opt = opt || {};\n        this.allowDiagonal = opt.allowDiagonal;\n        this.dontCrossCorners = opt.dontCrossCorners;\n        this.diagonalMovement = opt.diagonalMovement;\n        this.heuristic = opt.heuristic || Heuristic.manhattan;\n        this.weight = opt.weight || 1;\n        if (!this.diagonalMovement) {\n          if (!this.allowDiagonal) {\n            this.diagonalMovement = DiagonalMovement.Never;\n          } else {\n            if (this.dontCrossCorners) {\n              this.diagonalMovement = DiagonalMovement.OnlyWhenNoObstacles;\n            } else {\n              this.diagonalMovement = DiagonalMovement.IfAtMostOneObstacle;\n            }\n          }\n        }\n        if (this.diagonalMovement === DiagonalMovement.Never) {\n          this.heuristic = opt.heuristic || Heuristic.manhattan;\n        } else {\n          this.heuristic = opt.heuristic || Heuristic.octile;\n        }\n      }\n\n      BiAStarFinder.prototype.findPath = function (startX, startY, endX, endY, grid) {\n        var cmp = function (nodeA, nodeB) {\n            return nodeA.f - nodeB.f;\n          },\n          startOpenList = new Heap(cmp),\n          endOpenList = new Heap(cmp),\n          startNode = grid.getNodeAt(startX, startY),\n          endNode = grid.getNodeAt(endX, endY),\n          heuristic = this.heuristic,\n          diagonalMovement = this.diagonalMovement,\n          weight = this.weight,\n          abs = Math.abs,\n          SQRT2 = Math.SQRT2,\n          node,\n          neighbors,\n          neighbor,\n          i,\n          l,\n          x,\n          y,\n          ng,\n          BY_START = 1,\n          BY_END = 2;\n        startNode.g = 0;\n        startNode.f = 0;\n        startOpenList.push(startNode);\n        startNode.opened = BY_START;\n        endNode.g = 0;\n        endNode.f = 0;\n        endOpenList.push(endNode);\n        endNode.opened = BY_END;\n        while (!startOpenList.empty() && !endOpenList.empty()) {\n          node = startOpenList.pop();\n          node.closed = true;\n          neighbors = grid.getNeighbors(node, diagonalMovement);\n          for (i = 0, l = neighbors.length; i < l; ++i) {\n            neighbor = neighbors[i];\n            if (neighbor.closed) {\n              continue;\n            }\n            if (neighbor.opened === BY_END) {\n              return Util.biBacktrace(node, neighbor);\n            }\n            x = neighbor.x;\n            y = neighbor.y;\n            ng = node.g + (x - node.x === 0 || y - node.y === 0 ? 1 : SQRT2);\n            if (!neighbor.opened || ng < neighbor.g) {\n              neighbor.g = ng;\n              neighbor.h = neighbor.h || weight * heuristic(abs(x - endX), abs(y - endY));\n              neighbor.f = neighbor.g + neighbor.h;\n              neighbor.parent = node;\n              if (!neighbor.opened) {\n                startOpenList.push(neighbor);\n                neighbor.opened = BY_START;\n              } else {\n                startOpenList.updateItem(neighbor);\n              }\n            }\n          }\n          node = endOpenList.pop();\n          node.closed = true;\n          neighbors = grid.getNeighbors(node, diagonalMovement);\n          for (i = 0, l = neighbors.length; i < l; ++i) {\n            neighbor = neighbors[i];\n            if (neighbor.closed) {\n              continue;\n            }\n            if (neighbor.opened === BY_START) {\n              return Util.biBacktrace(neighbor, node);\n            }\n            x = neighbor.x;\n            y = neighbor.y;\n            ng = node.g + (x - node.x === 0 || y - node.y === 0 ? 1 : SQRT2);\n            if (!neighbor.opened || ng < neighbor.g) {\n              neighbor.g = ng;\n              neighbor.h = neighbor.h || weight * heuristic(abs(x - startX), abs(y - startY));\n              neighbor.f = neighbor.g + neighbor.h;\n              neighbor.parent = node;\n              if (!neighbor.opened) {\n                endOpenList.push(neighbor);\n                neighbor.opened = BY_END;\n              } else {\n                endOpenList.updateItem(neighbor);\n              }\n            }\n          }\n        }\n        return [];\n      };\n      module.exports = BiAStarFinder;\n    },\n    function (module, exports, __webpack_require__) {\n      var Heap = __webpack_require__(15);\n      var Util = __webpack_require__(4);\n      var Heuristic = __webpack_require__(10);\n      var DiagonalMovement = __webpack_require__(2);\n\n      function AStarFinder(opt) {\n        opt = opt || {};\n        this.allowDiagonal = opt.allowDiagonal;\n        this.dontCrossCorners = opt.dontCrossCorners;\n        this.heuristic = opt.heuristic || Heuristic.manhattan;\n        this.weight = opt.weight || 1;\n        this.diagonalMovement = opt.diagonalMovement;\n        if (!this.diagonalMovement) {\n          if (!this.allowDiagonal) {\n            this.diagonalMovement = DiagonalMovement.Never;\n          } else {\n            if (this.dontCrossCorners) {\n              this.diagonalMovement = DiagonalMovement.OnlyWhenNoObstacles;\n            } else {\n              this.diagonalMovement = DiagonalMovement.IfAtMostOneObstacle;\n            }\n          }\n        }\n        if (this.diagonalMovement === DiagonalMovement.Never) {\n          this.heuristic = opt.heuristic || Heuristic.manhattan;\n        } else {\n          this.heuristic = opt.heuristic || Heuristic.octile;\n        }\n      }\n\n      AStarFinder.prototype.findPath = function (startX, startY, endX, endY, grid) {\n        var openList = new Heap(function (nodeA, nodeB) {\n            return nodeA.f - nodeB.f;\n          }),\n          startNode = grid.getNodeAt(startX, startY),\n          endNode = grid.getNodeAt(endX, endY),\n          heuristic = this.heuristic,\n          diagonalMovement = this.diagonalMovement,\n          weight = this.weight,\n          abs = Math.abs,\n          SQRT2 = Math.SQRT2,\n          node,\n          neighbors,\n          neighbor,\n          i,\n          l,\n          x,\n          y,\n          ng;\n        startNode.g = 0;\n        startNode.f = 0;\n        openList.push(startNode);\n        startNode.opened = true;\n        while (!openList.empty()) {\n          node = openList.pop();\n          node.closed = true;\n          if (node === endNode) {\n            return Util.backtrace(endNode);\n          }\n          neighbors = grid.getNeighbors(node, diagonalMovement);\n          for (i = 0, l = neighbors.length; i < l; ++i) {\n            neighbor = neighbors[i];\n            if (neighbor.closed) {\n              continue;\n            }\n            x = neighbor.x;\n            y = neighbor.y;\n            ng = node.g + (x - node.x === 0 || y - node.y === 0 ? 1 : SQRT2);\n            if (!neighbor.opened || ng < neighbor.g) {\n              neighbor.g = ng;\n              neighbor.h = neighbor.h || weight * heuristic(abs(x - endX), abs(y - endY));\n              neighbor.f = neighbor.g + neighbor.h;\n              neighbor.parent = node;\n              if (!neighbor.opened) {\n                openList.push(neighbor);\n                neighbor.opened = true;\n              } else {\n                openList.updateItem(neighbor);\n              }\n            }\n          }\n        }\n        return [];\n      };\n      module.exports = AStarFinder;\n    },\n    function (module, exports) {\n      function Node(x, y, walkable) {\n        this.x = x;\n        this.y = y;\n        this.walkable = walkable === undefined ? true : walkable;\n      }\n\n      module.exports = Node;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      var __assign =\n        (this && this.__assign) ||\n        Object.assign ||\n        function (t) {\n          for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n          }\n          return t;\n        };\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var React = __webpack_require__(1);\n      var BaseWidget_1 = __webpack_require__(3);\n      var NodeWidget = (function (_super) {\n        __extends(NodeWidget, _super);\n\n        function NodeWidget(props) {\n          var _this = _super.call(this, 'srd-node', props) || this;\n          _this.state = {};\n          return _this;\n        }\n\n        NodeWidget.prototype.shouldComponentUpdate = function () {\n          return this.props.diagramEngine.canEntityRepaint(this.props.node);\n        };\n        NodeWidget.prototype.getClassName = function () {\n          return 'node ' + _super.prototype.getClassName.call(this) + (this.props.node.isSelected() ? this.bem('--selected') : '');\n        };\n        NodeWidget.prototype.render = function () {\n          return React.createElement(\n            'div',\n            __assign({}, this.getProps(), {\n              'data-nodeid': this.props.node.id,\n              style: { top: this.props.node.y, left: this.props.node.x },\n            }),\n            this.props.children\n          );\n        };\n        return NodeWidget;\n      })(BaseWidget_1.BaseWidget);\n      exports.NodeWidget = NodeWidget;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      var __assign =\n        (this && this.__assign) ||\n        Object.assign ||\n        function (t) {\n          for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n          }\n          return t;\n        };\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var React = __webpack_require__(1);\n      var _ = require('lodash');\n      var NodeWidget_1 = __webpack_require__(25);\n      var BaseWidget_1 = __webpack_require__(3);\n      var NodeLayerWidget = (function (_super) {\n        __extends(NodeLayerWidget, _super);\n\n        function NodeLayerWidget(props) {\n          var _this = _super.call(this, 'srd-node-layer', props) || this;\n          _this.updateNodeDimensions = function () {\n            if (!_this.props.diagramEngine.nodesRendered) {\n              var diagramModel = _this.props.diagramEngine.getDiagramModel();\n              _.map(diagramModel.getNodes(), function (node) {\n                node.updateDimensions(_this.props.diagramEngine.getNodeDimensions(node));\n              });\n            }\n          };\n          _this.state = {};\n          return _this;\n        }\n\n        NodeLayerWidget.prototype.componentDidUpdate = function () {\n          this.updateNodeDimensions();\n          this.props.diagramEngine.nodesRendered = true;\n        };\n        NodeLayerWidget.prototype.render = function () {\n          var _this = this;\n          var diagramModel = this.props.diagramEngine.getDiagramModel();\n          return React.createElement(\n            'div',\n            __assign({}, this.getProps(), {\n              style: {\n                transform:\n                  'translate(' + diagramModel.getOffsetX() + 'px,' + diagramModel.getOffsetY() + 'px) scale(' + diagramModel.getZoomLevel() / 100 + ')',\n              },\n            }),\n            _.map(diagramModel.getNodes(), function (node) {\n              return React.createElement(\n                NodeWidget_1.NodeWidget,\n                {\n                  diagramEngine: _this.props.diagramEngine,\n                  key: node.id,\n                  node: node,\n                },\n                _this.props.diagramEngine.generateWidgetForNode(node)\n              );\n            })\n          );\n        };\n        return NodeLayerWidget;\n      })(BaseWidget_1.BaseWidget);\n      exports.NodeLayerWidget = NodeLayerWidget;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var BaseWidget_1 = __webpack_require__(3);\n      var LinkWidget = (function (_super) {\n        __extends(LinkWidget, _super);\n\n        function LinkWidget(props) {\n          var _this = _super.call(this, 'srd-link', props) || this;\n          _this.state = {};\n          return _this;\n        }\n\n        LinkWidget.prototype.shouldComponentUpdate = function () {\n          return this.props.diagramEngine.canEntityRepaint(this.props.link);\n        };\n        LinkWidget.prototype.render = function () {\n          return this.props.children;\n        };\n        return LinkWidget;\n      })(BaseWidget_1.BaseWidget);\n      exports.LinkWidget = LinkWidget;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      var __assign =\n        (this && this.__assign) ||\n        Object.assign ||\n        function (t) {\n          for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n          }\n          return t;\n        };\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var React = __webpack_require__(1);\n      var LinkWidget_1 = __webpack_require__(27);\n      var _ = require('lodash');\n      var BaseWidget_1 = __webpack_require__(3);\n      var LinkLayerWidget = (function (_super) {\n        __extends(LinkLayerWidget, _super);\n\n        function LinkLayerWidget(props) {\n          var _this = _super.call(this, 'srd-link-layer', props) || this;\n          _this.state = {};\n          return _this;\n        }\n\n        LinkLayerWidget.prototype.render = function () {\n          var _this = this;\n          var diagramModel = this.props.diagramEngine.getDiagramModel();\n          return React.createElement(\n            'svg',\n            __assign({}, this.getProps(), {\n              style: {\n                transform:\n                  'translate(' + diagramModel.getOffsetX() + 'px,' + diagramModel.getOffsetY() + 'px) scale(' + diagramModel.getZoomLevel() / 100 + ')',\n              },\n            }),\n            this.props.diagramEngine.canvas &&\n              _.map(diagramModel.getLinks(), function (link) {\n                if (_this.props.diagramEngine.nodesRendered && !_this.props.diagramEngine.linksThatHaveInitiallyRendered[link.id]) {\n                  if (link.sourcePort !== null) {\n                    try {\n                      var portCenter = _this.props.diagramEngine.getPortCenter(link.sourcePort);\n                      link.points[0].updateLocation(portCenter);\n                      var portCoords = _this.props.diagramEngine.getPortCoords(link.sourcePort);\n                      link.sourcePort.updateCoords(portCoords);\n                      _this.props.diagramEngine.linksThatHaveInitiallyRendered[link.id] = true;\n                    } catch (ignore) {}\n                  }\n                  if (link.targetPort !== null) {\n                    try {\n                      var portCenter = _this.props.diagramEngine.getPortCenter(link.targetPort);\n                      _.last(link.points).updateLocation(portCenter);\n                      var portCoords = _this.props.diagramEngine.getPortCoords(link.targetPort);\n                      link.targetPort.updateCoords(portCoords);\n                      _this.props.diagramEngine.linksThatHaveInitiallyRendered[link.id] = true;\n                    } catch (ignore) {}\n                  }\n                }\n                var generatedLink = _this.props.diagramEngine.generateWidgetForLink(link);\n                if (!generatedLink) {\n                  throw new Error('no link generated for type: ' + link.getType());\n                }\n                return React.createElement(\n                  LinkWidget_1.LinkWidget,\n                  {\n                    key: link.getID(),\n                    link: link,\n                    diagramEngine: _this.props.diagramEngine,\n                  },\n                  React.cloneElement(generatedLink, { pointAdded: _this.props.pointAdded })\n                );\n              })\n          );\n        };\n        return LinkLayerWidget;\n      })(BaseWidget_1.BaseWidget);\n      exports.LinkLayerWidget = LinkLayerWidget;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var BaseAction_1 = __webpack_require__(11);\n      var SelectingAction = (function (_super) {\n        __extends(SelectingAction, _super);\n\n        function SelectingAction(mouseX, mouseY) {\n          var _this = _super.call(this, mouseX, mouseY) || this;\n          _this.mouseX2 = mouseX;\n          _this.mouseY2 = mouseY;\n          return _this;\n        }\n\n        SelectingAction.prototype.getBoxDimensions = function () {\n          return {\n            left: this.mouseX2 > this.mouseX ? this.mouseX : this.mouseX2,\n            top: this.mouseY2 > this.mouseY ? this.mouseY : this.mouseY2,\n            width: Math.abs(this.mouseX2 - this.mouseX),\n            height: Math.abs(this.mouseY2 - this.mouseY),\n            right: this.mouseX2 < this.mouseX ? this.mouseX : this.mouseX2,\n            bottom: this.mouseY2 < this.mouseY ? this.mouseY : this.mouseY2,\n          };\n        };\n        SelectingAction.prototype.containsElement = function (x, y, diagramModel) {\n          var z = diagramModel.getZoomLevel() / 100;\n          var dimensions = this.getBoxDimensions();\n          return (\n            x * z + diagramModel.getOffsetX() > dimensions.left &&\n            x * z + diagramModel.getOffsetX() < dimensions.right &&\n            y * z + diagramModel.getOffsetY() > dimensions.top &&\n            y * z + diagramModel.getOffsetY() < dimensions.bottom\n          );\n        };\n        return SelectingAction;\n      })(BaseAction_1.BaseAction);\n      exports.SelectingAction = SelectingAction;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var BaseAction_1 = __webpack_require__(11);\n      var MoveItemsAction = (function (_super) {\n        __extends(MoveItemsAction, _super);\n\n        function MoveItemsAction(mouseX, mouseY, diagramEngine) {\n          var _this = _super.call(this, mouseX, mouseY) || this;\n          _this.moved = false;\n          diagramEngine.enableRepaintEntities(diagramEngine.getDiagramModel().getSelectedItems());\n          var selectedItems = diagramEngine.getDiagramModel().getSelectedItems();\n          selectedItems = selectedItems.filter(function (item) {\n            return !diagramEngine.isModelLocked(item);\n          });\n          _this.selectionModels = selectedItems.map(function (item) {\n            return { model: item, initialX: item.x, initialY: item.y };\n          });\n          return _this;\n        }\n\n        return MoveItemsAction;\n      })(BaseAction_1.BaseAction);\n      exports.MoveItemsAction = MoveItemsAction;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var BaseAction_1 = __webpack_require__(11);\n      var MoveCanvasAction = (function (_super) {\n        __extends(MoveCanvasAction, _super);\n\n        function MoveCanvasAction(mouseX, mouseY, diagramModel) {\n          var _this = _super.call(this, mouseX, mouseY) || this;\n          _this.initialOffsetX = diagramModel.getOffsetX();\n          _this.initialOffsetY = diagramModel.getOffsetY();\n          return _this;\n        }\n\n        return MoveCanvasAction;\n      })(BaseAction_1.BaseAction);\n      exports.MoveCanvasAction = MoveCanvasAction;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var AbstractFactory_1 = __webpack_require__(8);\n      var AbstractNodeFactory = (function (_super) {\n        __extends(AbstractNodeFactory, _super);\n\n        function AbstractNodeFactory() {\n          return (_super !== null && _super.apply(this, arguments)) || this;\n        }\n\n        return AbstractNodeFactory;\n      })(AbstractFactory_1.AbstractFactory);\n      exports.AbstractNodeFactory = AbstractNodeFactory;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      var __assign =\n        (this && this.__assign) ||\n        Object.assign ||\n        function (t) {\n          for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n          }\n          return t;\n        };\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var React = __webpack_require__(1);\n      var BaseWidget_1 = __webpack_require__(3);\n      var PortWidget = (function (_super) {\n        __extends(PortWidget, _super);\n\n        function PortWidget(props) {\n          var _this = _super.call(this, 'srd-port', props) || this;\n          _this.state = { selected: false };\n          return _this;\n        }\n\n        PortWidget.prototype.getClassName = function () {\n          return 'port ' + _super.prototype.getClassName.call(this) + (this.state.selected ? this.bem('--selected') : '');\n        };\n        PortWidget.prototype.render = function () {\n          var _this = this;\n          return React.createElement(\n            'div',\n            __assign({}, this.getProps(), {\n              onMouseEnter: function () {\n                _this.setState({ selected: true });\n              },\n              onMouseLeave: function () {\n                _this.setState({ selected: false });\n              },\n              'data-name': this.props.name,\n              'data-nodeid': this.props.node.getID(),\n            })\n          );\n        };\n        return PortWidget;\n      })(BaseWidget_1.BaseWidget);\n      exports.PortWidget = PortWidget;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      var __assign =\n        (this && this.__assign) ||\n        Object.assign ||\n        function (t) {\n          for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n          }\n          return t;\n        };\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var React = __webpack_require__(1);\n      var PortWidget_1 = __webpack_require__(33);\n      var BaseWidget_1 = __webpack_require__(3);\n      var DefaultPortLabel = (function (_super) {\n        __extends(DefaultPortLabel, _super);\n\n        function DefaultPortLabel(props) {\n          return _super.call(this, 'srd-default-port', props) || this;\n        }\n\n        DefaultPortLabel.prototype.getClassName = function () {\n          return _super.prototype.getClassName.call(this) + (this.props.model.in ? this.bem('--in') : this.bem('--out'));\n        };\n        DefaultPortLabel.prototype.render = function () {\n          var port = React.createElement(PortWidget_1.PortWidget, {\n            node: this.props.model.getParent(),\n            name: this.props.model.name,\n          });\n          var label = React.createElement('div', { className: 'name' }, this.props.model.label);\n          return React.createElement('div', __assign({}, this.getProps()), this.props.model.in ? port : label, this.props.model.in ? label : port);\n        };\n        return DefaultPortLabel;\n      })(BaseWidget_1.BaseWidget);\n      exports.DefaultPortLabel = DefaultPortLabel;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      var __assign =\n        (this && this.__assign) ||\n        Object.assign ||\n        function (t) {\n          for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n          }\n          return t;\n        };\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var React = __webpack_require__(1);\n      var _ = require('lodash');\n      var DefaultPortLabelWidget_1 = __webpack_require__(34);\n      var BaseWidget_1 = __webpack_require__(3);\n      var DefaultNodeWidget = (function (_super) {\n        __extends(DefaultNodeWidget, _super);\n\n        function DefaultNodeWidget(props) {\n          var _this = _super.call(this, 'srd-default-node', props) || this;\n          _this.state = {};\n          return _this;\n        }\n\n        DefaultNodeWidget.prototype.generatePort = function (port) {\n          return React.createElement(DefaultPortLabelWidget_1.DefaultPortLabel, { model: port, key: port.id });\n        };\n        DefaultNodeWidget.prototype.render = function () {\n          return React.createElement(\n            'div',\n            __assign({}, this.getProps(), { style: { background: this.props.node.color } }),\n            React.createElement('div', { className: this.bem('__title') }, React.createElement('div', { className: this.bem('__name') }, this.props.node.name)),\n            React.createElement(\n              'div',\n              { className: this.bem('__ports') },\n              React.createElement('div', { className: this.bem('__in') }, _.map(this.props.node.getInPorts(), this.generatePort.bind(this))),\n              React.createElement('div', { className: this.bem('__out') }, _.map(this.props.node.getOutPorts(), this.generatePort.bind(this)))\n            )\n          );\n        };\n        return DefaultNodeWidget;\n      })(BaseWidget_1.BaseWidget);\n      exports.DefaultNodeWidget = DefaultNodeWidget;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var AbstractFactory_1 = __webpack_require__(8);\n      var AbstractLinkFactory = (function (_super) {\n        __extends(AbstractLinkFactory, _super);\n\n        function AbstractLinkFactory() {\n          return (_super !== null && _super.apply(this, arguments)) || this;\n        }\n\n        return AbstractLinkFactory;\n      })(AbstractFactory_1.AbstractFactory);\n      exports.AbstractLinkFactory = AbstractLinkFactory;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      var __assign =\n        (this && this.__assign) ||\n        Object.assign ||\n        function (t) {\n          for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n          }\n          return t;\n        };\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var React = __webpack_require__(1);\n      var PointModel_1 = __webpack_require__(5);\n      var Toolkit_1 = __webpack_require__(7);\n      var PathFinding_1 = __webpack_require__(16);\n      var _ = require('lodash');\n      var BaseWidget_1 = __webpack_require__(3);\n      var DefaultLinkWidget = (function (_super) {\n        __extends(DefaultLinkWidget, _super);\n\n        function DefaultLinkWidget(props) {\n          var _this = _super.call(this, 'srd-default-link', props) || this;\n          _this.addPointToLink = function (event, index) {\n            if (\n              !event.shiftKey &&\n              !_this.props.diagramEngine.isModelLocked(_this.props.link) &&\n              _this.props.link.points.length - 1 <= _this.props.diagramEngine.getMaxNumberPointsPerLink()\n            ) {\n              var point = new PointModel_1.PointModel(_this.props.link, _this.props.diagramEngine.getRelativeMousePoint(event));\n              point.setSelected(true);\n              _this.forceUpdate();\n              _this.props.link.addPoint(point, index);\n              _this.props.pointAdded(point, event);\n            }\n          };\n          _this.findPathAndRelativePositionToRenderLabel = function (index) {\n            var lengths = _this.refPaths.map(function (path) {\n              return path.getTotalLength();\n            });\n            var labelPosition =\n              lengths.reduce(function (previousValue, currentValue) {\n                return previousValue + currentValue;\n              }, 0) *\n              (index / (_this.props.link.labels.length + 1));\n            var pathIndex = 0;\n            while (pathIndex < _this.refPaths.length) {\n              if (labelPosition - lengths[pathIndex] < 0) {\n                return { path: _this.refPaths[pathIndex], position: labelPosition };\n              }\n              labelPosition -= lengths[pathIndex];\n              pathIndex++;\n            }\n          };\n          _this.calculateLabelPosition = function (label, index) {\n            if (!_this.refLabels[label.id]) {\n              return;\n            }\n            var _a = _this.findPathAndRelativePositionToRenderLabel(index),\n              path = _a.path,\n              position = _a.position;\n            var labelDimensions = {\n              width: _this.refLabels[label.id].offsetWidth,\n              height: _this.refLabels[label.id].offsetHeight,\n            };\n            var pathCentre = path.getPointAtLength(position);\n            var labelCoordinates = {\n              x: pathCentre.x - labelDimensions.width / 2 + label.offsetX,\n              y: pathCentre.y - labelDimensions.height / 2 + label.offsetY,\n            };\n            _this.refLabels[label.id].setAttribute('style', 'transform: translate(' + labelCoordinates.x + 'px, ' + labelCoordinates.y + 'px);');\n          };\n          _this.refLabels = {};\n          _this.refPaths = [];\n          _this.state = { selected: false };\n          if (props.diagramEngine.isSmartRoutingEnabled()) {\n            _this.pathFinding = new PathFinding_1.default(_this.props.diagramEngine);\n          }\n          return _this;\n        }\n\n        DefaultLinkWidget.prototype.calculateAllLabelPosition = function () {\n          var _this = this;\n          _.forEach(this.props.link.labels, function (label, index) {\n            _this.calculateLabelPosition(label, index + 1);\n          });\n        };\n        DefaultLinkWidget.prototype.componentDidUpdate = function () {\n          if (this.props.link.labels.length > 0) {\n            window.requestAnimationFrame(this.calculateAllLabelPosition.bind(this));\n          }\n        };\n        DefaultLinkWidget.prototype.componentDidMount = function () {\n          if (this.props.link.labels.length > 0) {\n            window.requestAnimationFrame(this.calculateAllLabelPosition.bind(this));\n          }\n        };\n        DefaultLinkWidget.prototype.generatePoint = function (pointIndex) {\n          var _this = this;\n          var x = this.props.link.points[pointIndex].x;\n          var y = this.props.link.points[pointIndex].y;\n          return React.createElement(\n            'g',\n            { key: 'point-' + this.props.link.points[pointIndex].id },\n            React.createElement('circle', {\n              cx: x,\n              cy: y,\n              r: 5,\n              className: 'point ' + this.bem('__point') + (this.props.link.points[pointIndex].isSelected() ? this.bem('--point-selected') : ''),\n            }),\n            React.createElement('circle', {\n              onMouseLeave: function () {\n                _this.setState({ selected: false });\n              },\n              onMouseEnter: function () {\n                _this.setState({ selected: true });\n              },\n              'data-id': this.props.link.points[pointIndex].id,\n              'data-linkid': this.props.link.id,\n              cx: x,\n              cy: y,\n              r: 15,\n              opacity: 0,\n              className: 'point ' + this.bem('__point'),\n            })\n          );\n        };\n        DefaultLinkWidget.prototype.generateLabel = function (label) {\n          var _this = this;\n          var canvas = this.props.diagramEngine.canvas;\n          return React.createElement(\n            'foreignObject',\n            {\n              key: label.id,\n              className: this.bem('__label'),\n              width: canvas.offsetWidth,\n              height: canvas.offsetHeight,\n            },\n            React.createElement(\n              'div',\n              {\n                ref: function (ref) {\n                  return (_this.refLabels[label.id] = ref);\n                },\n              },\n              this.props.diagramEngine.getFactoryForLabel(label).generateReactWidget(this.props.diagramEngine, label)\n            )\n          );\n        };\n        DefaultLinkWidget.prototype.generateLink = function (path, extraProps, id) {\n          var _this = this;\n          var props = this.props;\n          var Bottom = React.cloneElement(\n            props.diagramEngine\n              .getFactoryForLink(this.props.link)\n              .generateLinkSegment(this.props.link, this, this.state.selected || this.props.link.isSelected(), path),\n            {\n              ref: function (ref) {\n                return ref && _this.refPaths.push(ref);\n              },\n            }\n          );\n          var Top = React.cloneElement(\n            Bottom,\n            __assign({}, extraProps, {\n              strokeLinecap: 'round',\n              onMouseLeave: function () {\n                _this.setState({ selected: false });\n              },\n              onMouseEnter: function () {\n                _this.setState({ selected: true });\n              },\n              ref: null,\n              'data-linkid': this.props.link.getID(),\n              strokeOpacity: this.state.selected ? 0.1 : 0,\n              strokeWidth: 20,\n              onContextMenu: function () {\n                if (!_this.props.diagramEngine.isModelLocked(_this.props.link)) {\n                  event.preventDefault();\n                  _this.props.link.remove();\n                }\n              },\n            })\n          );\n          return React.createElement('g', { key: 'link-' + id }, Bottom, Top);\n        };\n        DefaultLinkWidget.prototype.isSmartRoutingApplicable = function () {\n          var _a = this.props,\n            diagramEngine = _a.diagramEngine,\n            link = _a.link;\n          if (!diagramEngine.isSmartRoutingEnabled()) {\n            return false;\n          }\n          if (link.points.length !== 2) {\n            return false;\n          }\n          if (link.sourcePort === null || link.targetPort === null) {\n            return false;\n          }\n          return true;\n        };\n        DefaultLinkWidget.prototype.render = function () {\n          var _this = this;\n          var diagramEngine = this.props.diagramEngine;\n          if (!diagramEngine.nodesRendered) {\n            return null;\n          }\n          var points = this.props.link.points;\n          var paths = [];\n          if (this.isSmartRoutingApplicable()) {\n            var directPathCoords = this.pathFinding.calculateDirectPath(_.first(points), _.last(points));\n            var routingMatrix = diagramEngine.getRoutingMatrix();\n            var smartLink = this.pathFinding.calculateLinkStartEndCoords(routingMatrix, directPathCoords);\n            if (smartLink) {\n              var start = smartLink.start,\n                end = smartLink.end,\n                pathToStart = smartLink.pathToStart,\n                pathToEnd = smartLink.pathToEnd;\n              var simplifiedPath = this.pathFinding.calculateDynamicPath(routingMatrix, start, end, pathToStart, pathToEnd);\n              paths.push(\n                this.generateLink(\n                  Toolkit_1.Toolkit.generateDynamicPath(simplifiedPath),\n                  {\n                    onMouseDown: function (event) {\n                      _this.addPointToLink(event, 1);\n                    },\n                  },\n                  '0'\n                )\n              );\n            }\n          }\n          if (paths.length === 0) {\n            if (points.length === 2) {\n              var isHorizontal = Math.abs(points[0].x - points[1].x) > Math.abs(points[0].y - points[1].y);\n              var xOrY = isHorizontal ? 'x' : 'y';\n              var margin = 50;\n              if (Math.abs(points[0][xOrY] - points[1][xOrY]) < 50) {\n                margin = 5;\n              }\n              var pointLeft = points[0];\n              var pointRight = points[1];\n              if (pointLeft[xOrY] > pointRight[xOrY]) {\n                pointLeft = points[1];\n                pointRight = points[0];\n              }\n              paths.push(\n                this.generateLink(\n                  Toolkit_1.Toolkit.generateCurvePath(pointLeft, pointRight, this.props.link.curvyness),\n                  {\n                    onMouseDown: function (event) {\n                      _this.addPointToLink(event, 1);\n                    },\n                  },\n                  '0'\n                )\n              );\n              if (this.props.link.targetPort === null) {\n                paths.push(this.generatePoint(1));\n              }\n            } else {\n              var _loop_1 = function (j) {\n                paths.push(\n                  this_1.generateLink(\n                    Toolkit_1.Toolkit.generateLinePath(points[j], points[j + 1]),\n                    {\n                      'data-linkid': this_1.props.link.id,\n                      'data-point': j,\n                      onMouseDown: function (event) {\n                        _this.addPointToLink(event, j + 1);\n                      },\n                    },\n                    j\n                  )\n                );\n              };\n              var this_1 = this;\n              for (var j = 0; j < points.length - 1; j++) {\n                _loop_1(j);\n              }\n              for (var i = 1; i < points.length - 1; i++) {\n                paths.push(this.generatePoint(i));\n              }\n              if (this.props.link.targetPort === null) {\n                paths.push(this.generatePoint(points.length - 1));\n              }\n            }\n          }\n          this.refPaths = [];\n          return React.createElement(\n            'g',\n            __assign({}, this.getProps()),\n            paths,\n            _.map(this.props.link.labels, function (labelModel) {\n              return _this.generateLabel(labelModel);\n            })\n          );\n        };\n        DefaultLinkWidget.defaultProps = {\n          color: 'black',\n          width: 3,\n          link: null,\n          engine: null,\n          smooth: false,\n          diagramEngine: null,\n        };\n        return DefaultLinkWidget;\n      })(BaseWidget_1.BaseWidget);\n      exports.DefaultLinkWidget = DefaultLinkWidget;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var DefaultPortModel_1 = __webpack_require__(20);\n      var _ = require('lodash');\n      var NodeModel_1 = __webpack_require__(9);\n      var Toolkit_1 = __webpack_require__(7);\n      var DefaultNodeModel = (function (_super) {\n        __extends(DefaultNodeModel, _super);\n\n        function DefaultNodeModel(name, color) {\n          if (name === void 0) {\n            name = 'Untitled';\n          }\n          if (color === void 0) {\n            color = 'rgb(0,192,255)';\n          }\n          var _this = _super.call(this, 'default') || this;\n          _this.name = name;\n          _this.color = color;\n          return _this;\n        }\n\n        DefaultNodeModel.prototype.addInPort = function (label) {\n          return this.addPort(new DefaultPortModel_1.DefaultPortModel(true, Toolkit_1.Toolkit.UID(), label));\n        };\n        DefaultNodeModel.prototype.addOutPort = function (label) {\n          return this.addPort(new DefaultPortModel_1.DefaultPortModel(false, Toolkit_1.Toolkit.UID(), label));\n        };\n        DefaultNodeModel.prototype.deSerialize = function (object, engine) {\n          _super.prototype.deSerialize.call(this, object, engine);\n          this.name = object.name;\n          this.color = object.color;\n        };\n        DefaultNodeModel.prototype.serialize = function () {\n          return _.merge(_super.prototype.serialize.call(this), { name: this.name, color: this.color });\n        };\n        DefaultNodeModel.prototype.getInPorts = function () {\n          return _.filter(this.ports, function (portModel) {\n            return portModel.in;\n          });\n        };\n        DefaultNodeModel.prototype.getOutPorts = function () {\n          return _.filter(this.ports, function (portModel) {\n            return !portModel.in;\n          });\n        };\n        return DefaultNodeModel;\n      })(NodeModel_1.NodeModel);\n      exports.DefaultNodeModel = DefaultNodeModel;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      var __assign =\n        (this && this.__assign) ||\n        Object.assign ||\n        function (t) {\n          for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n          }\n          return t;\n        };\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var React = __webpack_require__(1);\n      var BaseWidget_1 = __webpack_require__(3);\n      var DefaultLabelWidget = (function (_super) {\n        __extends(DefaultLabelWidget, _super);\n\n        function DefaultLabelWidget(props) {\n          return _super.call(this, 'srd-default-label', props) || this;\n        }\n\n        DefaultLabelWidget.prototype.render = function () {\n          return React.createElement('div', __assign({}, this.getProps()), this.props.model.label);\n        };\n        return DefaultLabelWidget;\n      })(BaseWidget_1.BaseWidget);\n      exports.DefaultLabelWidget = DefaultLabelWidget;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var AbstractFactory_1 = __webpack_require__(8);\n      var AbstractLabelFactory = (function (_super) {\n        __extends(AbstractLabelFactory, _super);\n\n        function AbstractLabelFactory() {\n          return (_super !== null && _super.apply(this, arguments)) || this;\n        }\n\n        return AbstractLabelFactory;\n      })(AbstractFactory_1.AbstractFactory);\n      exports.AbstractLabelFactory = AbstractLabelFactory;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var React = __webpack_require__(1);\n      var AbstractLabelFactory_1 = __webpack_require__(40);\n      var DefaultLabelModel_1 = __webpack_require__(18);\n      var DefaultLabelWidget_1 = __webpack_require__(39);\n      var DefaultLabelFactory = (function (_super) {\n        __extends(DefaultLabelFactory, _super);\n\n        function DefaultLabelFactory() {\n          return _super.call(this, 'default') || this;\n        }\n\n        DefaultLabelFactory.prototype.generateReactWidget = function (diagramEngine, label) {\n          return React.createElement(DefaultLabelWidget_1.DefaultLabelWidget, { model: label });\n        };\n        DefaultLabelFactory.prototype.getNewInstance = function (initialConfig) {\n          return new DefaultLabelModel_1.DefaultLabelModel();\n        };\n        return DefaultLabelFactory;\n      })(AbstractLabelFactory_1.AbstractLabelFactory);\n      exports.DefaultLabelFactory = DefaultLabelFactory;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var AbstractFactory_1 = __webpack_require__(8);\n      var AbstractPortFactory = (function (_super) {\n        __extends(AbstractPortFactory, _super);\n\n        function AbstractPortFactory() {\n          return (_super !== null && _super.apply(this, arguments)) || this;\n        }\n\n        return AbstractPortFactory;\n      })(AbstractFactory_1.AbstractFactory);\n      exports.AbstractPortFactory = AbstractPortFactory;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var DefaultPortModel_1 = __webpack_require__(20);\n      var AbstractPortFactory_1 = __webpack_require__(42);\n      var DefaultPortFactory = (function (_super) {\n        __extends(DefaultPortFactory, _super);\n\n        function DefaultPortFactory() {\n          return _super.call(this, 'default') || this;\n        }\n\n        DefaultPortFactory.prototype.getNewInstance = function (initialConfig) {\n          return new DefaultPortModel_1.DefaultPortModel(true, 'unknown');\n        };\n        return DefaultPortFactory;\n      })(AbstractPortFactory_1.AbstractPortFactory);\n      exports.DefaultPortFactory = DefaultPortFactory;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      var __assign =\n        (this && this.__assign) ||\n        Object.assign ||\n        function (t) {\n          for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n          }\n          return t;\n        };\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var BaseEntity_1 = __webpack_require__(13);\n      var _ = require('lodash');\n      var LinkModel_1 = __webpack_require__(21);\n      var NodeModel_1 = __webpack_require__(9);\n      var PortModel_1 = __webpack_require__(12);\n      var PointModel_1 = __webpack_require__(5);\n      var DiagramModel = (function (_super) {\n        __extends(DiagramModel, _super);\n\n        function DiagramModel() {\n          var _this = _super.call(this) || this;\n          _this.links = {};\n          _this.nodes = {};\n          _this.offsetX = 0;\n          _this.offsetY = 0;\n          _this.zoom = 100;\n          _this.rendered = false;\n          _this.gridSize = 0;\n          return _this;\n        }\n\n        DiagramModel.prototype.setGridSize = function (size) {\n          if (size === void 0) {\n            size = 0;\n          }\n          this.gridSize = size;\n          this.iterateListeners(function (listener, event) {\n            if (listener.gridUpdated) {\n              listener.gridUpdated(__assign({}, event, { size: size }));\n            }\n          });\n        };\n        DiagramModel.prototype.getGridPosition = function (pos) {\n          if (this.gridSize === 0) {\n            return pos;\n          }\n          return this.gridSize * Math.floor((pos + this.gridSize / 2) / this.gridSize);\n        };\n        DiagramModel.prototype.deSerializeDiagram = function (object, diagramEngine) {\n          var _this = this;\n          this.deSerialize(object, diagramEngine);\n          this.offsetX = object.offsetX;\n          this.offsetY = object.offsetY;\n          this.zoom = object.zoom;\n          this.gridSize = object.gridSize;\n          _.forEach(object.nodes, function (node) {\n            var nodeOb = diagramEngine.getNodeFactory(node.type).getNewInstance(node);\n            nodeOb.setParent(_this);\n            nodeOb.deSerialize(node, diagramEngine);\n            _this.addNode(nodeOb);\n          });\n          _.forEach(object.links, function (link) {\n            var linkOb = diagramEngine.getLinkFactory(link.type).getNewInstance();\n            linkOb.setParent(_this);\n            linkOb.deSerialize(link, diagramEngine);\n            _this.addLink(linkOb);\n          });\n        };\n        DiagramModel.prototype.serializeDiagram = function () {\n          return _.merge(this.serialize(), {\n            offsetX: this.offsetX,\n            offsetY: this.offsetY,\n            zoom: this.zoom,\n            gridSize: this.gridSize,\n            links: _.map(this.links, function (link) {\n              return link.serialize();\n            }),\n            nodes: _.map(this.nodes, function (node) {\n              return node.serialize();\n            }),\n          });\n        };\n        DiagramModel.prototype.clearSelection = function (ignore) {\n          if (ignore === void 0) {\n            ignore = null;\n          }\n          _.forEach(this.getSelectedItems(), function (element) {\n            if (ignore && ignore.getID() === element.getID()) {\n              return;\n            }\n            element.setSelected(false);\n          });\n        };\n        DiagramModel.prototype.getSelectedItems = function () {\n          var filters = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            filters[_i] = arguments[_i];\n          }\n          if (!Array.isArray(filters)) {\n            filters = [filters];\n          }\n          var items = [];\n          items = items.concat(\n            _.flatMap(this.nodes, function (node) {\n              return node.getSelectedEntities();\n            })\n          );\n          items = items.concat(\n            _.flatMap(this.links, function (link) {\n              return link.getSelectedEntities();\n            })\n          );\n          items = items.concat(\n            _.flatMap(this.links, function (link) {\n              return _.flatMap(link.points, function (point) {\n                return point.getSelectedEntities();\n              });\n            })\n          );\n          items = _.uniq(items);\n          if (filters.length > 0) {\n            items = _.filter(_.uniq(items), function (item) {\n              if (_.includes(filters, 'node') && item instanceof NodeModel_1.NodeModel) {\n                return true;\n              }\n              if (_.includes(filters, 'link') && item instanceof LinkModel_1.LinkModel) {\n                return true;\n              }\n              if (_.includes(filters, 'port') && item instanceof PortModel_1.PortModel) {\n                return true;\n              }\n              if (_.includes(filters, 'point') && item instanceof PointModel_1.PointModel) {\n                return true;\n              }\n              return false;\n            });\n          }\n          return items;\n        };\n        DiagramModel.prototype.setZoomLevel = function (zoom) {\n          this.zoom = zoom;\n          this.iterateListeners(function (listener, event) {\n            if (listener.zoomUpdated) {\n              listener.zoomUpdated(__assign({}, event, { zoom: zoom }));\n            }\n          });\n        };\n        DiagramModel.prototype.setOffset = function (offsetX, offsetY) {\n          this.offsetX = offsetX;\n          this.offsetY = offsetY;\n          this.iterateListeners(function (listener, event) {\n            if (listener.offsetUpdated) {\n              listener.offsetUpdated(__assign({}, event, { offsetX: offsetX, offsetY: offsetY }));\n            }\n          });\n        };\n        DiagramModel.prototype.setOffsetX = function (offsetX) {\n          var _this = this;\n          this.offsetX = offsetX;\n          this.iterateListeners(function (listener, event) {\n            if (listener.offsetUpdated) {\n              listener.offsetUpdated(__assign({}, event, { offsetX: offsetX, offsetY: _this.offsetY }));\n            }\n          });\n        };\n        DiagramModel.prototype.setOffsetY = function (offsetY) {\n          var _this = this;\n          this.offsetY = offsetY;\n          this.iterateListeners(function (listener, event) {\n            if (listener.offsetUpdated) {\n              listener.offsetUpdated(__assign({}, event, { offsetX: _this.offsetX, offsetY: _this.offsetY }));\n            }\n          });\n        };\n        DiagramModel.prototype.getOffsetY = function () {\n          return this.offsetY;\n        };\n        DiagramModel.prototype.getOffsetX = function () {\n          return this.offsetX;\n        };\n        DiagramModel.prototype.getZoomLevel = function () {\n          return this.zoom;\n        };\n        DiagramModel.prototype.getNode = function (node) {\n          if (node instanceof NodeModel_1.NodeModel) {\n            return node;\n          }\n          if (!this.nodes[node]) {\n            return null;\n          }\n          return this.nodes[node];\n        };\n        DiagramModel.prototype.getLink = function (link) {\n          if (link instanceof LinkModel_1.LinkModel) {\n            return link;\n          }\n          if (!this.links[link]) {\n            return null;\n          }\n          return this.links[link];\n        };\n        DiagramModel.prototype.addAll = function () {\n          var _this = this;\n          var models = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            models[_i] = arguments[_i];\n          }\n          _.forEach(models, function (model) {\n            if (model instanceof LinkModel_1.LinkModel) {\n              _this.addLink(model);\n            } else if (model instanceof NodeModel_1.NodeModel) {\n              _this.addNode(model);\n            }\n          });\n          return models;\n        };\n        DiagramModel.prototype.addLink = function (link) {\n          var _this = this;\n          link.addListener({\n            entityRemoved: function () {\n              _this.removeLink(link);\n            },\n          });\n          this.links[link.getID()] = link;\n          this.iterateListeners(function (listener, event) {\n            if (listener.linksUpdated) {\n              listener.linksUpdated(__assign({}, event, { link: link, isCreated: true }));\n            }\n          });\n          return link;\n        };\n        DiagramModel.prototype.addNode = function (node) {\n          var _this = this;\n          node.addListener({\n            entityRemoved: function () {\n              _this.removeNode(node);\n            },\n          });\n          this.nodes[node.getID()] = node;\n          this.iterateListeners(function (listener, event) {\n            if (listener.nodesUpdated) {\n              listener.nodesUpdated(__assign({}, event, { node: node, isCreated: true }));\n            }\n          });\n          return node;\n        };\n        DiagramModel.prototype.removeLink = function (link) {\n          link = this.getLink(link);\n          delete this.links[link.getID()];\n          this.iterateListeners(function (listener, event) {\n            if (listener.linksUpdated) {\n              listener.linksUpdated(__assign({}, event, { link: link, isCreated: false }));\n            }\n          });\n        };\n        DiagramModel.prototype.removeNode = function (node) {\n          node = this.getNode(node);\n          delete this.nodes[node.getID()];\n          this.iterateListeners(function (listener, event) {\n            if (listener.nodesUpdated) {\n              listener.nodesUpdated(__assign({}, event, { node: node, isCreated: false }));\n            }\n          });\n        };\n        DiagramModel.prototype.getLinks = function () {\n          return this.links;\n        };\n        DiagramModel.prototype.getNodes = function () {\n          return this.nodes;\n        };\n        return DiagramModel;\n      })(BaseEntity_1.BaseEntity);\n      exports.DiagramModel = DiagramModel;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n\n      function __export(m) {\n        for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n      }\n\n      Object.defineProperty(exports, '__esModule', { value: true });\n      __export(__webpack_require__(7));\n      __export(__webpack_require__(13));\n      __export(__webpack_require__(49));\n      __export(__webpack_require__(38));\n      __export(__webpack_require__(20));\n      __export(__webpack_require__(19));\n      __export(__webpack_require__(18));\n      __export(__webpack_require__(48));\n      __export(__webpack_require__(47));\n      __export(__webpack_require__(43));\n      __export(__webpack_require__(41));\n      __export(__webpack_require__(37));\n      __export(__webpack_require__(39));\n      __export(__webpack_require__(35));\n      __export(__webpack_require__(34));\n      __export(__webpack_require__(8));\n      __export(__webpack_require__(40));\n      __export(__webpack_require__(36));\n      __export(__webpack_require__(32));\n      __export(__webpack_require__(42));\n      __export(__webpack_require__(16));\n      __export(__webpack_require__(11));\n      __export(__webpack_require__(31));\n      __export(__webpack_require__(30));\n      __export(__webpack_require__(29));\n      __export(__webpack_require__(6));\n      __export(__webpack_require__(44));\n      __export(__webpack_require__(21));\n      __export(__webpack_require__(9));\n      __export(__webpack_require__(5));\n      __export(__webpack_require__(12));\n      __export(__webpack_require__(17));\n      __export(__webpack_require__(46));\n      __export(__webpack_require__(27));\n      __export(__webpack_require__(25));\n      __export(__webpack_require__(33));\n      __export(__webpack_require__(3));\n      __export(__webpack_require__(28));\n      __export(__webpack_require__(26));\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      var __assign =\n        (this && this.__assign) ||\n        Object.assign ||\n        function (t) {\n          for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n          }\n          return t;\n        };\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var React = __webpack_require__(1);\n      var _ = require('lodash');\n      var LinkLayerWidget_1 = __webpack_require__(28);\n      var NodeLayerWidget_1 = __webpack_require__(26);\n      var Toolkit_1 = __webpack_require__(7);\n      var MoveCanvasAction_1 = __webpack_require__(31);\n      var MoveItemsAction_1 = __webpack_require__(30);\n      var SelectingAction_1 = __webpack_require__(29);\n      var NodeModel_1 = __webpack_require__(9);\n      var PointModel_1 = __webpack_require__(5);\n      var PortModel_1 = __webpack_require__(12);\n      var BaseWidget_1 = __webpack_require__(3);\n      var DiagramWidget = (function (_super) {\n        __extends(DiagramWidget, _super);\n\n        function DiagramWidget(props) {\n          var _this = _super.call(this, 'srd-diagram', props) || this;\n          _this.onKeyUpPointer = null;\n          _this.onMouseMove = _this.onMouseMove.bind(_this);\n          _this.onMouseUp = _this.onMouseUp.bind(_this);\n          _this.state = {\n            action: null,\n            wasMoved: false,\n            renderedNodes: false,\n            windowListener: null,\n            diagramEngineListener: null,\n            document: null,\n          };\n          return _this;\n        }\n\n        DiagramWidget.prototype.componentWillUnmount = function () {\n          this.props.diagramEngine.removeListener(this.state.diagramEngineListener);\n          this.props.diagramEngine.setCanvas(null);\n          window.removeEventListener('keyup', this.onKeyUpPointer);\n          window.removeEventListener('mouseUp', this.onMouseUp);\n          window.removeEventListener('mouseMove', this.onMouseMove);\n        };\n        DiagramWidget.prototype.componentWillReceiveProps = function (nextProps) {\n          var _this = this;\n          if (this.props.diagramEngine !== nextProps.diagramEngine) {\n            this.props.diagramEngine.removeListener(this.state.diagramEngineListener);\n            var diagramEngineListener = nextProps.diagramEngine.addListener({\n              repaintCanvas: function () {\n                return _this.forceUpdate();\n              },\n            });\n            this.setState({ diagramEngineListener: diagramEngineListener });\n          }\n        };\n        DiagramWidget.prototype.componentWillUpdate = function (nextProps) {\n          if (this.props.diagramEngine.diagramModel.id !== nextProps.diagramEngine.diagramModel.id) {\n            this.setState({ renderedNodes: false });\n            nextProps.diagramEngine.diagramModel.rendered = true;\n          }\n          if (!nextProps.diagramEngine.diagramModel.rendered) {\n            this.setState({ renderedNodes: false });\n            nextProps.diagramEngine.diagramModel.rendered = true;\n          }\n        };\n        DiagramWidget.prototype.componentDidUpdate = function () {\n          if (!this.state.renderedNodes) {\n            this.setState({ renderedNodes: true });\n          }\n        };\n        DiagramWidget.prototype.componentDidMount = function () {\n          var _this = this;\n          this.onKeyUpPointer = this.onKeyUp.bind(this);\n          this.setState({\n            document: document,\n            renderedNodes: true,\n            diagramEngineListener: this.props.diagramEngine.addListener({\n              repaintCanvas: function () {\n                _this.forceUpdate();\n              },\n            }),\n          });\n          window.addEventListener('keyup', this.onKeyUpPointer, false);\n          if (true) {\n            window.focus();\n          }\n        };\n        DiagramWidget.prototype.getMouseElement = function (event) {\n          var target = event.target;\n          var diagramModel = this.props.diagramEngine.diagramModel;\n          var element = Toolkit_1.Toolkit.closest(target, '.port[data-name]');\n          if (element) {\n            var nodeElement = Toolkit_1.Toolkit.closest(target, '.node[data-nodeid]');\n            return {\n              model: diagramModel.getNode(nodeElement.getAttribute('data-nodeid')).getPort(element.getAttribute('data-name')),\n              element: element,\n            };\n          }\n          element = Toolkit_1.Toolkit.closest(target, '.point[data-id]');\n          if (element) {\n            return {\n              model: diagramModel.getLink(element.getAttribute('data-linkid')).getPointModel(element.getAttribute('data-id')),\n              element: element,\n            };\n          }\n          element = Toolkit_1.Toolkit.closest(target, '[data-linkid]');\n          if (element) {\n            return { model: diagramModel.getLink(element.getAttribute('data-linkid')), element: element };\n          }\n          element = Toolkit_1.Toolkit.closest(target, '.node[data-nodeid]');\n          if (element) {\n            return { model: diagramModel.getNode(element.getAttribute('data-nodeid')), element: element };\n          }\n          return null;\n        };\n        DiagramWidget.prototype.fireAction = function () {\n          if (this.state.action && this.props.actionStillFiring) {\n            this.props.actionStillFiring(this.state.action);\n          }\n        };\n        DiagramWidget.prototype.stopFiringAction = function (shouldSkipEvent) {\n          if (this.props.actionStoppedFiring && !shouldSkipEvent) {\n            this.props.actionStoppedFiring(this.state.action);\n          }\n          this.setState({ action: null });\n        };\n        DiagramWidget.prototype.startFiringAction = function (action) {\n          var setState = true;\n          if (this.props.actionStartedFiring) {\n            setState = this.props.actionStartedFiring(action);\n          }\n          if (setState) {\n            this.setState({ action: action });\n          }\n        };\n        DiagramWidget.prototype.onMouseMove = function (event) {\n          var _this = this;\n          var diagramEngine = this.props.diagramEngine;\n          var diagramModel = diagramEngine.getDiagramModel();\n          if (this.state.action instanceof SelectingAction_1.SelectingAction) {\n            var relative = diagramEngine.getRelativePoint(event.clientX, event.clientY);\n            _.forEach(diagramModel.getNodes(), function (node) {\n              if (_this.state.action.containsElement(node.x, node.y, diagramModel)) {\n                node.setSelected(true);\n              }\n            });\n            _.forEach(diagramModel.getLinks(), function (link) {\n              var allSelected = true;\n              _.forEach(link.points, function (point) {\n                if (_this.state.action.containsElement(point.x, point.y, diagramModel)) {\n                  point.setSelected(true);\n                } else {\n                  allSelected = false;\n                }\n              });\n              if (allSelected) {\n                link.setSelected(true);\n              }\n            });\n            this.state.action.mouseX2 = relative.x;\n            this.state.action.mouseY2 = relative.y;\n            this.fireAction();\n            this.setState({ action: this.state.action });\n            return;\n          } else if (this.state.action instanceof MoveItemsAction_1.MoveItemsAction) {\n            var amountX_1 = event.clientX - this.state.action.mouseX;\n            var amountY_1 = event.clientY - this.state.action.mouseY;\n            var amountZoom_1 = diagramModel.getZoomLevel() / 100;\n            _.forEach(this.state.action.selectionModels, function (model) {\n              if (model.model instanceof NodeModel_1.NodeModel || (model.model instanceof PointModel_1.PointModel && !model.model.isConnectedToPort())) {\n                model.model.x = diagramModel.getGridPosition(model.initialX + amountX_1 / amountZoom_1);\n                model.model.y = diagramModel.getGridPosition(model.initialY + amountY_1 / amountZoom_1);\n                if (model.model instanceof NodeModel_1.NodeModel) {\n                  _.forEach(model.model.getPorts(), function (port) {\n                    var portCoords = _this.props.diagramEngine.getPortCoords(port);\n                    port.updateCoords(portCoords);\n                  });\n                }\n                if (diagramEngine.isSmartRoutingEnabled()) {\n                  diagramEngine.calculateRoutingMatrix();\n                }\n              } else if (model.model instanceof PointModel_1.PointModel) {\n                model.model.x = model.initialX + diagramModel.getGridPosition(amountX_1 / amountZoom_1);\n                model.model.y = model.initialY + diagramModel.getGridPosition(amountY_1 / amountZoom_1);\n              }\n            });\n            if (diagramEngine.isSmartRoutingEnabled()) {\n              diagramEngine.calculateCanvasMatrix();\n            }\n            this.fireAction();\n            if (!this.state.wasMoved) {\n              this.setState({ wasMoved: true });\n            } else {\n              this.forceUpdate();\n            }\n          } else if (this.state.action instanceof MoveCanvasAction_1.MoveCanvasAction) {\n            if (this.props.allowCanvasTranslation) {\n              diagramModel.setOffset(\n                this.state.action.initialOffsetX + (event.clientX - this.state.action.mouseX),\n                this.state.action.initialOffsetY + (event.clientY - this.state.action.mouseY)\n              );\n              this.fireAction();\n              this.forceUpdate();\n            }\n          }\n        };\n        DiagramWidget.prototype.onKeyUp = function (event) {\n          var _this = this;\n          if (this.props.deleteKeys.indexOf(event.keyCode) !== -1) {\n            _.forEach(this.props.diagramEngine.getDiagramModel().getSelectedItems(), function (element) {\n              if (!_this.props.diagramEngine.isModelLocked(element)) {\n                element.remove();\n              }\n            });\n            this.forceUpdate();\n          }\n        };\n        DiagramWidget.prototype.onMouseUp = function (event) {\n          var _this = this;\n          var diagramEngine = this.props.diagramEngine;\n          if (this.state.action instanceof MoveItemsAction_1.MoveItemsAction) {\n            var element = this.getMouseElement(event);\n            _.forEach(this.state.action.selectionModels, function (model) {\n              if (!(model.model instanceof PointModel_1.PointModel)) {\n                return;\n              }\n              if (element && element.model instanceof PortModel_1.PortModel && !diagramEngine.isModelLocked(element.model)) {\n                var link = model.model.getLink();\n                if (link.getTargetPort() !== null) {\n                  if (link.getTargetPort() !== element.model && link.getSourcePort() !== element.model) {\n                    var targetPort = link.getTargetPort();\n                    var newLink = link.clone({});\n                    newLink.setSourcePort(element.model);\n                    newLink.setTargetPort(targetPort);\n                    link.setTargetPort(element.model);\n                    targetPort.removeLink(link);\n                    newLink.removePointsBefore(newLink.getPoints()[link.getPointIndex(model.model)]);\n                    link.removePointsAfter(model.model);\n                    diagramEngine.getDiagramModel().addLink(newLink);\n                  } else if (link.getTargetPort() === element.model) {\n                    link.removePointsAfter(model.model);\n                  } else if (link.getSourcePort() === element.model) {\n                    link.removePointsBefore(model.model);\n                  }\n                } else {\n                  link.setTargetPort(element.model);\n                }\n                delete _this.props.diagramEngine.linksThatHaveInitiallyRendered[link.getID()];\n              }\n            });\n            if (!this.props.allowLooseLinks && this.state.wasMoved) {\n              _.forEach(this.state.action.selectionModels, function (model) {\n                if (!(model.model instanceof PointModel_1.PointModel)) {\n                  return;\n                }\n                var selectedPoint = model.model;\n                var link = selectedPoint.getLink();\n                if (link.getSourcePort() === null || link.getTargetPort() === null) {\n                  link.remove();\n                }\n              });\n            }\n            _.forEach(this.state.action.selectionModels, function (model) {\n              if (!(model.model instanceof PointModel_1.PointModel)) {\n                return;\n              }\n              var link = model.model.getLink();\n              var sourcePort = link.getSourcePort();\n              var targetPort = link.getTargetPort();\n              if (sourcePort !== null && targetPort !== null) {\n                if (!sourcePort.canLinkToPort(targetPort)) {\n                  link.remove();\n                } else if (\n                  _.some(_.values(targetPort.getLinks()), function (l) {\n                    return l !== link && (l.getSourcePort() === sourcePort || l.getTargetPort() === sourcePort);\n                  })\n                ) {\n                  link.remove();\n                }\n              }\n            });\n            diagramEngine.clearRepaintEntities();\n            this.stopFiringAction(!this.state.wasMoved);\n          } else {\n            diagramEngine.clearRepaintEntities();\n            this.stopFiringAction();\n          }\n          this.state.document.removeEventListener('mousemove', this.onMouseMove);\n          this.state.document.removeEventListener('mouseup', this.onMouseUp);\n        };\n        DiagramWidget.prototype.drawSelectionBox = function () {\n          var dimensions = this.state.action.getBoxDimensions();\n          return React.createElement('div', {\n            className: this.bem('__selector'),\n            style: { top: dimensions.top, left: dimensions.left, width: dimensions.width, height: dimensions.height },\n          });\n        };\n        DiagramWidget.prototype.render = function () {\n          var _this = this;\n          var diagramEngine = this.props.diagramEngine;\n          diagramEngine.setMaxNumberPointsPerLink(this.props.maxNumberPointsPerLink);\n          diagramEngine.setSmartRoutingStatus(this.props.smartRouting);\n          var diagramModel = diagramEngine.getDiagramModel();\n          return React.createElement(\n            'div',\n            __assign({}, this.getProps(), {\n              ref: function (ref) {\n                if (ref) {\n                  _this.props.diagramEngine.setCanvas(ref);\n                }\n              },\n              onWheel: function (event) {\n                if (_this.props.allowCanvasZoom) {\n                  event.preventDefault();\n                  event.stopPropagation();\n                  var oldZoomFactor = diagramModel.getZoomLevel() / 100;\n                  var scrollDelta = _this.props.inverseZoom ? -event.deltaY : event.deltaY;\n                  if (event.ctrlKey && scrollDelta % 1 !== 0) {\n                    scrollDelta /= 3;\n                  } else {\n                    scrollDelta /= 60;\n                  }\n                  if (diagramModel.getZoomLevel() + scrollDelta > 10) {\n                    diagramModel.setZoomLevel(diagramModel.getZoomLevel() + scrollDelta);\n                  }\n                  var zoomFactor = diagramModel.getZoomLevel() / 100;\n                  var boundingRect = event.currentTarget.getBoundingClientRect();\n                  var clientWidth = boundingRect.width;\n                  var clientHeight = boundingRect.height;\n                  var widthDiff = clientWidth * zoomFactor - clientWidth * oldZoomFactor;\n                  var heightDiff = clientHeight * zoomFactor - clientHeight * oldZoomFactor;\n                  var clientX = event.clientX - boundingRect.left;\n                  var clientY = event.clientY - boundingRect.top;\n                  var xFactor = (clientX - diagramModel.getOffsetX()) / oldZoomFactor / clientWidth;\n                  var yFactor = (clientY - diagramModel.getOffsetY()) / oldZoomFactor / clientHeight;\n                  diagramModel.setOffset(diagramModel.getOffsetX() - widthDiff * xFactor, diagramModel.getOffsetY() - heightDiff * yFactor);\n                  diagramEngine.enableRepaintEntities([]);\n                  _this.forceUpdate();\n                }\n              },\n              onMouseDown: function (event) {\n                _this.setState(__assign({}, _this.state, { wasMoved: false }));\n                diagramEngine.clearRepaintEntities();\n                var model = _this.getMouseElement(event);\n                if (model === null) {\n                  if (event.shiftKey) {\n                    var relative = diagramEngine.getRelativePoint(event.clientX, event.clientY);\n                    _this.startFiringAction(new SelectingAction_1.SelectingAction(relative.x, relative.y));\n                  } else {\n                    diagramModel.clearSelection();\n                    _this.startFiringAction(new MoveCanvasAction_1.MoveCanvasAction(event.clientX, event.clientY, diagramModel));\n                  }\n                } else if (model.model instanceof PortModel_1.PortModel) {\n                  if (!_this.props.diagramEngine.isModelLocked(model.model)) {\n                    var relative = diagramEngine.getRelativeMousePoint(event);\n                    var sourcePort = model.model;\n                    var link = sourcePort.createLinkModel();\n                    link.setSourcePort(sourcePort);\n                    if (link) {\n                      link.removeMiddlePoints();\n                      if (link.getSourcePort() !== sourcePort) {\n                        link.setSourcePort(sourcePort);\n                      }\n                      link.setTargetPort(null);\n                      link.getFirstPoint().updateLocation(relative);\n                      link.getLastPoint().updateLocation(relative);\n                      diagramModel.clearSelection();\n                      link.getLastPoint().setSelected(true);\n                      diagramModel.addLink(link);\n                      _this.startFiringAction(new MoveItemsAction_1.MoveItemsAction(event.clientX, event.clientY, diagramEngine));\n                    }\n                  } else {\n                    diagramModel.clearSelection();\n                  }\n                } else {\n                  if (!event.shiftKey && !model.model.isSelected()) {\n                    diagramModel.clearSelection();\n                  }\n                  model.model.setSelected(true);\n                  _this.startFiringAction(new MoveItemsAction_1.MoveItemsAction(event.clientX, event.clientY, diagramEngine));\n                }\n                _this.state.document.addEventListener('mousemove', _this.onMouseMove);\n                _this.state.document.addEventListener('mouseup', _this.onMouseUp);\n              },\n            }),\n            this.state.renderedNodes &&\n              React.createElement(LinkLayerWidget_1.LinkLayerWidget, {\n                diagramEngine: diagramEngine,\n                pointAdded: function (point, event) {\n                  _this.state.document.addEventListener('mousemove', _this.onMouseMove);\n                  _this.state.document.addEventListener('mouseup', _this.onMouseUp);\n                  event.stopPropagation();\n                  diagramModel.clearSelection(point);\n                  _this.setState({ action: new MoveItemsAction_1.MoveItemsAction(event.clientX, event.clientY, diagramEngine) });\n                },\n              }),\n            React.createElement(NodeLayerWidget_1.NodeLayerWidget, { diagramEngine: diagramEngine }),\n            this.state.action instanceof SelectingAction_1.SelectingAction && this.drawSelectionBox()\n          );\n        };\n        DiagramWidget.defaultProps = {\n          diagramEngine: null,\n          allowLooseLinks: true,\n          allowCanvasTranslation: true,\n          allowCanvasZoom: true,\n          inverseZoom: false,\n          maxNumberPointsPerLink: Infinity,\n          smartRouting: false,\n          deleteKeys: [46, 8],\n        };\n        return DiagramWidget;\n      })(BaseWidget_1.BaseWidget);\n      exports.DiagramWidget = DiagramWidget;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var DefaultNodeModel_1 = __webpack_require__(38);\n      var React = __webpack_require__(1);\n      var DefaultNodeWidget_1 = __webpack_require__(35);\n      var AbstractNodeFactory_1 = __webpack_require__(32);\n      var DefaultNodeFactory = (function (_super) {\n        __extends(DefaultNodeFactory, _super);\n\n        function DefaultNodeFactory() {\n          return _super.call(this, 'default') || this;\n        }\n\n        DefaultNodeFactory.prototype.generateReactWidget = function (diagramEngine, node) {\n          return React.createElement(DefaultNodeWidget_1.DefaultNodeWidget, { node: node, diagramEngine: diagramEngine });\n        };\n        DefaultNodeFactory.prototype.getNewInstance = function (initialConfig) {\n          return new DefaultNodeModel_1.DefaultNodeModel();\n        };\n        return DefaultNodeFactory;\n      })(AbstractNodeFactory_1.AbstractNodeFactory);\n      exports.DefaultNodeFactory = DefaultNodeFactory;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var React = __webpack_require__(1);\n      var DefaultLinkWidget_1 = __webpack_require__(37);\n      var AbstractLinkFactory_1 = __webpack_require__(36);\n      var DefaultLinkModel_1 = __webpack_require__(19);\n      var DefaultLinkFactory = (function (_super) {\n        __extends(DefaultLinkFactory, _super);\n\n        function DefaultLinkFactory() {\n          return _super.call(this, 'default') || this;\n        }\n\n        DefaultLinkFactory.prototype.generateReactWidget = function (diagramEngine, link) {\n          return React.createElement(DefaultLinkWidget_1.DefaultLinkWidget, { link: link, diagramEngine: diagramEngine });\n        };\n        DefaultLinkFactory.prototype.getNewInstance = function (initialConfig) {\n          return new DefaultLinkModel_1.DefaultLinkModel();\n        };\n        DefaultLinkFactory.prototype.generateLinkSegment = function (model, widget, selected, path) {\n          return React.createElement('path', {\n            className: selected ? widget.bem('--path-selected') : '',\n            strokeWidth: model.width,\n            stroke: model.color,\n            d: path,\n          });\n        };\n        return DefaultLinkFactory;\n      })(AbstractLinkFactory_1.AbstractLinkFactory);\n      exports.DefaultLinkFactory = DefaultLinkFactory;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      var __extends =\n        (this && this.__extends) ||\n        (function () {\n          var extendStatics =\n            Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array &&\n              function (d, b) {\n                d.__proto__ = b;\n              }) ||\n            function (d, b) {\n              for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n            };\n          return function (d, b) {\n            extendStatics(d, b);\n\n            function __() {\n              this.constructor = d;\n            }\n\n            d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());\n          };\n        })();\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var BaseEntity_1 = __webpack_require__(13);\n      var DiagramModel_1 = __webpack_require__(44);\n      var _ = require('lodash');\n      var NodeModel_1 = __webpack_require__(9);\n      var PointModel_1 = __webpack_require__(5);\n      var main_1 = __webpack_require__(45);\n      var PathFinding_1 = __webpack_require__(16);\n      var DefaultPortFactory_1 = __webpack_require__(43);\n      var DefaultLabelFactory_1 = __webpack_require__(41);\n      var Toolkit_1 = __webpack_require__(7);\n      var DiagramEngine = (function (_super) {\n        __extends(DiagramEngine, _super);\n\n        function DiagramEngine() {\n          var _this = _super.call(this) || this;\n          _this.canvasMatrix = [];\n          _this.routingMatrix = [];\n          _this.hAdjustmentFactor = 0;\n          _this.vAdjustmentFactor = 0;\n          _this.calculateMatrixDimensions = function () {\n            var allNodesCoords = _.values(_this.diagramModel.nodes).map(function (item) {\n              return { x: item.x, width: item.width, y: item.y, height: item.height };\n            });\n            var allLinks = _.values(_this.diagramModel.links);\n            var allPortsCoords = _.flatMap(\n              allLinks.map(function (link) {\n                return [link.sourcePort, link.targetPort];\n              })\n            )\n              .filter(function (port) {\n                return port !== null;\n              })\n              .map(function (item) {\n                return { x: item.x, width: item.width, y: item.y, height: item.height };\n              });\n            var allPointsCoords = _.flatMap(\n              allLinks.map(function (link) {\n                return link.points;\n              })\n            ).map(function (item) {\n              return { x: item.x, width: 0, y: item.y, height: 0 };\n            });\n            var canvas = _this.canvas;\n            var minX =\n              Math.floor(\n                Math.min(\n                  _.minBy(_.concat(allNodesCoords, allPortsCoords, allPointsCoords), function (item) {\n                    return item.x;\n                  }).x,\n                  0\n                ) / PathFinding_1.ROUTING_SCALING_FACTOR\n              ) * PathFinding_1.ROUTING_SCALING_FACTOR;\n            var maxXElement = _.maxBy(_.concat(allNodesCoords, allPortsCoords, allPointsCoords), function (item) {\n              return item.x + item.width;\n            });\n            var maxX = Math.max(maxXElement.x + maxXElement.width, canvas.offsetWidth);\n            var minY =\n              Math.floor(\n                Math.min(\n                  _.minBy(_.concat(allNodesCoords, allPortsCoords, allPointsCoords), function (item) {\n                    return item.y;\n                  }).y,\n                  0\n                ) / PathFinding_1.ROUTING_SCALING_FACTOR\n              ) * PathFinding_1.ROUTING_SCALING_FACTOR;\n            var maxYElement = _.maxBy(_.concat(allNodesCoords, allPortsCoords, allPointsCoords), function (item) {\n              return item.y + item.height;\n            });\n            var maxY = Math.max(maxYElement.y + maxYElement.height, canvas.offsetHeight);\n            return {\n              width: Math.ceil(Math.abs(minX) + maxX),\n              hAdjustmentFactor: Math.abs(minX) / PathFinding_1.ROUTING_SCALING_FACTOR + 1,\n              height: Math.ceil(Math.abs(minY) + maxY),\n              vAdjustmentFactor: Math.abs(minY) / PathFinding_1.ROUTING_SCALING_FACTOR + 1,\n            };\n          };\n          _this.markNodes = function (matrix) {\n            _.values(_this.diagramModel.nodes).forEach(function (node) {\n              var startX = Math.floor(node.x / PathFinding_1.ROUTING_SCALING_FACTOR);\n              var endX = Math.ceil((node.x + node.width) / PathFinding_1.ROUTING_SCALING_FACTOR);\n              var startY = Math.floor(node.y / PathFinding_1.ROUTING_SCALING_FACTOR);\n              var endY = Math.ceil((node.y + node.height) / PathFinding_1.ROUTING_SCALING_FACTOR);\n              for (var x = startX - 1; x <= endX + 1; x++) {\n                for (var y = startY - 1; y < endY + 1; y++) {\n                  _this.markMatrixPoint(matrix, _this.translateRoutingX(x), _this.translateRoutingY(y));\n                }\n              }\n            });\n          };\n          _this.markPorts = function (matrix) {\n            var allElements = _.flatMap(\n              _.values(_this.diagramModel.links).map(function (link) {\n                return [].concat(link.sourcePort, link.targetPort);\n              })\n            );\n            allElements\n              .filter(function (port) {\n                return port !== null;\n              })\n              .forEach(function (port) {\n                var startX = Math.floor(port.x / PathFinding_1.ROUTING_SCALING_FACTOR);\n                var endX = Math.ceil((port.x + port.width) / PathFinding_1.ROUTING_SCALING_FACTOR);\n                var startY = Math.floor(port.y / PathFinding_1.ROUTING_SCALING_FACTOR);\n                var endY = Math.ceil((port.y + port.height) / PathFinding_1.ROUTING_SCALING_FACTOR);\n                for (var x = startX - 1; x <= endX + 1; x++) {\n                  for (var y = startY - 1; y < endY + 1; y++) {\n                    _this.markMatrixPoint(matrix, _this.translateRoutingX(x), _this.translateRoutingY(y));\n                  }\n                }\n              });\n          };\n          _this.markMatrixPoint = function (matrix, x, y) {\n            if (matrix[y] !== undefined && matrix[y][x] !== undefined) {\n              matrix[y][x] = 1;\n            }\n          };\n          _this.diagramModel = new DiagramModel_1.DiagramModel();\n          _this.nodeFactories = {};\n          _this.linkFactories = {};\n          _this.portFactories = {};\n          _this.labelFactories = {};\n          _this.canvas = null;\n          _this.paintableWidgets = null;\n          _this.linksThatHaveInitiallyRendered = {};\n          if (Toolkit_1.Toolkit.TESTING) {\n            Toolkit_1.Toolkit.TESTING_UID = 0;\n            if (window) {\n              window['diagram_instance'] = _this;\n            }\n          }\n          return _this;\n        }\n\n        DiagramEngine.prototype.installDefaultFactories = function () {\n          this.registerNodeFactory(new main_1.DefaultNodeFactory());\n          this.registerLinkFactory(new main_1.DefaultLinkFactory());\n          this.registerPortFactory(new DefaultPortFactory_1.DefaultPortFactory());\n          this.registerLabelFactory(new DefaultLabelFactory_1.DefaultLabelFactory());\n        };\n        DiagramEngine.prototype.repaintCanvas = function () {\n          this.iterateListeners(function (listener) {\n            if (listener.repaintCanvas) {\n              listener.repaintCanvas();\n            }\n          });\n        };\n        DiagramEngine.prototype.clearRepaintEntities = function () {\n          this.paintableWidgets = null;\n        };\n        DiagramEngine.prototype.enableRepaintEntities = function (entities) {\n          var _this = this;\n          this.paintableWidgets = {};\n          entities.forEach(function (entity) {\n            if (entity instanceof NodeModel_1.NodeModel) {\n              _.forEach(entity.getPorts(), function (port) {\n                _.forEach(port.getLinks(), function (link) {\n                  _this.paintableWidgets[link.getID()] = true;\n                });\n              });\n            }\n            if (entity instanceof PointModel_1.PointModel) {\n              _this.paintableWidgets[entity.getLink().getID()] = true;\n            }\n            _this.paintableWidgets[entity.getID()] = true;\n          });\n        };\n        DiagramEngine.prototype.isModelLocked = function (model) {\n          if (this.diagramModel.isLocked()) {\n            return true;\n          }\n          return model.isLocked();\n        };\n        DiagramEngine.prototype.recalculatePortsVisually = function () {\n          this.nodesRendered = false;\n          this.linksThatHaveInitiallyRendered = {};\n        };\n        DiagramEngine.prototype.canEntityRepaint = function (baseModel) {\n          if (this.paintableWidgets === null) {\n            return true;\n          }\n          return this.paintableWidgets[baseModel.getID()] !== undefined;\n        };\n        DiagramEngine.prototype.setCanvas = function (canvas) {\n          this.canvas = canvas;\n        };\n        DiagramEngine.prototype.setDiagramModel = function (model) {\n          this.diagramModel = model;\n          this.recalculatePortsVisually();\n        };\n        DiagramEngine.prototype.getDiagramModel = function () {\n          return this.diagramModel;\n        };\n        //!-------------- FACTORIES ------------\n        DiagramEngine.prototype.getNodeFactories = function () {\n          return this.nodeFactories;\n        };\n        DiagramEngine.prototype.getLinkFactories = function () {\n          return this.linkFactories;\n        };\n        DiagramEngine.prototype.getLabelFactories = function () {\n          return this.labelFactories;\n        };\n        DiagramEngine.prototype.registerLabelFactory = function (factory) {\n          this.labelFactories[factory.getType()] = factory;\n          this.iterateListeners(function (listener) {\n            if (listener.labelFactoriesUpdated) {\n              listener.labelFactoriesUpdated();\n            }\n          });\n        };\n        DiagramEngine.prototype.registerPortFactory = function (factory) {\n          this.portFactories[factory.getType()] = factory;\n          this.iterateListeners(function (listener) {\n            if (listener.portFactoriesUpdated) {\n              listener.portFactoriesUpdated();\n            }\n          });\n        };\n        DiagramEngine.prototype.registerNodeFactory = function (factory) {\n          this.nodeFactories[factory.getType()] = factory;\n          this.iterateListeners(function (listener) {\n            if (listener.nodeFactoriesUpdated) {\n              listener.nodeFactoriesUpdated();\n            }\n          });\n        };\n        DiagramEngine.prototype.registerLinkFactory = function (factory) {\n          this.linkFactories[factory.getType()] = factory;\n          this.iterateListeners(function (listener) {\n            if (listener.linkFactoriesUpdated) {\n              listener.linkFactoriesUpdated();\n            }\n          });\n        };\n        DiagramEngine.prototype.getPortFactory = function (type) {\n          if (this.portFactories[type]) {\n            return this.portFactories[type];\n          }\n          throw new Error('cannot find factory for port of type: [' + type + ']');\n        };\n        DiagramEngine.prototype.getNodeFactory = function (type) {\n          if (this.nodeFactories[type]) {\n            return this.nodeFactories[type];\n          }\n          throw new Error('cannot find factory for node of type: [' + type + ']');\n        };\n        DiagramEngine.prototype.getLinkFactory = function (type) {\n          if (this.linkFactories[type]) {\n            return this.linkFactories[type];\n          }\n          throw new Error('cannot find factory for link of type: [' + type + ']');\n        };\n        DiagramEngine.prototype.getLabelFactory = function (type) {\n          if (this.labelFactories[type]) {\n            return this.labelFactories[type];\n          }\n          throw new Error('cannot find factory for label of type: [' + type + ']');\n        };\n        DiagramEngine.prototype.getFactoryForNode = function (node) {\n          return this.getNodeFactory(node.getType());\n        };\n        DiagramEngine.prototype.getFactoryForLink = function (link) {\n          return this.getLinkFactory(link.getType());\n        };\n        DiagramEngine.prototype.getFactoryForLabel = function (label) {\n          return this.getLabelFactory(label.getType());\n        };\n        DiagramEngine.prototype.generateWidgetForLink = function (link) {\n          var linkFactory = this.getFactoryForLink(link);\n          if (!linkFactory) {\n            throw new Error('Cannot find link factory for link: ' + link.getType());\n          }\n          return linkFactory.generateReactWidget(this, link);\n        };\n        DiagramEngine.prototype.generateWidgetForNode = function (node) {\n          var nodeFactory = this.getFactoryForNode(node);\n          if (!nodeFactory) {\n            throw new Error('Cannot find widget factory for node: ' + node.getType());\n          }\n          return nodeFactory.generateReactWidget(this, node);\n        };\n        DiagramEngine.prototype.getRelativeMousePoint = function (event) {\n          var point = this.getRelativePoint(event.clientX, event.clientY);\n          return {\n            x: (point.x - this.diagramModel.getOffsetX()) / (this.diagramModel.getZoomLevel() / 100),\n            y: (point.y - this.diagramModel.getOffsetY()) / (this.diagramModel.getZoomLevel() / 100),\n          };\n        };\n        DiagramEngine.prototype.getRelativePoint = function (x, y) {\n          var canvasRect = this.canvas.getBoundingClientRect();\n          return { x: x - canvasRect.left, y: y - canvasRect.top };\n        };\n        DiagramEngine.prototype.getNodeElement = function (node) {\n          var selector = this.canvas.querySelector('.node[data-nodeid=\"' + node.getID() + '\"]');\n          if (selector === null) {\n            throw new Error('Cannot find Node element with nodeID: [' + node.getID() + ']');\n          }\n          return selector;\n        };\n        DiagramEngine.prototype.getNodePortElement = function (port) {\n          var selector = this.canvas.querySelector('.port[data-name=\"' + port.getName() + '\"][data-nodeid=\"' + port.getParent().getID() + '\"]');\n          if (selector === null) {\n            throw new Error('Cannot find Node Port element with nodeID: [' + port.getParent().getID() + '] and name: [' + port.getName() + ']');\n          }\n          return selector;\n        };\n        DiagramEngine.prototype.getPortCenter = function (port) {\n          var sourceElement = this.getNodePortElement(port);\n          var sourceRect = sourceElement.getBoundingClientRect();\n          var rel = this.getRelativePoint(sourceRect.left, sourceRect.top);\n          return {\n            x: sourceElement.offsetWidth / 2 + (rel.x - this.diagramModel.getOffsetX()) / (this.diagramModel.getZoomLevel() / 100),\n            y: sourceElement.offsetHeight / 2 + (rel.y - this.diagramModel.getOffsetY()) / (this.diagramModel.getZoomLevel() / 100),\n          };\n        };\n        DiagramEngine.prototype.getPortCoords = function (port) {\n          var sourceElement = this.getNodePortElement(port);\n          var sourceRect = sourceElement.getBoundingClientRect();\n          var canvasRect = this.canvas.getBoundingClientRect();\n          return {\n            x: (sourceRect.x - this.diagramModel.getOffsetX()) / (this.diagramModel.getZoomLevel() / 100) - canvasRect.left,\n            y: (sourceRect.y - this.diagramModel.getOffsetY()) / (this.diagramModel.getZoomLevel() / 100) - canvasRect.top,\n            width: sourceRect.width,\n            height: sourceRect.height,\n          };\n        };\n        DiagramEngine.prototype.getNodeDimensions = function (node) {\n          if (!this.canvas) {\n            return { width: 0, height: 0 };\n          }\n          var nodeElement = this.getNodeElement(node);\n          var nodeRect = nodeElement.getBoundingClientRect();\n          return { width: nodeRect.width, height: nodeRect.height };\n        };\n        DiagramEngine.prototype.getMaxNumberPointsPerLink = function () {\n          return this.maxNumberPointsPerLink;\n        };\n        DiagramEngine.prototype.setMaxNumberPointsPerLink = function (max) {\n          this.maxNumberPointsPerLink = max;\n        };\n        DiagramEngine.prototype.isSmartRoutingEnabled = function () {\n          return !!this.smartRouting;\n        };\n        DiagramEngine.prototype.setSmartRoutingStatus = function (status) {\n          this.smartRouting = status;\n        };\n        DiagramEngine.prototype.getCanvasMatrix = function () {\n          if (this.canvasMatrix.length === 0) {\n            this.calculateCanvasMatrix();\n          }\n          return this.canvasMatrix;\n        };\n        DiagramEngine.prototype.calculateCanvasMatrix = function () {\n          var _a = this.calculateMatrixDimensions(),\n            canvasWidth = _a.width,\n            hAdjustmentFactor = _a.hAdjustmentFactor,\n            canvasHeight = _a.height,\n            vAdjustmentFactor = _a.vAdjustmentFactor;\n          this.hAdjustmentFactor = hAdjustmentFactor;\n          this.vAdjustmentFactor = vAdjustmentFactor;\n          var matrixWidth = Math.ceil(canvasWidth / PathFinding_1.ROUTING_SCALING_FACTOR);\n          var matrixHeight = Math.ceil(canvasHeight / PathFinding_1.ROUTING_SCALING_FACTOR);\n          this.canvasMatrix = _.range(0, matrixHeight).map(function () {\n            return new Array(matrixWidth).fill(0);\n          });\n        };\n        DiagramEngine.prototype.getRoutingMatrix = function () {\n          if (this.routingMatrix.length === 0) {\n            this.calculateRoutingMatrix();\n          }\n          return this.routingMatrix;\n        };\n        DiagramEngine.prototype.calculateRoutingMatrix = function () {\n          var matrix = _.cloneDeep(this.getCanvasMatrix());\n          this.markNodes(matrix);\n          this.markPorts(matrix);\n          this.routingMatrix = matrix;\n        };\n        DiagramEngine.prototype.translateRoutingX = function (x, reverse) {\n          if (reverse === void 0) {\n            reverse = false;\n          }\n          return x + this.hAdjustmentFactor * (reverse ? -1 : 1);\n        };\n        DiagramEngine.prototype.translateRoutingY = function (y, reverse) {\n          if (reverse === void 0) {\n            reverse = false;\n          }\n          return y + this.vAdjustmentFactor * (reverse ? -1 : 1);\n        };\n        DiagramEngine.prototype.zoomToFit = function () {\n          var xFactor = this.canvas.clientWidth / this.canvas.scrollWidth;\n          var yFactor = this.canvas.clientHeight / this.canvas.scrollHeight;\n          var zoomFactor = xFactor < yFactor ? xFactor : yFactor;\n          this.diagramModel.setZoomLevel(this.diagramModel.getZoomLevel() * zoomFactor);\n          this.diagramModel.setOffset(0, 0);\n          this.repaintCanvas();\n        };\n        return DiagramEngine;\n      })(BaseEntity_1.BaseEntity);\n      exports.DiagramEngine = DiagramEngine;\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var _slicedToArray = (function () {\n        function sliceIterator(arr, i) {\n          var _arr = [];\n          var _n = true;\n          var _d = false;\n          var _e = undefined;\n          try {\n            for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n              _arr.push(_s.value);\n              if (i && _arr.length === i) break;\n            }\n          } catch (err) {\n            _d = true;\n            _e = err;\n          } finally {\n            try {\n              if (!_n && _i['return']) _i['return']();\n            } finally {\n              if (_d) throw _e;\n            }\n          }\n          return _arr;\n        }\n\n        return function (arr, i) {\n          if (Array.isArray(arr)) {\n            return arr;\n          } else if (Symbol.iterator in Object(arr)) {\n            return sliceIterator(arr, i);\n          } else {\n            throw new TypeError('Invalid attempt to destructure non-iterable instance');\n          }\n        };\n      })();\n      var sq = function sq(x) {\n        return x * x;\n      };\n      var distPointToPoint = function distPointToPoint(_ref, _ref3) {\n        var _ref2 = _slicedToArray(_ref, 2);\n        var ax = _ref2[0];\n        var ay = _ref2[1];\n        var _ref32 = _slicedToArray(_ref3, 2);\n        var bx = _ref32[0];\n        var by = _ref32[1];\n        return Math.sqrt(sq(ax - bx) + sq(ay - by));\n      };\n      var distPointToParabol = function distPointToParabol(a, f) {\n        var p = distPointToPoint(a, f);\n        return p == 0 ? Infinity : sq(p) / (2 * Math.abs(a[1] - f[1]));\n      };\n      var circumCenter = function circumCenter(a, b, c) {\n        var d = (a[0] - c[0]) * (b[1] - c[1]) - (b[0] - c[0]) * (a[1] - c[1]);\n        if (d == 0) return [Infinity, Infinity];\n        var xc =\n          ((((a[0] - c[0]) * (a[0] + c[0]) + (a[1] - c[1]) * (a[1] + c[1])) / 2) * (b[1] - c[1]) -\n            (((b[0] - c[0]) * (b[0] + c[0]) + (b[1] - c[1]) * (b[1] + c[1])) / 2) * (a[1] - c[1])) /\n          d;\n        var yc =\n          ((((b[0] - c[0]) * (b[0] + c[0]) + (b[1] - c[1]) * (b[1] + c[1])) / 2) * (a[0] - c[0]) -\n            (((a[0] - c[0]) * (a[0] + c[0]) + (a[1] - c[1]) * (a[1] + c[1])) / 2) * (b[0] - c[0])) /\n          d;\n        return [xc, yc];\n      };\n      var parabolsCrossX = function parabolsCrossX(fa, fb, q) {\n        if (fa[1] === fb[1]) return [(fa[0] + fb[0]) / 2, (fa[0] + fb[0]) / 2];\n        var s1 =\n          (fa[1] * fb[0] -\n            fa[0] * fb[1] +\n            fa[0] * q -\n            fb[0] * q +\n            Math.sqrt(\n              (fa[0] * fa[0] + fa[1] * fa[1] - 2 * fa[0] * fb[0] + fb[0] * fb[0] - 2 * fa[1] * fb[1] + fb[1] * fb[1]) *\n                (fa[1] * fb[1] - fa[1] * q - fb[1] * q + q * q)\n            )) /\n          (fa[1] - fb[1]);\n        var s2 =\n          (fa[1] * fb[0] -\n            fa[0] * fb[1] +\n            fa[0] * q -\n            fb[0] * q -\n            Math.sqrt(\n              (fa[0] * fa[0] + fa[1] * fa[1] - 2 * fa[0] * fb[0] + fb[0] * fb[0] - 2 * fa[1] * fb[1] + fb[1] * fb[1]) *\n                (fa[1] * fb[1] - fa[1] * q - fb[1] * q + q * q)\n            )) /\n          (fa[1] - fb[1]);\n        return s1 < s2 ? [s1, s2] : [s2, s1];\n      };\n      var doHalflinesCross = function doHalflinesCross(sa, sb) {\n        var approx = arguments.length <= 2 || arguments[2] === undefined ? 1e-10 : arguments[2];\n        var dx = sb.ps[0] - sa.ps[0];\n        var dy = sb.ps[1] - sa.ps[1];\n        if (sa.m == Infinity) return sa.hp * (sb.m * dx - dy) <= approx && sb.vec[0] * dx <= approx;\n        if (sb.m == Infinity) return sb.hp * (sa.m * dx - dy) >= -approx && sa.vec[0] * dx >= -approx;\n        var det = sb.vec[0] * sa.vec[1] - sb.vec[1] * sa.vec[0];\n        if (det === 0) return false;\n        var u = (dy * sb.vec[0] - dx * sb.vec[1]) / det;\n        var v = (dy * sa.vec[0] - dx * sa.vec[1]) / det;\n        return (u >= -approx && v >= approx) || (u >= approx && v >= -approx);\n      };\n      var matrixTransform = function matrixTransform(points, matrix) {\n        return points.map(function (point) {\n          return {\n            x: point.x * matrix[0] + point.y * matrix[2] + matrix[4],\n            y: point.x * matrix[1] + point.y * matrix[3] + matrix[5],\n          };\n        });\n      };\n      var transformEllipse = function transformEllipse(rx, ry, ax, m) {\n        var torad = Math.PI / 180;\n        var epsilon = 1e-10;\n        var c = Math.cos(ax * torad),\n          s = Math.sin(ax * torad);\n        var ma = [rx * (m[0] * c + m[2] * s), rx * (m[1] * c + m[3] * s), ry * (-m[0] * s + m[2] * c), ry * (-m[1] * s + m[3] * c)];\n        var J = ma[0] * ma[0] + ma[2] * ma[2],\n          K = ma[1] * ma[1] + ma[3] * ma[3];\n        var D =\n          ((ma[0] - ma[3]) * (ma[0] - ma[3]) + (ma[2] + ma[1]) * (ma[2] + ma[1])) * ((ma[0] + ma[3]) * (ma[0] + ma[3]) + (ma[2] - ma[1]) * (ma[2] - ma[1]));\n        var JK = (J + K) / 2;\n        if (D < epsilon * JK) {\n          return { rx: Math.sqrt(JK), ry: Math.sqrt(JK), ax: 0, isDegenerate: false };\n        }\n        var L = ma[0] * ma[1] + ma[2] * ma[3];\n        D = Math.sqrt(D);\n        var l1 = JK + D / 2,\n          l2 = JK - D / 2;\n        var newAx = undefined,\n          newRx = undefined,\n          newRy = undefined;\n        newAx =\n          Math.abs(L) < epsilon && Math.abs(l1 - K) < epsilon ? 90 : (Math.atan(Math.abs(L) > Math.abs(l1 - K) ? (l1 - J) / L : L / (l1 - K)) * 180) / Math.PI;\n        if (newAx >= 0) {\n          newRx = Math.sqrt(l1);\n          newRy = Math.sqrt(l2);\n        } else {\n          newAx += 90;\n          newRx = Math.sqrt(l2);\n          newRy = Math.sqrt(l1);\n        }\n        return { rx: newRx, ry: newRy, ax: newAx, isDegenerate: newRx < epsilon * newRy || newRy < epsilon * newRx };\n      };\n      exports['default'] = {\n        distPointToPoint: distPointToPoint,\n        distPointToParabol: distPointToParabol,\n        circumCenter: circumCenter,\n        parabolsCrossX: parabolsCrossX,\n        doHalflinesCross: doHalflinesCross,\n        matrixTransform: matrixTransform,\n        transformEllipse: transformEllipse,\n      };\n      module.exports = exports['default'];\n    },\n    function (module, exports, __webpack_require__) {\n      'use strict';\n      Object.defineProperty(exports, '__esModule', { value: true });\n      var _slicedToArray = (function () {\n        function sliceIterator(arr, i) {\n          var _arr = [];\n          var _n = true;\n          var _d = false;\n          var _e = undefined;\n          try {\n            for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n              _arr.push(_s.value);\n              if (i && _arr.length === i) break;\n            }\n          } catch (err) {\n            _d = true;\n            _e = err;\n          } finally {\n            try {\n              if (!_n && _i['return']) _i['return']();\n            } finally {\n              if (_d) throw _e;\n            }\n          }\n          return _arr;\n        }\n\n        return function (arr, i) {\n          if (Array.isArray(arr)) {\n            return arr;\n          } else if (Symbol.iterator in Object(arr)) {\n            return sliceIterator(arr, i);\n          } else {\n            throw new TypeError('Invalid attempt to destructure non-iterable instance');\n          }\n        };\n      })();\n      var _geom = __webpack_require__(50);\n      var Path = function Path(init) {\n        var _instructions = init || [];\n        var push = function push(arr, el) {\n          var copy = arr.slice(0, arr.length);\n          copy.push(el);\n          return copy;\n        };\n        var areEqualPoints = function areEqualPoints(_ref, _ref3) {\n          var _ref2 = _slicedToArray(_ref, 2);\n          var a1 = _ref2[0];\n          var b1 = _ref2[1];\n          var _ref32 = _slicedToArray(_ref3, 2);\n          var a2 = _ref32[0];\n          var b2 = _ref32[1];\n          return a1 === a2 && b1 === b2;\n        };\n        var trimZeros = function trimZeros(string, char) {\n          var l = string.length;\n          while (string.charAt(l - 1) === '0') {\n            l = l - 1;\n          }\n          if (string.charAt(l - 1) === '.') {\n            l = l - 1;\n          }\n          return string.substr(0, l);\n        };\n        var round = function round(number, digits) {\n          var str = number.toFixed(digits);\n          return trimZeros(str);\n        };\n        var printInstrunction = function printInstrunction(_ref4) {\n          var command = _ref4.command;\n          var params = _ref4.params;\n          var numbers = params.map(function (param) {\n            return round(param, 6);\n          });\n          return command + ' ' + numbers.join(' ');\n        };\n        var point = function point(_ref5, prev) {\n          var command = _ref5.command;\n          var params = _ref5.params;\n          switch (command) {\n            case 'M':\n              return [params[0], params[1]];\n            case 'L':\n              return [params[0], params[1]];\n            case 'H':\n              return [params[0], prev[1]];\n            case 'V':\n              return [prev[0], params[0]];\n            case 'Z':\n              return null;\n            case 'C':\n              return [params[4], params[5]];\n            case 'S':\n              return [params[2], params[3]];\n            case 'Q':\n              return [params[2], params[3]];\n            case 'T':\n              return [params[0], params[1]];\n            case 'A':\n              return [params[5], params[6]];\n          }\n        };\n        var transformParams = function transformParams(instruction, matrix, prev) {\n          var p = instruction.params;\n          var transformer = {\n            V: function V(instruction, matrix, prev) {\n              var pts = [{ x: prev[0], y: p[1] }];\n              var newPts = (0, _geom.matrixTransform)(pts, matrix);\n              if (newPts[0].x === (0, _geom.matrixTransform)([{ x: prev[0], y: prev[1] }])[0].x) {\n                return { command: 'V', params: [newPts[0].y] };\n              } else {\n                return { command: 'L', params: [newPts[0].x, newPts[0].y] };\n              }\n            },\n            H: function H(instruction, matrix, prev) {\n              var pts = [{ x: p[0], y: prev[1] }];\n              var newPts = (0, _geom.matrixTransform)(pts, matrix);\n              if (newPts[0].y === (0, _geom.matrixTransform)([{ x: prev[0], y: prev[1] }])[0].y) {\n                return { command: 'H', params: [newPts[0].x] };\n              } else {\n                return { command: 'L', params: [newPts[0].x, newPts[0].y] };\n              }\n            },\n            A: function A(instruction, matrix, prev) {\n              var r = (0, _geom.transformEllipse)(p[0], p[1], p[2], matrix);\n              var sweepFlag = p[4];\n              if (matrix[0] * matrix[3] - matrix[1] * matrix[2] < 0) {\n                sweepFlag = sweepFlag ? '0' : '1';\n              }\n              var pts = [{ x: p[5], y: p[6] }];\n              var newPts = (0, _geom.matrixTransform)(pts, matrix);\n              if (r.isDegenerate) {\n                return { command: 'L', params: [newPts[0].x, newPts[0].y] };\n              } else {\n                return { command: 'A', params: [r.rx, r.ry, r.ax, p[3], sweepFlag, newPts[0].x, newPts[0].y] };\n              }\n            },\n            C: function C(instruction, matrix, prev) {\n              var pts = [\n                { x: p[0], y: p[1] },\n                { x: p[2], y: p[3] },\n                { x: p[4], y: p[5] },\n              ];\n              var newPts = (0, _geom.matrixTransform)(pts, matrix);\n              return {\n                command: 'C',\n                params: [newPts[0].x, newPts[0].y, newPts[1].x, newPts[1].y, newPts[2].x, newPts[2].y],\n              };\n            },\n            Z: function Z(instruction, matrix, prev) {\n              return { command: 'Z', params: [] };\n            },\n            default: function _default(instruction, matrix, prev) {\n              var pts = [{ x: p[0], y: p[1] }];\n              var newPts = (0, _geom.matrixTransform)(pts, matrix);\n              var newParams = instruction.params.slice(0, instruction.params.length);\n              newParams.splice(0, 2, newPts[0].x, newPts[0].y);\n              return { command: instruction.command, params: newParams };\n            },\n          };\n          if (transformer[instruction.command]) {\n            return transformer[instruction.command](instruction, matrix, prev);\n          } else {\n            return transformer['default'](instruction, matrix, prev);\n          }\n        };\n        var verbosify = function verbosify(keys, f) {\n          return function (a) {\n            var args =\n              typeof a === 'object'\n                ? keys.map(function (k) {\n                    return a[k];\n                  })\n                : arguments;\n            return f.apply(null, args);\n          };\n        };\n        var plus = function plus(instruction) {\n          return Path(push(_instructions, instruction));\n        };\n        return {\n          moveto: verbosify(['x', 'y'], function (x, y) {\n            return plus({ command: 'M', params: [x, y] });\n          }),\n          lineto: verbosify(['x', 'y'], function (x, y) {\n            return plus({ command: 'L', params: [x, y] });\n          }),\n          hlineto: verbosify(['x'], function (x) {\n            return plus({ command: 'H', params: [x] });\n          }),\n          vlineto: verbosify(['y'], function (y) {\n            return plus({ command: 'V', params: [y] });\n          }),\n          closepath: function closepath() {\n            return plus({ command: 'Z', params: [] });\n          },\n          curveto: verbosify(['x1', 'y1', 'x2', 'y2', 'x', 'y'], function (x1, y1, x2, y2, x, y) {\n            return plus({ command: 'C', params: [x1, y1, x2, y2, x, y] });\n          }),\n          smoothcurveto: verbosify(['x2', 'y2', 'x', 'y'], function (x2, y2, x, y) {\n            return plus({ command: 'S', params: [x2, y2, x, y] });\n          }),\n          qcurveto: verbosify(['x1', 'y1', 'x', 'y'], function (x1, y1, x, y) {\n            return plus({ command: 'Q', params: [x1, y1, x, y] });\n          }),\n          smoothqcurveto: verbosify(['x', 'y'], function (x, y) {\n            return plus({ command: 'T', params: [x, y] });\n          }),\n          arc: verbosify(['rx', 'ry', 'xrot', 'largeArcFlag', 'sweepFlag', 'x', 'y'], function (rx, ry, xrot, largeArcFlag, sweepFlag, x, y) {\n            return plus({ command: 'A', params: [rx, ry, xrot, largeArcFlag, sweepFlag, x, y] });\n          }),\n          translate: verbosify(['dx', 'dy'], function () {\n            var dx = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0];\n            var dy = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1];\n            if (dx !== 0 || dx !== 0) {\n              var _ret = (function () {\n                var prev = [0, 0];\n                var matrix = [1, 0, 0, 1, dx, dy];\n                var newInstructions = _instructions.map(function (instruction) {\n                  var p = transformParams(instruction, matrix, prev);\n                  prev = point(instruction, prev);\n                  return p;\n                });\n                return { v: Path(newInstructions) };\n              })();\n              if (typeof _ret === 'object') return _ret.v;\n            } else {\n              return Path(_instructions);\n            }\n          }),\n          rotate: verbosify(['angle', 'rx', 'ry'], function (angle) {\n            var rx = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1];\n            var ry = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2];\n            if (angle !== 0) {\n              var _ret2 = (function () {\n                var prev = undefined;\n                var matrix = undefined;\n                var newInstructions = _instructions;\n                if (rx !== 0 && ry !== 0) {\n                  prev = [0, 0];\n                  matrix = [1, 0, 0, 1, -rx, -ry];\n                  newInstructions = newInstructions.map(function (instruction) {\n                    var p = transformParams(instruction, matrix, prev);\n                    prev = point(instruction, prev);\n                    return p;\n                  });\n                }\n                var rad = (angle * Math.PI) / 180;\n                var cos = Math.cos(rad);\n                var sin = Math.sin(rad);\n                prev = [0, 0];\n                matrix = [cos, sin, -sin, cos, 0, 0];\n                newInstructions = newInstructions.map(function (instruction) {\n                  var p = transformParams(instruction, matrix, prev);\n                  prev = point(instruction, prev);\n                  return p;\n                });\n                if (rx !== 0 && ry !== 0) {\n                  prev = [0, 0];\n                  matrix = [1, 0, 0, 1, rx, ry];\n                  newInstructions = newInstructions.map(function (instruction) {\n                    var p = transformParams(instruction, matrix, prev);\n                    prev = point(instruction, prev);\n                    return p;\n                  });\n                }\n                return { v: Path(newInstructions) };\n              })();\n              if (typeof _ret2 === 'object') return _ret2.v;\n            } else {\n              return Path(_instructions);\n            }\n          }),\n          scale: verbosify(['sx', 'sy'], function () {\n            var sx = arguments.length <= 0 || arguments[0] === undefined ? 1 : arguments[0];\n            var sy = arguments.length <= 1 || arguments[1] === undefined ? sx : arguments[1];\n            return (function () {\n              if (sx !== 1 || sy !== 1) {\n                var _ret3 = (function () {\n                  var prev = [0, 0];\n                  var matrix = [sx, 0, 0, sy, 0, 0];\n                  var newInstructions = _instructions.map(function (instruction) {\n                    var p = transformParams(instruction, matrix, prev);\n                    prev = point(instruction, prev);\n                    return p;\n                  });\n                  return { v: Path(newInstructions) };\n                })();\n                if (typeof _ret3 === 'object') return _ret3.v;\n              } else {\n                return Path(_instructions);\n              }\n            })();\n          }),\n          shearX: verbosify(['angle'], function () {\n            var angle = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0];\n            if (angle !== 0) {\n              var _ret4 = (function () {\n                var prev = [0, 0];\n                var matrix = [1, 0, Math.tan((angle * Math.PI) / 180), 1, 0, 0];\n                var newInstructions = _instructions.map(function (instruction) {\n                  var p = transformParams(instruction, matrix, prev);\n                  prev = point(instruction, prev);\n                  return p;\n                });\n                return { v: Path(newInstructions) };\n              })();\n              if (typeof _ret4 === 'object') return _ret4.v;\n            } else {\n              return Path(_instructions);\n            }\n          }),\n          shearY: verbosify(['angle'], function () {\n            var angle = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0];\n            if (angle !== 0) {\n              var _ret5 = (function () {\n                var prev = [0, 0];\n                var matrix = [1, Math.tan((angle * Math.PI) / 180), 0, 1, 0, 0];\n                var newInstructions = _instructions.map(function (instruction) {\n                  var p = transformParams(instruction, matrix, prev);\n                  prev = point(instruction, prev);\n                  return p;\n                });\n                return { v: Path(newInstructions) };\n              })();\n              if (typeof _ret5 === 'object') return _ret5.v;\n            } else {\n              return Path(_instructions);\n            }\n          }),\n          print: function print() {\n            return _instructions.map(printInstrunction).join(' ');\n          },\n          toString: function toString() {\n            return undefined.print();\n          },\n          points: function points() {\n            var ps = [];\n            var prev = [0, 0];\n            var _iteratorNormalCompletion = true;\n            var _didIteratorError = false;\n            var _iteratorError = undefined;\n            try {\n              for (\n                var _iterator = _instructions[Symbol.iterator](), _step;\n                !(_iteratorNormalCompletion = (_step = _iterator.next()).done);\n                _iteratorNormalCompletion = true\n              ) {\n                var instruction = _step.value;\n                var p = point(instruction, prev);\n                prev = p;\n                if (p) {\n                  ps.push(p);\n                }\n              }\n            } catch (err) {\n              _didIteratorError = true;\n              _iteratorError = err;\n            } finally {\n              try {\n                if (!_iteratorNormalCompletion && _iterator['return']) {\n                  _iterator['return']();\n                }\n              } finally {\n                if (_didIteratorError) {\n                  throw _iteratorError;\n                }\n              }\n            }\n            return ps;\n          },\n          instructions: function instructions() {\n            return _instructions.slice(0, _instructions.length);\n          },\n          connect: function connect(path) {\n            var ps = this.points();\n            var last = ps[ps.length - 1];\n            var first = path.points()[0];\n            var newInstructions = undefined;\n            if (_instructions[_instructions.length - 1].command !== 'Z') {\n              newInstructions = path.instructions().slice(1);\n              if (!areEqualPoints(last, first)) {\n                newInstructions.unshift({ command: 'L', params: first });\n              }\n            } else {\n              newInstructions = path.instructions();\n            }\n            return Path(this.instructions().concat(newInstructions));\n          },\n        };\n      };\n      exports['default'] = function () {\n        return Path();\n      };\n      module.exports = exports['default'];\n    },\n    function (module, exports, __webpack_require__) {\n      var JumpPointFinderBase = __webpack_require__(14);\n      var DiagonalMovement = __webpack_require__(2);\n\n      function JPFMoveDiagonallyIfAtMostOneObstacle(opt) {\n        JumpPointFinderBase.call(this, opt);\n      }\n\n      JPFMoveDiagonallyIfAtMostOneObstacle.prototype = new JumpPointFinderBase();\n      JPFMoveDiagonallyIfAtMostOneObstacle.prototype.constructor = JPFMoveDiagonallyIfAtMostOneObstacle;\n      JPFMoveDiagonallyIfAtMostOneObstacle.prototype._jump = function (x, y, px, py) {\n        var grid = this.grid,\n          dx = x - px,\n          dy = y - py;\n        if (!grid.isWalkableAt(x, y)) {\n          return null;\n        }\n        if (this.trackJumpRecursion === true) {\n          grid.getNodeAt(x, y).tested = true;\n        }\n        if (grid.getNodeAt(x, y) === this.endNode) {\n          return [x, y];\n        }\n        if (dx !== 0 && dy !== 0) {\n          if ((grid.isWalkableAt(x - dx, y + dy) && !grid.isWalkableAt(x - dx, y)) || (grid.isWalkableAt(x + dx, y - dy) && !grid.isWalkableAt(x, y - dy))) {\n            return [x, y];\n          }\n          if (this._jump(x + dx, y, x, y) || this._jump(x, y + dy, x, y)) {\n            return [x, y];\n          }\n        } else {\n          if (dx !== 0) {\n            if ((grid.isWalkableAt(x + dx, y + 1) && !grid.isWalkableAt(x, y + 1)) || (grid.isWalkableAt(x + dx, y - 1) && !grid.isWalkableAt(x, y - 1))) {\n              return [x, y];\n            }\n          } else {\n            if ((grid.isWalkableAt(x + 1, y + dy) && !grid.isWalkableAt(x + 1, y)) || (grid.isWalkableAt(x - 1, y + dy) && !grid.isWalkableAt(x - 1, y))) {\n              return [x, y];\n            }\n          }\n        }\n        if (grid.isWalkableAt(x + dx, y) || grid.isWalkableAt(x, y + dy)) {\n          return this._jump(x + dx, y + dy, x, y);\n        } else {\n          return null;\n        }\n      };\n      JPFMoveDiagonallyIfAtMostOneObstacle.prototype._findNeighbors = function (node) {\n        var parent = node.parent,\n          x = node.x,\n          y = node.y,\n          grid = this.grid,\n          px,\n          py,\n          nx,\n          ny,\n          dx,\n          dy,\n          neighbors = [],\n          neighborNodes,\n          neighborNode,\n          i,\n          l;\n        if (parent) {\n          px = parent.x;\n          py = parent.y;\n          dx = (x - px) / Math.max(Math.abs(x - px), 1);\n          dy = (y - py) / Math.max(Math.abs(y - py), 1);\n          if (dx !== 0 && dy !== 0) {\n            if (grid.isWalkableAt(x, y + dy)) {\n              neighbors.push([x, y + dy]);\n            }\n            if (grid.isWalkableAt(x + dx, y)) {\n              neighbors.push([x + dx, y]);\n            }\n            if (grid.isWalkableAt(x, y + dy) || grid.isWalkableAt(x + dx, y)) {\n              neighbors.push([x + dx, y + dy]);\n            }\n            if (!grid.isWalkableAt(x - dx, y) && grid.isWalkableAt(x, y + dy)) {\n              neighbors.push([x - dx, y + dy]);\n            }\n            if (!grid.isWalkableAt(x, y - dy) && grid.isWalkableAt(x + dx, y)) {\n              neighbors.push([x + dx, y - dy]);\n            }\n          } else {\n            if (dx === 0) {\n              if (grid.isWalkableAt(x, y + dy)) {\n                neighbors.push([x, y + dy]);\n                if (!grid.isWalkableAt(x + 1, y)) {\n                  neighbors.push([x + 1, y + dy]);\n                }\n                if (!grid.isWalkableAt(x - 1, y)) {\n                  neighbors.push([x - 1, y + dy]);\n                }\n              }\n            } else {\n              if (grid.isWalkableAt(x + dx, y)) {\n                neighbors.push([x + dx, y]);\n                if (!grid.isWalkableAt(x, y + 1)) {\n                  neighbors.push([x + dx, y + 1]);\n                }\n                if (!grid.isWalkableAt(x, y - 1)) {\n                  neighbors.push([x + dx, y - 1]);\n                }\n              }\n            }\n          }\n        } else {\n          neighborNodes = grid.getNeighbors(node, DiagonalMovement.IfAtMostOneObstacle);\n          for (i = 0, l = neighborNodes.length; i < l; ++i) {\n            neighborNode = neighborNodes[i];\n            neighbors.push([neighborNode.x, neighborNode.y]);\n          }\n        }\n        return neighbors;\n      };\n      module.exports = JPFMoveDiagonallyIfAtMostOneObstacle;\n    },\n    function (module, exports, __webpack_require__) {\n      var JumpPointFinderBase = __webpack_require__(14);\n      var DiagonalMovement = __webpack_require__(2);\n\n      function JPFMoveDiagonallyIfNoObstacles(opt) {\n        JumpPointFinderBase.call(this, opt);\n      }\n\n      JPFMoveDiagonallyIfNoObstacles.prototype = new JumpPointFinderBase();\n      JPFMoveDiagonallyIfNoObstacles.prototype.constructor = JPFMoveDiagonallyIfNoObstacles;\n      JPFMoveDiagonallyIfNoObstacles.prototype._jump = function (x, y, px, py) {\n        var grid = this.grid,\n          dx = x - px,\n          dy = y - py;\n        if (!grid.isWalkableAt(x, y)) {\n          return null;\n        }\n        if (this.trackJumpRecursion === true) {\n          grid.getNodeAt(x, y).tested = true;\n        }\n        if (grid.getNodeAt(x, y) === this.endNode) {\n          return [x, y];\n        }\n        if (dx !== 0 && dy !== 0) {\n          if (this._jump(x + dx, y, x, y) || this._jump(x, y + dy, x, y)) {\n            return [x, y];\n          }\n        } else {\n          if (dx !== 0) {\n            if ((grid.isWalkableAt(x, y - 1) && !grid.isWalkableAt(x - dx, y - 1)) || (grid.isWalkableAt(x, y + 1) && !grid.isWalkableAt(x - dx, y + 1))) {\n              return [x, y];\n            }\n          } else if (dy !== 0) {\n            if ((grid.isWalkableAt(x - 1, y) && !grid.isWalkableAt(x - 1, y - dy)) || (grid.isWalkableAt(x + 1, y) && !grid.isWalkableAt(x + 1, y - dy))) {\n              return [x, y];\n            }\n          }\n        }\n        if (grid.isWalkableAt(x + dx, y) && grid.isWalkableAt(x, y + dy)) {\n          return this._jump(x + dx, y + dy, x, y);\n        } else {\n          return null;\n        }\n      };\n      JPFMoveDiagonallyIfNoObstacles.prototype._findNeighbors = function (node) {\n        var parent = node.parent,\n          x = node.x,\n          y = node.y,\n          grid = this.grid,\n          px,\n          py,\n          nx,\n          ny,\n          dx,\n          dy,\n          neighbors = [],\n          neighborNodes,\n          neighborNode,\n          i,\n          l;\n        if (parent) {\n          px = parent.x;\n          py = parent.y;\n          dx = (x - px) / Math.max(Math.abs(x - px), 1);\n          dy = (y - py) / Math.max(Math.abs(y - py), 1);\n          if (dx !== 0 && dy !== 0) {\n            if (grid.isWalkableAt(x, y + dy)) {\n              neighbors.push([x, y + dy]);\n            }\n            if (grid.isWalkableAt(x + dx, y)) {\n              neighbors.push([x + dx, y]);\n            }\n            if (grid.isWalkableAt(x, y + dy) && grid.isWalkableAt(x + dx, y)) {\n              neighbors.push([x + dx, y + dy]);\n            }\n          } else {\n            var isNextWalkable;\n            if (dx !== 0) {\n              isNextWalkable = grid.isWalkableAt(x + dx, y);\n              var isTopWalkable = grid.isWalkableAt(x, y + 1);\n              var isBottomWalkable = grid.isWalkableAt(x, y - 1);\n              if (isNextWalkable) {\n                neighbors.push([x + dx, y]);\n                if (isTopWalkable) {\n                  neighbors.push([x + dx, y + 1]);\n                }\n                if (isBottomWalkable) {\n                  neighbors.push([x + dx, y - 1]);\n                }\n              }\n              if (isTopWalkable) {\n                neighbors.push([x, y + 1]);\n              }\n              if (isBottomWalkable) {\n                neighbors.push([x, y - 1]);\n              }\n            } else if (dy !== 0) {\n              isNextWalkable = grid.isWalkableAt(x, y + dy);\n              var isRightWalkable = grid.isWalkableAt(x + 1, y);\n              var isLeftWalkable = grid.isWalkableAt(x - 1, y);\n              if (isNextWalkable) {\n                neighbors.push([x, y + dy]);\n                if (isRightWalkable) {\n                  neighbors.push([x + 1, y + dy]);\n                }\n                if (isLeftWalkable) {\n                  neighbors.push([x - 1, y + dy]);\n                }\n              }\n              if (isRightWalkable) {\n                neighbors.push([x + 1, y]);\n              }\n              if (isLeftWalkable) {\n                neighbors.push([x - 1, y]);\n              }\n            }\n          }\n        } else {\n          neighborNodes = grid.getNeighbors(node, DiagonalMovement.OnlyWhenNoObstacles);\n          for (i = 0, l = neighborNodes.length; i < l; ++i) {\n            neighborNode = neighborNodes[i];\n            neighbors.push([neighborNode.x, neighborNode.y]);\n          }\n        }\n        return neighbors;\n      };\n      module.exports = JPFMoveDiagonallyIfNoObstacles;\n    },\n    function (module, exports, __webpack_require__) {\n      var JumpPointFinderBase = __webpack_require__(14);\n      var DiagonalMovement = __webpack_require__(2);\n\n      function JPFAlwaysMoveDiagonally(opt) {\n        JumpPointFinderBase.call(this, opt);\n      }\n\n      JPFAlwaysMoveDiagonally.prototype = new JumpPointFinderBase();\n      JPFAlwaysMoveDiagonally.prototype.constructor = JPFAlwaysMoveDiagonally;\n      JPFAlwaysMoveDiagonally.prototype._jump = function (x, y, px, py) {\n        var grid = this.grid,\n          dx = x - px,\n          dy = y - py;\n        if (!grid.isWalkableAt(x, y)) {\n          return null;\n        }\n        if (this.trackJumpRecursion === true) {\n          grid.getNodeAt(x, y).tested = true;\n        }\n        if (grid.getNodeAt(x, y) === this.endNode) {\n          return [x, y];\n        }\n        if (dx !== 0 && dy !== 0) {\n          if ((grid.isWalkableAt(x - dx, y + dy) && !grid.isWalkableAt(x - dx, y)) || (grid.isWalkableAt(x + dx, y - dy) && !grid.isWalkableAt(x, y - dy))) {\n            return [x, y];\n          }\n          if (this._jump(x + dx, y, x, y) || this._jump(x, y + dy, x, y)) {\n            return [x, y];\n          }\n        } else {\n          if (dx !== 0) {\n            if ((grid.isWalkableAt(x + dx, y + 1) && !grid.isWalkableAt(x, y + 1)) || (grid.isWalkableAt(x + dx, y - 1) && !grid.isWalkableAt(x, y - 1))) {\n              return [x, y];\n            }\n          } else {\n            if ((grid.isWalkableAt(x + 1, y + dy) && !grid.isWalkableAt(x + 1, y)) || (grid.isWalkableAt(x - 1, y + dy) && !grid.isWalkableAt(x - 1, y))) {\n              return [x, y];\n            }\n          }\n        }\n        return this._jump(x + dx, y + dy, x, y);\n      };\n      JPFAlwaysMoveDiagonally.prototype._findNeighbors = function (node) {\n        var parent = node.parent,\n          x = node.x,\n          y = node.y,\n          grid = this.grid,\n          px,\n          py,\n          nx,\n          ny,\n          dx,\n          dy,\n          neighbors = [],\n          neighborNodes,\n          neighborNode,\n          i,\n          l;\n        if (parent) {\n          px = parent.x;\n          py = parent.y;\n          dx = (x - px) / Math.max(Math.abs(x - px), 1);\n          dy = (y - py) / Math.max(Math.abs(y - py), 1);\n          if (dx !== 0 && dy !== 0) {\n            if (grid.isWalkableAt(x, y + dy)) {\n              neighbors.push([x, y + dy]);\n            }\n            if (grid.isWalkableAt(x + dx, y)) {\n              neighbors.push([x + dx, y]);\n            }\n            if (grid.isWalkableAt(x + dx, y + dy)) {\n              neighbors.push([x + dx, y + dy]);\n            }\n            if (!grid.isWalkableAt(x - dx, y)) {\n              neighbors.push([x - dx, y + dy]);\n            }\n            if (!grid.isWalkableAt(x, y - dy)) {\n              neighbors.push([x + dx, y - dy]);\n            }\n          } else {\n            if (dx === 0) {\n              if (grid.isWalkableAt(x, y + dy)) {\n                neighbors.push([x, y + dy]);\n              }\n              if (!grid.isWalkableAt(x + 1, y)) {\n                neighbors.push([x + 1, y + dy]);\n              }\n              if (!grid.isWalkableAt(x - 1, y)) {\n                neighbors.push([x - 1, y + dy]);\n              }\n            } else {\n              if (grid.isWalkableAt(x + dx, y)) {\n                neighbors.push([x + dx, y]);\n              }\n              if (!grid.isWalkableAt(x, y + 1)) {\n                neighbors.push([x + dx, y + 1]);\n              }\n              if (!grid.isWalkableAt(x, y - 1)) {\n                neighbors.push([x + dx, y - 1]);\n              }\n            }\n          }\n        } else {\n          neighborNodes = grid.getNeighbors(node, DiagonalMovement.Always);\n          for (i = 0, l = neighborNodes.length; i < l; ++i) {\n            neighborNode = neighborNodes[i];\n            neighbors.push([neighborNode.x, neighborNode.y]);\n          }\n        }\n        return neighbors;\n      };\n      module.exports = JPFAlwaysMoveDiagonally;\n    },\n    function (module, exports, __webpack_require__) {\n      var JumpPointFinderBase = __webpack_require__(14);\n      var DiagonalMovement = __webpack_require__(2);\n\n      function JPFNeverMoveDiagonally(opt) {\n        JumpPointFinderBase.call(this, opt);\n      }\n\n      JPFNeverMoveDiagonally.prototype = new JumpPointFinderBase();\n      JPFNeverMoveDiagonally.prototype.constructor = JPFNeverMoveDiagonally;\n      JPFNeverMoveDiagonally.prototype._jump = function (x, y, px, py) {\n        var grid = this.grid,\n          dx = x - px,\n          dy = y - py;\n        if (!grid.isWalkableAt(x, y)) {\n          return null;\n        }\n        if (this.trackJumpRecursion === true) {\n          grid.getNodeAt(x, y).tested = true;\n        }\n        if (grid.getNodeAt(x, y) === this.endNode) {\n          return [x, y];\n        }\n        if (dx !== 0) {\n          if ((grid.isWalkableAt(x, y - 1) && !grid.isWalkableAt(x - dx, y - 1)) || (grid.isWalkableAt(x, y + 1) && !grid.isWalkableAt(x - dx, y + 1))) {\n            return [x, y];\n          }\n        } else if (dy !== 0) {\n          if ((grid.isWalkableAt(x - 1, y) && !grid.isWalkableAt(x - 1, y - dy)) || (grid.isWalkableAt(x + 1, y) && !grid.isWalkableAt(x + 1, y - dy))) {\n            return [x, y];\n          }\n          if (this._jump(x + 1, y, x, y) || this._jump(x - 1, y, x, y)) {\n            return [x, y];\n          }\n        } else {\n          throw new Error('Only horizontal and vertical movements are allowed');\n        }\n        return this._jump(x + dx, y + dy, x, y);\n      };\n      JPFNeverMoveDiagonally.prototype._findNeighbors = function (node) {\n        var parent = node.parent,\n          x = node.x,\n          y = node.y,\n          grid = this.grid,\n          px,\n          py,\n          nx,\n          ny,\n          dx,\n          dy,\n          neighbors = [],\n          neighborNodes,\n          neighborNode,\n          i,\n          l;\n        if (parent) {\n          px = parent.x;\n          py = parent.y;\n          dx = (x - px) / Math.max(Math.abs(x - px), 1);\n          dy = (y - py) / Math.max(Math.abs(y - py), 1);\n          if (dx !== 0) {\n            if (grid.isWalkableAt(x, y - 1)) {\n              neighbors.push([x, y - 1]);\n            }\n            if (grid.isWalkableAt(x, y + 1)) {\n              neighbors.push([x, y + 1]);\n            }\n            if (grid.isWalkableAt(x + dx, y)) {\n              neighbors.push([x + dx, y]);\n            }\n          } else if (dy !== 0) {\n            if (grid.isWalkableAt(x - 1, y)) {\n              neighbors.push([x - 1, y]);\n            }\n            if (grid.isWalkableAt(x + 1, y)) {\n              neighbors.push([x + 1, y]);\n            }\n            if (grid.isWalkableAt(x, y + dy)) {\n              neighbors.push([x, y + dy]);\n            }\n          }\n        } else {\n          neighborNodes = grid.getNeighbors(node, DiagonalMovement.Never);\n          for (i = 0, l = neighborNodes.length; i < l; ++i) {\n            neighborNode = neighborNodes[i];\n            neighbors.push([neighborNode.x, neighborNode.y]);\n          }\n        }\n        return neighbors;\n      };\n      module.exports = JPFNeverMoveDiagonally;\n    },\n    function (module, exports, __webpack_require__) {\n      var DiagonalMovement = __webpack_require__(2);\n      var JPFNeverMoveDiagonally = __webpack_require__(55);\n      var JPFAlwaysMoveDiagonally = __webpack_require__(54);\n      var JPFMoveDiagonallyIfNoObstacles = __webpack_require__(53);\n      var JPFMoveDiagonallyIfAtMostOneObstacle = __webpack_require__(52);\n\n      function JumpPointFinder(opt) {\n        opt = opt || {};\n        if (opt.diagonalMovement === DiagonalMovement.Never) {\n          return new JPFNeverMoveDiagonally(opt);\n        } else if (opt.diagonalMovement === DiagonalMovement.Always) {\n          return new JPFAlwaysMoveDiagonally(opt);\n        } else if (opt.diagonalMovement === DiagonalMovement.OnlyWhenNoObstacles) {\n          return new JPFMoveDiagonallyIfNoObstacles(opt);\n        } else {\n          return new JPFMoveDiagonallyIfAtMostOneObstacle(opt);\n        }\n      }\n\n      module.exports = JumpPointFinder;\n    },\n    function (module, exports, __webpack_require__) {\n      var Util = __webpack_require__(4);\n      var Heuristic = __webpack_require__(10);\n      var Node = __webpack_require__(24);\n      var DiagonalMovement = __webpack_require__(2);\n\n      function IDAStarFinder(opt) {\n        opt = opt || {};\n        this.allowDiagonal = opt.allowDiagonal;\n        this.dontCrossCorners = opt.dontCrossCorners;\n        this.diagonalMovement = opt.diagonalMovement;\n        this.heuristic = opt.heuristic || Heuristic.manhattan;\n        this.weight = opt.weight || 1;\n        this.trackRecursion = opt.trackRecursion || false;\n        this.timeLimit = opt.timeLimit || Infinity;\n        if (!this.diagonalMovement) {\n          if (!this.allowDiagonal) {\n            this.diagonalMovement = DiagonalMovement.Never;\n          } else {\n            if (this.dontCrossCorners) {\n              this.diagonalMovement = DiagonalMovement.OnlyWhenNoObstacles;\n            } else {\n              this.diagonalMovement = DiagonalMovement.IfAtMostOneObstacle;\n            }\n          }\n        }\n        if (this.diagonalMovement === DiagonalMovement.Never) {\n          this.heuristic = opt.heuristic || Heuristic.manhattan;\n        } else {\n          this.heuristic = opt.heuristic || Heuristic.octile;\n        }\n      }\n\n      IDAStarFinder.prototype.findPath = function (startX, startY, endX, endY, grid) {\n        var nodesVisited = 0;\n        var startTime = new Date().getTime();\n        var h = function (a, b) {\n          return this.heuristic(Math.abs(b.x - a.x), Math.abs(b.y - a.y));\n        }.bind(this);\n        var cost = function (a, b) {\n          return a.x === b.x || a.y === b.y ? 1 : Math.SQRT2;\n        };\n        var search = function (node, g, cutoff, route, depth) {\n          nodesVisited++;\n          if (this.timeLimit > 0 && new Date().getTime() - startTime > this.timeLimit * 1e3) {\n            return Infinity;\n          }\n          var f = g + h(node, end) * this.weight;\n          if (f > cutoff) {\n            return f;\n          }\n          if (node == end) {\n            route[depth] = [node.x, node.y];\n            return node;\n          }\n          var min, t, k, neighbour;\n          var neighbours = grid.getNeighbors(node, this.diagonalMovement);\n          for (k = 0, min = Infinity; (neighbour = neighbours[k]); ++k) {\n            if (this.trackRecursion) {\n              neighbour.retainCount = neighbour.retainCount + 1 || 1;\n              if (neighbour.tested !== true) {\n                neighbour.tested = true;\n              }\n            }\n            t = search(neighbour, g + cost(node, neighbour), cutoff, route, depth + 1);\n            if (t instanceof Node) {\n              route[depth] = [node.x, node.y];\n              return t;\n            }\n            if (this.trackRecursion && --neighbour.retainCount === 0) {\n              neighbour.tested = false;\n            }\n            if (t < min) {\n              min = t;\n            }\n          }\n          return min;\n        }.bind(this);\n        var start = grid.getNodeAt(startX, startY);\n        var end = grid.getNodeAt(endX, endY);\n        var cutOff = h(start, end);\n        var j, route, t;\n        for (j = 0; true; ++j) {\n          route = [];\n          t = search(start, 0, cutOff, route, 0);\n          if (t === Infinity) {\n            return [];\n          }\n          if (t instanceof Node) {\n            return route;\n          }\n          cutOff = t;\n        }\n        return [];\n      };\n      module.exports = IDAStarFinder;\n    },\n    function (module, exports, __webpack_require__) {\n      var BiAStarFinder = __webpack_require__(22);\n\n      function BiDijkstraFinder(opt) {\n        BiAStarFinder.call(this, opt);\n        this.heuristic = function (dx, dy) {\n          return 0;\n        };\n      }\n\n      BiDijkstraFinder.prototype = new BiAStarFinder();\n      BiDijkstraFinder.prototype.constructor = BiDijkstraFinder;\n      module.exports = BiDijkstraFinder;\n    },\n    function (module, exports, __webpack_require__) {\n      var Util = __webpack_require__(4);\n      var DiagonalMovement = __webpack_require__(2);\n\n      function BiBreadthFirstFinder(opt) {\n        opt = opt || {};\n        this.allowDiagonal = opt.allowDiagonal;\n        this.dontCrossCorners = opt.dontCrossCorners;\n        this.diagonalMovement = opt.diagonalMovement;\n        if (!this.diagonalMovement) {\n          if (!this.allowDiagonal) {\n            this.diagonalMovement = DiagonalMovement.Never;\n          } else {\n            if (this.dontCrossCorners) {\n              this.diagonalMovement = DiagonalMovement.OnlyWhenNoObstacles;\n            } else {\n              this.diagonalMovement = DiagonalMovement.IfAtMostOneObstacle;\n            }\n          }\n        }\n      }\n\n      BiBreadthFirstFinder.prototype.findPath = function (startX, startY, endX, endY, grid) {\n        var startNode = grid.getNodeAt(startX, startY),\n          endNode = grid.getNodeAt(endX, endY),\n          startOpenList = [],\n          endOpenList = [],\n          neighbors,\n          neighbor,\n          node,\n          diagonalMovement = this.diagonalMovement,\n          BY_START = 0,\n          BY_END = 1,\n          i,\n          l;\n        startOpenList.push(startNode);\n        startNode.opened = true;\n        startNode.by = BY_START;\n        endOpenList.push(endNode);\n        endNode.opened = true;\n        endNode.by = BY_END;\n        while (startOpenList.length && endOpenList.length) {\n          node = startOpenList.shift();\n          node.closed = true;\n          neighbors = grid.getNeighbors(node, diagonalMovement);\n          for (i = 0, l = neighbors.length; i < l; ++i) {\n            neighbor = neighbors[i];\n            if (neighbor.closed) {\n              continue;\n            }\n            if (neighbor.opened) {\n              if (neighbor.by === BY_END) {\n                return Util.biBacktrace(node, neighbor);\n              }\n              continue;\n            }\n            startOpenList.push(neighbor);\n            neighbor.parent = node;\n            neighbor.opened = true;\n            neighbor.by = BY_START;\n          }\n          node = endOpenList.shift();\n          node.closed = true;\n          neighbors = grid.getNeighbors(node, diagonalMovement);\n          for (i = 0, l = neighbors.length; i < l; ++i) {\n            neighbor = neighbors[i];\n            if (neighbor.closed) {\n              continue;\n            }\n            if (neighbor.opened) {\n              if (neighbor.by === BY_START) {\n                return Util.biBacktrace(neighbor, node);\n              }\n              continue;\n            }\n            endOpenList.push(neighbor);\n            neighbor.parent = node;\n            neighbor.opened = true;\n            neighbor.by = BY_END;\n          }\n        }\n        return [];\n      };\n      module.exports = BiBreadthFirstFinder;\n    },\n    function (module, exports, __webpack_require__) {\n      var BiAStarFinder = __webpack_require__(22);\n\n      function BiBestFirstFinder(opt) {\n        BiAStarFinder.call(this, opt);\n        var orig = this.heuristic;\n        this.heuristic = function (dx, dy) {\n          return orig(dx, dy) * 1e6;\n        };\n      }\n\n      BiBestFirstFinder.prototype = new BiAStarFinder();\n      BiBestFirstFinder.prototype.constructor = BiBestFirstFinder;\n      module.exports = BiBestFirstFinder;\n    },\n    function (module, exports, __webpack_require__) {\n      var AStarFinder = __webpack_require__(23);\n\n      function DijkstraFinder(opt) {\n        AStarFinder.call(this, opt);\n        this.heuristic = function (dx, dy) {\n          return 0;\n        };\n      }\n\n      DijkstraFinder.prototype = new AStarFinder();\n      DijkstraFinder.prototype.constructor = DijkstraFinder;\n      module.exports = DijkstraFinder;\n    },\n    function (module, exports, __webpack_require__) {\n      var Util = __webpack_require__(4);\n      var DiagonalMovement = __webpack_require__(2);\n\n      function BreadthFirstFinder(opt) {\n        opt = opt || {};\n        this.allowDiagonal = opt.allowDiagonal;\n        this.dontCrossCorners = opt.dontCrossCorners;\n        this.diagonalMovement = opt.diagonalMovement;\n        if (!this.diagonalMovement) {\n          if (!this.allowDiagonal) {\n            this.diagonalMovement = DiagonalMovement.Never;\n          } else {\n            if (this.dontCrossCorners) {\n              this.diagonalMovement = DiagonalMovement.OnlyWhenNoObstacles;\n            } else {\n              this.diagonalMovement = DiagonalMovement.IfAtMostOneObstacle;\n            }\n          }\n        }\n      }\n\n      BreadthFirstFinder.prototype.findPath = function (startX, startY, endX, endY, grid) {\n        var openList = [],\n          diagonalMovement = this.diagonalMovement,\n          startNode = grid.getNodeAt(startX, startY),\n          endNode = grid.getNodeAt(endX, endY),\n          neighbors,\n          neighbor,\n          node,\n          i,\n          l;\n        openList.push(startNode);\n        startNode.opened = true;\n        while (openList.length) {\n          node = openList.shift();\n          node.closed = true;\n          if (node === endNode) {\n            return Util.backtrace(endNode);\n          }\n          neighbors = grid.getNeighbors(node, diagonalMovement);\n          for (i = 0, l = neighbors.length; i < l; ++i) {\n            neighbor = neighbors[i];\n            if (neighbor.closed || neighbor.opened) {\n              continue;\n            }\n            openList.push(neighbor);\n            neighbor.opened = true;\n            neighbor.parent = node;\n          }\n        }\n        return [];\n      };\n      module.exports = BreadthFirstFinder;\n    },\n    function (module, exports, __webpack_require__) {\n      var AStarFinder = __webpack_require__(23);\n\n      function BestFirstFinder(opt) {\n        AStarFinder.call(this, opt);\n        var orig = this.heuristic;\n        this.heuristic = function (dx, dy) {\n          return orig(dx, dy) * 1e6;\n        };\n      }\n\n      BestFirstFinder.prototype = new AStarFinder();\n      BestFirstFinder.prototype.constructor = BestFirstFinder;\n      module.exports = BestFirstFinder;\n    },\n    function (module, exports, __webpack_require__) {\n      var Node = __webpack_require__(24);\n      var DiagonalMovement = __webpack_require__(2);\n\n      function Grid(width_or_matrix, height, matrix) {\n        var width;\n        if (typeof width_or_matrix !== 'object') {\n          width = width_or_matrix;\n        } else {\n          height = width_or_matrix.length;\n          width = width_or_matrix[0].length;\n          matrix = width_or_matrix;\n        }\n        this.width = width;\n        this.height = height;\n        this.nodes = this._buildNodes(width, height, matrix);\n      }\n\n      Grid.prototype._buildNodes = function (width, height, matrix) {\n        var i,\n          j,\n          nodes = new Array(height);\n        for (i = 0; i < height; ++i) {\n          nodes[i] = new Array(width);\n          for (j = 0; j < width; ++j) {\n            nodes[i][j] = new Node(j, i);\n          }\n        }\n        if (matrix === undefined) {\n          return nodes;\n        }\n        if (matrix.length !== height || matrix[0].length !== width) {\n          throw new Error('Matrix size does not fit');\n        }\n        for (i = 0; i < height; ++i) {\n          for (j = 0; j < width; ++j) {\n            if (matrix[i][j]) {\n              nodes[i][j].walkable = false;\n            }\n          }\n        }\n        return nodes;\n      };\n      Grid.prototype.getNodeAt = function (x, y) {\n        return this.nodes[y][x];\n      };\n      Grid.prototype.isWalkableAt = function (x, y) {\n        return this.isInside(x, y) && this.nodes[y][x].walkable;\n      };\n      Grid.prototype.isInside = function (x, y) {\n        return x >= 0 && x < this.width && y >= 0 && y < this.height;\n      };\n      Grid.prototype.setWalkableAt = function (x, y, walkable) {\n        this.nodes[y][x].walkable = walkable;\n      };\n      Grid.prototype.getNeighbors = function (node, diagonalMovement) {\n        var x = node.x,\n          y = node.y,\n          neighbors = [],\n          s0 = false,\n          d0 = false,\n          s1 = false,\n          d1 = false,\n          s2 = false,\n          d2 = false,\n          s3 = false,\n          d3 = false,\n          nodes = this.nodes;\n        if (this.isWalkableAt(x, y - 1)) {\n          neighbors.push(nodes[y - 1][x]);\n          s0 = true;\n        }\n        if (this.isWalkableAt(x + 1, y)) {\n          neighbors.push(nodes[y][x + 1]);\n          s1 = true;\n        }\n        if (this.isWalkableAt(x, y + 1)) {\n          neighbors.push(nodes[y + 1][x]);\n          s2 = true;\n        }\n        if (this.isWalkableAt(x - 1, y)) {\n          neighbors.push(nodes[y][x - 1]);\n          s3 = true;\n        }\n        if (diagonalMovement === DiagonalMovement.Never) {\n          return neighbors;\n        }\n        if (diagonalMovement === DiagonalMovement.OnlyWhenNoObstacles) {\n          d0 = s3 && s0;\n          d1 = s0 && s1;\n          d2 = s1 && s2;\n          d3 = s2 && s3;\n        } else if (diagonalMovement === DiagonalMovement.IfAtMostOneObstacle) {\n          d0 = s3 || s0;\n          d1 = s0 || s1;\n          d2 = s1 || s2;\n          d3 = s2 || s3;\n        } else if (diagonalMovement === DiagonalMovement.Always) {\n          d0 = true;\n          d1 = true;\n          d2 = true;\n          d3 = true;\n        } else {\n          throw new Error('Incorrect value of diagonalMovement');\n        }\n        if (d0 && this.isWalkableAt(x - 1, y - 1)) {\n          neighbors.push(nodes[y - 1][x - 1]);\n        }\n        if (d1 && this.isWalkableAt(x + 1, y - 1)) {\n          neighbors.push(nodes[y - 1][x + 1]);\n        }\n        if (d2 && this.isWalkableAt(x + 1, y + 1)) {\n          neighbors.push(nodes[y + 1][x + 1]);\n        }\n        if (d3 && this.isWalkableAt(x - 1, y + 1)) {\n          neighbors.push(nodes[y + 1][x - 1]);\n        }\n        return neighbors;\n      };\n      Grid.prototype.clone = function () {\n        var i,\n          j,\n          width = this.width,\n          height = this.height,\n          thisNodes = this.nodes,\n          newGrid = new Grid(width, height),\n          newNodes = new Array(height);\n        for (i = 0; i < height; ++i) {\n          newNodes[i] = new Array(width);\n          for (j = 0; j < width; ++j) {\n            newNodes[i][j] = new Node(j, i, thisNodes[i][j].walkable);\n          }\n        }\n        newGrid.nodes = newNodes;\n        return newGrid;\n      };\n      module.exports = Grid;\n    },\n    function (module, exports) {\n      module.exports = function (module) {\n        if (!module.webpackPolyfill) {\n          module.deprecate = function () {};\n          module.paths = [];\n          if (!module.children) module.children = [];\n          Object.defineProperty(module, 'loaded', {\n            enumerable: true,\n            get: function () {\n              return module.l;\n            },\n          });\n          Object.defineProperty(module, 'id', {\n            enumerable: true,\n            get: function () {\n              return module.i;\n            },\n          });\n          module.webpackPolyfill = 1;\n        }\n        return module;\n      };\n    },\n    function (module, exports, __webpack_require__) {\n      (function (module) {\n        (function () {\n          var Heap, defaultCmp, floor, heapify, heappop, heappush, heappushpop, heapreplace, insort, min, nlargest, nsmallest, updateItem, _siftdown, _siftup;\n          (floor = Math.floor), (min = Math.min);\n          defaultCmp = function (x, y) {\n            if (x < y) {\n              return -1;\n            }\n            if (x > y) {\n              return 1;\n            }\n            return 0;\n          };\n          insort = function (a, x, lo, hi, cmp) {\n            var mid;\n            if (lo == null) {\n              lo = 0;\n            }\n            if (cmp == null) {\n              cmp = defaultCmp;\n            }\n            if (lo < 0) {\n              throw new Error('lo must be non-negative');\n            }\n            if (hi == null) {\n              hi = a.length;\n            }\n            while (lo < hi) {\n              mid = floor((lo + hi) / 2);\n              if (cmp(x, a[mid]) < 0) {\n                hi = mid;\n              } else {\n                lo = mid + 1;\n              }\n            }\n            return [].splice.apply(a, [lo, lo - lo].concat(x)), x;\n          };\n          heappush = function (array, item, cmp) {\n            if (cmp == null) {\n              cmp = defaultCmp;\n            }\n            array.push(item);\n            return _siftdown(array, 0, array.length - 1, cmp);\n          };\n          heappop = function (array, cmp) {\n            var lastelt, returnitem;\n            if (cmp == null) {\n              cmp = defaultCmp;\n            }\n            lastelt = array.pop();\n            if (array.length) {\n              returnitem = array[0];\n              array[0] = lastelt;\n              _siftup(array, 0, cmp);\n            } else {\n              returnitem = lastelt;\n            }\n            return returnitem;\n          };\n          heapreplace = function (array, item, cmp) {\n            var returnitem;\n            if (cmp == null) {\n              cmp = defaultCmp;\n            }\n            returnitem = array[0];\n            array[0] = item;\n            _siftup(array, 0, cmp);\n            return returnitem;\n          };\n          heappushpop = function (array, item, cmp) {\n            var _ref;\n            if (cmp == null) {\n              cmp = defaultCmp;\n            }\n            if (array.length && cmp(array[0], item) < 0) {\n              (_ref = [array[0], item]), (item = _ref[0]), (array[0] = _ref[1]);\n              _siftup(array, 0, cmp);\n            }\n            return item;\n          };\n          heapify = function (array, cmp) {\n            var i, _i, _j, _len, _ref, _ref1, _results, _results1;\n            if (cmp == null) {\n              cmp = defaultCmp;\n            }\n            _ref1 = function () {\n              _results1 = [];\n              for (var _j = 0, _ref = floor(array.length / 2); 0 <= _ref ? _j < _ref : _j > _ref; 0 <= _ref ? _j++ : _j--) {\n                _results1.push(_j);\n              }\n              return _results1;\n            }\n              .apply(this)\n              .reverse();\n            _results = [];\n            for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n              i = _ref1[_i];\n              _results.push(_siftup(array, i, cmp));\n            }\n            return _results;\n          };\n          updateItem = function (array, item, cmp) {\n            var pos;\n            if (cmp == null) {\n              cmp = defaultCmp;\n            }\n            pos = array.indexOf(item);\n            if (pos === -1) {\n              return;\n            }\n            _siftdown(array, 0, pos, cmp);\n            return _siftup(array, pos, cmp);\n          };\n          nlargest = function (array, n, cmp) {\n            var elem, result, _i, _len, _ref;\n            if (cmp == null) {\n              cmp = defaultCmp;\n            }\n            result = array.slice(0, n);\n            if (!result.length) {\n              return result;\n            }\n            heapify(result, cmp);\n            _ref = array.slice(n);\n            for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n              elem = _ref[_i];\n              heappushpop(result, elem, cmp);\n            }\n            return result.sort(cmp).reverse();\n          };\n          nsmallest = function (array, n, cmp) {\n            var elem, i, los, result, _i, _j, _len, _ref, _ref1, _results;\n            if (cmp == null) {\n              cmp = defaultCmp;\n            }\n            if (n * 10 <= array.length) {\n              result = array.slice(0, n).sort(cmp);\n              if (!result.length) {\n                return result;\n              }\n              los = result[result.length - 1];\n              _ref = array.slice(n);\n              for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n                elem = _ref[_i];\n                if (cmp(elem, los) < 0) {\n                  insort(result, elem, 0, null, cmp);\n                  result.pop();\n                  los = result[result.length - 1];\n                }\n              }\n              return result;\n            }\n            heapify(array, cmp);\n            _results = [];\n            for (i = _j = 0, _ref1 = min(n, array.length); 0 <= _ref1 ? _j < _ref1 : _j > _ref1; i = 0 <= _ref1 ? ++_j : --_j) {\n              _results.push(heappop(array, cmp));\n            }\n            return _results;\n          };\n          _siftdown = function (array, startpos, pos, cmp) {\n            var newitem, parent, parentpos;\n            if (cmp == null) {\n              cmp = defaultCmp;\n            }\n            newitem = array[pos];\n            while (pos > startpos) {\n              parentpos = (pos - 1) >> 1;\n              parent = array[parentpos];\n              if (cmp(newitem, parent) < 0) {\n                array[pos] = parent;\n                pos = parentpos;\n                continue;\n              }\n              break;\n            }\n            return (array[pos] = newitem);\n          };\n          _siftup = function (array, pos, cmp) {\n            var childpos, endpos, newitem, rightpos, startpos;\n            if (cmp == null) {\n              cmp = defaultCmp;\n            }\n            endpos = array.length;\n            startpos = pos;\n            newitem = array[pos];\n            childpos = 2 * pos + 1;\n            while (childpos < endpos) {\n              rightpos = childpos + 1;\n              if (rightpos < endpos && !(cmp(array[childpos], array[rightpos]) < 0)) {\n                childpos = rightpos;\n              }\n              array[pos] = array[childpos];\n              pos = childpos;\n              childpos = 2 * pos + 1;\n            }\n            array[pos] = newitem;\n            return _siftdown(array, startpos, pos, cmp);\n          };\n          Heap = (function () {\n            Heap.push = heappush;\n            Heap.pop = heappop;\n            Heap.replace = heapreplace;\n            Heap.pushpop = heappushpop;\n            Heap.heapify = heapify;\n            Heap.updateItem = updateItem;\n            Heap.nlargest = nlargest;\n            Heap.nsmallest = nsmallest;\n\n            function Heap(cmp) {\n              this.cmp = cmp != null ? cmp : defaultCmp;\n              this.nodes = [];\n            }\n\n            Heap.prototype.push = function (x) {\n              return heappush(this.nodes, x, this.cmp);\n            };\n            Heap.prototype.pop = function () {\n              return heappop(this.nodes, this.cmp);\n            };\n            Heap.prototype.peek = function () {\n              return this.nodes[0];\n            };\n            Heap.prototype.contains = function (x) {\n              return this.nodes.indexOf(x) !== -1;\n            };\n            Heap.prototype.replace = function (x) {\n              return heapreplace(this.nodes, x, this.cmp);\n            };\n            Heap.prototype.pushpop = function (x) {\n              return heappushpop(this.nodes, x, this.cmp);\n            };\n            Heap.prototype.heapify = function () {\n              return heapify(this.nodes, this.cmp);\n            };\n            Heap.prototype.updateItem = function (x) {\n              return updateItem(this.nodes, x, this.cmp);\n            };\n            Heap.prototype.clear = function () {\n              return (this.nodes = []);\n            };\n            Heap.prototype.empty = function () {\n              return this.nodes.length === 0;\n            };\n            Heap.prototype.size = function () {\n              return this.nodes.length;\n            };\n            Heap.prototype.clone = function () {\n              var heap;\n              heap = new Heap();\n              heap.nodes = this.nodes.slice(0);\n              return heap;\n            };\n            Heap.prototype.toArray = function () {\n              return this.nodes.slice(0);\n            };\n            Heap.prototype.insert = Heap.prototype.push;\n            Heap.prototype.top = Heap.prototype.peek;\n            Heap.prototype.front = Heap.prototype.peek;\n            Heap.prototype.has = Heap.prototype.contains;\n            Heap.prototype.copy = Heap.prototype.clone;\n            return Heap;\n          })();\n          if (typeof module !== 'undefined' && module !== null ? module.exports : void 0) {\n            module.exports = Heap;\n          } else {\n            window.Heap = Heap;\n          }\n        }.call(this));\n      }.call(this, __webpack_require__(65)(module)));\n    },\n    function (module, exports, __webpack_require__) {\n      module.exports = {\n        Heap: __webpack_require__(15),\n        Node: __webpack_require__(24),\n        Grid: __webpack_require__(64),\n        Util: __webpack_require__(4),\n        DiagonalMovement: __webpack_require__(2),\n        Heuristic: __webpack_require__(10),\n        AStarFinder: __webpack_require__(23),\n        BestFirstFinder: __webpack_require__(63),\n        BreadthFirstFinder: __webpack_require__(62),\n        DijkstraFinder: __webpack_require__(61),\n        BiAStarFinder: __webpack_require__(22),\n        BiBestFirstFinder: __webpack_require__(60),\n        BiBreadthFirstFinder: __webpack_require__(59),\n        BiDijkstraFinder: __webpack_require__(58),\n        IDAStarFinder: __webpack_require__(57),\n        JumpPointFinder: __webpack_require__(56),\n      };\n    },\n    function (module, exports, __webpack_require__) {\n      module.exports = __webpack_require__(67);\n    },\n    function (module, exports) {\n      var proto = Element.prototype;\n      var vendor = proto.matchesSelector || proto.webkitMatchesSelector || proto.mozMatchesSelector || proto.msMatchesSelector || proto.oMatchesSelector;\n      module.exports = match;\n\n      function match(el, selector) {\n        if (vendor) return vendor.call(el, selector);\n        var nodes = el.parentNode.querySelectorAll(selector);\n        for (var i = 0; i < nodes.length; ++i) {\n          if (nodes[i] == el) return true;\n        }\n        return false;\n      }\n    },\n    function (module, exports, __webpack_require__) {\n      var matches = __webpack_require__(69);\n      module.exports = function (element, selector, checkYoSelf) {\n        var parent = checkYoSelf ? element : element.parentNode;\n        while (parent && parent !== document) {\n          if (matches(parent, selector)) return parent;\n          parent = parent.parentNode;\n        }\n      };\n    },\n  ]);\n});\n//# sourceMappingURL=storm-react-diagrams.js.map\n"
  },
  {
    "path": "admin/src/utils/trChart.js",
    "content": "\nimport _ from 'lodash';\nimport  { \n  DiagramEngine, \n  DiagramModel, \n  DefaultNodeModel,\n  DefaultNodeFactory, \n  DefaultLinkFactory, \n  DefaultPortFactory, \n  DefaultLabelFactory \n} from './storm-react-diagrams';\n\nexport function drawDatabaseNodes(data, options) {\n  const engine = new DiagramEngine();\n\n  // engine.installDefaultFactories();\n  engine.registerNodeFactory(new DefaultNodeFactory());\n  engine.registerLinkFactory(new DefaultLinkFactory());\n  engine.registerPortFactory(new DefaultPortFactory());\n  engine.registerLabelFactory(new DefaultLabelFactory());\n  \n  const model = new DiagramModel();\n  const nodes = [],\n    nodesMap = {},\n    links = [];\n\n  const uidToName = (uid) => data?.find(d => d.key === uid)?.name;\n  const nameTouid = (name) => data?.find(d => d.name === name)?.key;\n\n  // build nodes and ports\n  for (const index in data) {\n    const model = data[index];\n    const color = model.name.endsWith('_components') ? '#ff6400' : model.name.startsWith('components_') ? '#ffc800' : 'rgb(0,126,255)'\n    const node = new DefaultNodeModel(model.name, color);\n    const ports = {};\n    const attributes = Object.keys(model.attributes)\n\n    // ports.id = node.addInPort('id')\n\n    for (const attr of attributes) {\n      const fieldData = model.attributes[attr];\n      const relation = fieldData.type === 'relation';\n      \n      if (relation) {\n        ports[attr] = node.addOutPort(`*${attr}`);\n      } else {\n        //if scalar field\n        ports[attr] = node.addInPort(attr);\n      }\n    }\n    \n    node.setPosition(0, 0);\n    nodes.push(node);\n    nodesMap[model.name] = { node, ports };\n  }\n\n  // extract joinTable nodes\n  // for (const index in data) {\n  //   const model = data[index];\n  //   const attributes = Object.keys(model.attributes)\n  //   for (const attr of attributes) {\n  //     const fieldData = model.attributes[attr];\n  //     const relation = fieldData.type === 'relation';\n  //     const joinTable = fieldData.joinTable;\n  //     if (relation && joinTable) {\n  //       const {\n  //         joinColumn,\n  //         inverseJoinColumn,\n  //         name,\n  //         on,\n  //         orderBy,\n  //       } = joinTable\n\n  //       if (!joinColumn) {\n  //         console.log('joinColumn missing', joinTable);\n  //         continue\n  //       }\n\n  //       if (nodesMap[name]) {\n  //         console.log('joinTable already exists', name, joinTable);\n  //         continue\n  //       }\n  //       console.log('CREATE already exists', name, joinTable);\n\n  //       const node = new DefaultNodeModel(name, name.endsWith('_components') ? 'rgb(85, 171, 0)' : 'rgb(0,0,255)');\n  //       const ports = {};\n\n  //       ports[joinColumn.name] = node.addInPort(joinColumn.name);\n\n  //       if (inverseJoinColumn) {\n  //         ports[inverseJoinColumn.name] = node.addInPort(inverseJoinColumn.name);\n  //       }\n\n        \n  //       node.setPosition(0, 0);\n  //       nodes.push(node);\n  //       nodesMap[name] = { node, ports };\n  //     }\n  //   }\n  // }\n\n  // build links\n  for (const index in data) {\n    const model = data[index];\n    const { ports } = nodesMap[model.name]\n    const foreignKeys = model.foreignKeys ?? []\n    const attributes = Object.keys(model.attributes)\n\n    // for (const keys of foreignKeys) {\n    //   const reference = nodesMap[keys.referencedTable]\n      \n    //   if (!reference) {\n    //     continue;\n    //   }\n    //   const outPort = reference.ports[keys.referencedColumns[0]]\n    //   const inPort = ports[keys.columns[0]]\n\n    //   const link = inPort.link(outPort);\n    //   link.setColor('#999');\n    //   links.push(link);\n    // }\n\n\n    for (const attr of attributes) {\n      const fieldData = model.attributes[attr];\n      const relation = fieldData.type === 'relation';\n      const joinTable = fieldData.joinTable;\n      if (relation && !joinTable) {\n        // indexes\n        const referencedTable = uidToName(fieldData.target)\n        const reference = nodesMap[referencedTable]\n        \n        if (!reference) {\n          continue;\n        }\n        const outPort = ports[attr]\n        const inPort = reference.ports.id\n\n        const link = outPort.link(inPort);\n        link.setColor('#00FF00');\n        links.push(link);\n      } else if (relation && joinTable) {\n        const {\n          joinColumn,\n          inverseJoinColumn,\n          name,\n          on,\n          orderBy,\n        } = joinTable\n\n        if (!joinColumn) {\n          continue;\n        }\n        if (!inverseJoinColumn) {\n          // todo: morph\n          //console.log('inverseJoinColumn missing', joinTable);\n          continue;\n        }\n        \n        const reference = nodesMap[name]\n        if (!reference) {\n          continue;\n        }\n\n\n        if (!on) {\n        //   // const outPort = reference.ports.id\n        //   const inPort = ports.id\n        //   const outPort = reference.ports[inverseJoinColumn.name]\n        //   const link = outPort.link(inPort);\n        //   console.log('.......', reference.ports[joinColumn.name])\n        //   link.setColor('#FF0000');\n        //   links.push(link);\n          continue\n        }\n\n\n        console.log({mn: model.name,attr, name, fieldData, on, joinColumn, inverseJoinColumn, reference});\n        const outPort = ports[attr]\n        const inPort = reference.ports.id\n        const link = outPort.link(inPort);\n        link.setColor('#FF00FF');\n        links.push(link);\n\n        \n        // const referencedTable = uidToName(fieldData.target)\n        // const reference = nodesMap[uidToName(fieldData.target)]\n\n        const out2Port = reference.ports[inverseJoinColumn.name]\n        const in2Port = nodesMap[uidToName(fieldData.target)]?.ports.id\n        out2Port.in = false\n        in2Port.in = true\n        console.log({outPort, out2Port, inPort, in2Port});\n        const link2 = out2Port.link(in2Port);\n        link2.setColor('#00FFFF');\n        links.push(link2);\n        // const inPort = ports[on.target]\n        // if (!inPort) {\n        //   console.log('joinColumn missing44', joinTable);\n        //   continue\n        // }\n        // const link = outPort.link(inPort);\n        // console.log({attr, name, fieldData, on, inverseJoinColumn, reference, inPort, outPort});\n        // link.setColor('#0000FF');\n        // links.push(link);\n          \n        // const outPort = reference.ports.id\n        // const inPort = ports[attr]\n        // if (on) {\n        //   console.log('on?', model.name, on);\n        // }\n        // if (inverseJoinColumn) {\n        //   const outPort = ports[inverseJoinColumn.name];\n        // }\n        // console.log(joinTable)\n      }\n    }\n  }\n\n  model.addAll(...nodes, ...links);\n  engine.setDiagramModel(model);\n  return { engine, model };\n}"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"strapi-plugin-entity-relationship-chart\",\n  \"version\": \"4.14.6\",\n  \"description\": \"Plugin displays Entity Relationship Diagram of all Strapi models, fields and relations.\",\n  \"strapi\": {\n    \"displayName\": \"ER Chart\",\n    \"name\": \"entity-relationship-chart\",\n    \"description\": \"Plugin displays Entity Relationship Diagram of all Strapi models, fields and relations.\",\n    \"kind\": \"plugin\"\n  },\n  \"dependencies\": {\n    \"@dagrejs/dagre\": \"^1.0.4\",\n    \"@strapi/design-system\": \"^1.6.3\",\n    \"@strapi/helper-plugin\": \"^4.6.0\",\n    \"@strapi/icons\": \"^1.6.3\",\n    \"lodash\": \"^4.17.21\",\n    \"prop-types\": \"^15.7.2\"\n  },\n  \"devDependencies\": {\n    \"date-fns\": \"^2.28.0\",\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\",\n    \"react-router-dom\": \"^5.3.4\",\n    \"styled-components\": \"^5.3.6\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^17.0.0 || ^18.0.0\",\n    \"react-dom\": \"^17.0.0 || ^18.0.0\",\n    \"react-router-dom\": \"^5.3.4\"\n  },\n  \"author\": {\n    \"name\": \"Roman Mandryk\",\n    \"email\": \"info@nodevision.com.au\",\n    \"url\": \"https://nodevision.com.au\"\n  },\n  \"maintainers\": [\n    {\n      \"name\": \"Roman Mandryk\",\n      \"email\": \"\",\n      \"url\": \"\"\n    }\n  ],\n  \"engines\": {\n    \"node\": \">=16 <=20\",\n    \"npm\": \">=6.0.0\"\n  },\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "server/config/index.js",
    "content": "'use strict';\n\nmodule.exports = {\n  default: {\n    exclude: [\n      // \"strapi::core-store\",\n      // \"webhook\",\n      // \"admin::permission\",\n      // \"admin::user\",\n      // \"admin::role\",\n      // \"admin::api-token\",\n      // \"plugin::upload.file\",\n      // \"plugin::users-permissions.permission\",\n      // \"plugin::users-permissions.role\",\n    ]\n  },\n  validator() {},\n};\n"
  },
  {
    "path": "server/controllers/entity-relationship-chart.js",
    "content": "\"use strict\";\n\n/**\n * entity-relationship-chart.js controller\n *\n * @description: A set of functions called \"actions\" of the `entity-relationship-chart` plugin.\n */\n\nmodule.exports = {\n  getTablesRelationData: async (ctx) => {\n    const exclude = strapi.config.get('plugin.entity-relationship-chart.exclude')\n    const uids = Array.from(strapi.db.metadata.keys()).filter(uid => !exclude.includes(uid))\n\n    return uids.map(uid => {\n      const model = strapi.db.metadata.get(uid)\n\n      return {\n        key: model.uid,\n        name: model.tableName,\n        attributes: model.attributes,\n        componentLink: model.componentLink,\n        indexes: model.indexes,\n        foreignKeys: model.foreignKeys,\n        columnToAttribute: model.columnToAttribute,\n      }\n    })\n  },\n  getEntitiesRelationData: async (ctx) => {\n    const { models } = strapi.db.config;\n    const exclude = strapi.config.get('plugin.entity-relationship-chart.exclude')\n\n    return models.filter(model => !exclude.includes(model.uid)).map((m) => ({\n      name: m.tableName,\n      attributes: m.attributes,\n      key: m.uid,\n      modelType: m.modelType,\n      kind: m.kind,\n    }));\n  },\n};\n"
  },
  {
    "path": "server/controllers/index.js",
    "content": "'use strict';\n\nconst erc = require('./entity-relationship-chart');\n\nmodule.exports = {\n  'entity-relationship-chart': erc,\n};\n"
  },
  {
    "path": "server/index.js",
    "content": "'use strict';\n\nconst config = require('./config');\nconst controllers = require('./controllers');\nconst routes = require('./routes');\n\nmodule.exports = {\n  config,\n  controllers,\n  routes,\n};\n"
  },
  {
    "path": "server/routes/index.js",
    "content": "module.exports = [\n  {\n    method: 'GET',\n    path: '/er-data',\n    handler: 'entity-relationship-chart.getEntitiesRelationData',\n    config: {\n      policies: [],\n    },\n  },\n  {\n    method: 'GET',\n    path: '/tr-data',\n    handler: 'entity-relationship-chart.getTablesRelationData',\n    config: {\n      policies: [],\n    },\n  },\n];\n"
  },
  {
    "path": "server/routes/routes.json",
    "content": "{\n  \"routes\": [\n    {\n      \"method\": \"GET\",\n      \"path\": \"/er-data\",\n      \"handler\": \"entity-relationship-chart.getERData\",\n      \"config\": {\n        \"policies\": []\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "strapi-admin.js",
    "content": "'use strict';\n\nmodule.exports = require('./admin/src').default;\n"
  },
  {
    "path": "strapi-server.js",
    "content": "'use strict';\n\nmodule.exports = require('./server');\n"
  }
]